evennia/docs/1.0-dev/_modules/evennia/commands/default/building.html
2020-11-14 11:55:52 +01:00

3913 lines
No EOL
522 KiB
HTML

<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>evennia.commands.default.building &#8212; Evennia 1.0-dev 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="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 1.0-dev</a> &#187;</li>
<li class="nav-item nav-item-1"><a href="../../../index.html" >Module code</a> &#187;</li>
<li class="nav-item nav-item-2"><a href="../../../evennia.html" accesskey="U">evennia</a> &#187;</li>
<li class="nav-item nav-item-this"><a href="">evennia.commands.default.building</a></li>
</ul>
<div class="develop">develop branch</div>
</div>
<div class="document">
<div class="documentwrapper">
<div class="bodywrapper">
<div class="body" role="main">
<h1>Source code for evennia.commands.default.building</h1><div class="highlight"><pre>
<span></span><span class="sd">&quot;&quot;&quot;</span>
<span class="sd">Building and world design commands</span>
<span class="sd">&quot;&quot;&quot;</span>
<span class="kn">import</span> <span class="nn">re</span>
<span class="kn">from</span> <span class="nn">django.conf</span> <span class="k">import</span> <span class="n">settings</span>
<span class="kn">from</span> <span class="nn">django.db.models</span> <span class="k">import</span> <span class="n">Q</span><span class="p">,</span> <span class="n">Min</span><span class="p">,</span> <span class="n">Max</span>
<span class="kn">from</span> <span class="nn">evennia.objects.models</span> <span class="k">import</span> <span class="n">ObjectDB</span>
<span class="kn">from</span> <span class="nn">evennia.locks.lockhandler</span> <span class="k">import</span> <span class="n">LockException</span>
<span class="kn">from</span> <span class="nn">evennia.commands.cmdhandler</span> <span class="k">import</span> <span class="n">get_and_merge_cmdsets</span>
<span class="kn">from</span> <span class="nn">evennia.utils</span> <span class="k">import</span> <span class="n">create</span><span class="p">,</span> <span class="n">utils</span><span class="p">,</span> <span class="n">search</span><span class="p">,</span> <span class="n">logger</span>
<span class="kn">from</span> <span class="nn">evennia.utils.utils</span> <span class="k">import</span> <span class="p">(</span>
<span class="n">inherits_from</span><span class="p">,</span>
<span class="n">class_from_module</span><span class="p">,</span>
<span class="n">get_all_typeclasses</span><span class="p">,</span>
<span class="n">variable_from_module</span><span class="p">,</span>
<span class="n">dbref</span><span class="p">,</span>
<span class="n">interactive</span><span class="p">,</span>
<span class="n">list_to_string</span><span class="p">,</span>
<span class="n">display_len</span><span class="p">,</span>
<span class="p">)</span>
<span class="kn">from</span> <span class="nn">evennia.utils.eveditor</span> <span class="k">import</span> <span class="n">EvEditor</span>
<span class="kn">from</span> <span class="nn">evennia.utils.evmore</span> <span class="k">import</span> <span class="n">EvMore</span>
<span class="kn">from</span> <span class="nn">evennia.prototypes</span> <span class="k">import</span> <span class="n">spawner</span><span class="p">,</span> <span class="n">prototypes</span> <span class="k">as</span> <span class="n">protlib</span><span class="p">,</span> <span class="n">menus</span> <span class="k">as</span> <span class="n">olc_menus</span>
<span class="kn">from</span> <span class="nn">evennia.utils.ansi</span> <span class="k">import</span> <span class="n">raw</span> <span class="k">as</span> <span class="n">ansi_raw</span>
<span class="kn">from</span> <span class="nn">evennia.utils.inlinefuncs</span> <span class="k">import</span> <span class="n">raw</span> <span class="k">as</span> <span class="n">inlinefunc_raw</span>
<span class="n">COMMAND_DEFAULT_CLASS</span> <span class="o">=</span> <span class="n">class_from_module</span><span class="p">(</span><span class="n">settings</span><span class="o">.</span><span class="n">COMMAND_DEFAULT_CLASS</span><span class="p">)</span>
<span class="c1"># limit symbol import for API</span>
<span class="n">__all__</span> <span class="o">=</span> <span class="p">(</span>
<span class="s2">&quot;ObjManipCommand&quot;</span><span class="p">,</span>
<span class="s2">&quot;CmdSetObjAlias&quot;</span><span class="p">,</span>
<span class="s2">&quot;CmdCopy&quot;</span><span class="p">,</span>
<span class="s2">&quot;CmdCpAttr&quot;</span><span class="p">,</span>
<span class="s2">&quot;CmdMvAttr&quot;</span><span class="p">,</span>
<span class="s2">&quot;CmdCreate&quot;</span><span class="p">,</span>
<span class="s2">&quot;CmdDesc&quot;</span><span class="p">,</span>
<span class="s2">&quot;CmdDestroy&quot;</span><span class="p">,</span>
<span class="s2">&quot;CmdDig&quot;</span><span class="p">,</span>
<span class="s2">&quot;CmdTunnel&quot;</span><span class="p">,</span>
<span class="s2">&quot;CmdLink&quot;</span><span class="p">,</span>
<span class="s2">&quot;CmdUnLink&quot;</span><span class="p">,</span>
<span class="s2">&quot;CmdSetHome&quot;</span><span class="p">,</span>
<span class="s2">&quot;CmdListCmdSets&quot;</span><span class="p">,</span>
<span class="s2">&quot;CmdName&quot;</span><span class="p">,</span>
<span class="s2">&quot;CmdOpen&quot;</span><span class="p">,</span>
<span class="s2">&quot;CmdSetAttribute&quot;</span><span class="p">,</span>
<span class="s2">&quot;CmdTypeclass&quot;</span><span class="p">,</span>
<span class="s2">&quot;CmdWipe&quot;</span><span class="p">,</span>
<span class="s2">&quot;CmdLock&quot;</span><span class="p">,</span>
<span class="s2">&quot;CmdExamine&quot;</span><span class="p">,</span>
<span class="s2">&quot;CmdFind&quot;</span><span class="p">,</span>
<span class="s2">&quot;CmdTeleport&quot;</span><span class="p">,</span>
<span class="s2">&quot;CmdScript&quot;</span><span class="p">,</span>
<span class="s2">&quot;CmdTag&quot;</span><span class="p">,</span>
<span class="s2">&quot;CmdSpawn&quot;</span><span class="p">,</span>
<span class="p">)</span>
<span class="c1"># used by set</span>
<span class="kn">from</span> <span class="nn">ast</span> <span class="k">import</span> <span class="n">literal_eval</span> <span class="k">as</span> <span class="n">_LITERAL_EVAL</span>
<span class="n">LIST_APPEND_CHAR</span> <span class="o">=</span> <span class="s2">&quot;+&quot;</span>
<span class="c1"># used by find</span>
<span class="n">CHAR_TYPECLASS</span> <span class="o">=</span> <span class="n">settings</span><span class="o">.</span><span class="n">BASE_CHARACTER_TYPECLASS</span>
<span class="n">ROOM_TYPECLASS</span> <span class="o">=</span> <span class="n">settings</span><span class="o">.</span><span class="n">BASE_ROOM_TYPECLASS</span>
<span class="n">EXIT_TYPECLASS</span> <span class="o">=</span> <span class="n">settings</span><span class="o">.</span><span class="n">BASE_EXIT_TYPECLASS</span>
<span class="n">_DEFAULT_WIDTH</span> <span class="o">=</span> <span class="n">settings</span><span class="o">.</span><span class="n">CLIENT_DEFAULT_WIDTH</span>
<span class="n">_PROTOTYPE_PARENTS</span> <span class="o">=</span> <span class="kc">None</span>
<div class="viewcode-block" id="ObjManipCommand"><a class="viewcode-back" href="../../../../api/evennia.commands.default.building.html#evennia.commands.default.building.ObjManipCommand">[docs]</a><span class="k">class</span> <span class="nc">ObjManipCommand</span><span class="p">(</span><span class="n">COMMAND_DEFAULT_CLASS</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> This is a parent class for some of the defining objmanip commands</span>
<span class="sd"> since they tend to have some more variables to define new objects.</span>
<span class="sd"> Each object definition can have several components. First is</span>
<span class="sd"> always a name, followed by an optional alias list and finally an</span>
<span class="sd"> some optional data, such as a typeclass or a location. A comma &#39;,&#39;</span>
<span class="sd"> separates different objects. Like this:</span>
<span class="sd"> name1;alias;alias;alias:option, name2;alias;alias ...</span>
<span class="sd"> Spaces between all components are stripped.</span>
<span class="sd"> A second situation is attribute manipulation. Such commands</span>
<span class="sd"> are simpler and offer combinations</span>
<span class="sd"> objname/attr/attr/attr, objname/attr, ...</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="c1"># OBS - this is just a parent - it&#39;s not intended to actually be</span>
<span class="c1"># included in a commandset on its own!</span>
<div class="viewcode-block" id="ObjManipCommand.parse"><a class="viewcode-back" href="../../../../api/evennia.commands.default.building.html#evennia.commands.default.building.ObjManipCommand.parse">[docs]</a> <span class="k">def</span> <span class="nf">parse</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> We need to expand the default parsing to get all</span>
<span class="sd"> the cases, see the module doc.</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="c1"># get all the normal parsing done (switches etc)</span>
<span class="nb">super</span><span class="p">()</span><span class="o">.</span><span class="n">parse</span><span class="p">()</span>
<span class="n">obj_defs</span> <span class="o">=</span> <span class="p">([],</span> <span class="p">[])</span> <span class="c1"># stores left- and right-hand side of &#39;=&#39;</span>
<span class="n">obj_attrs</span> <span class="o">=</span> <span class="p">([],</span> <span class="p">[])</span> <span class="c1"># &quot;</span>
<span class="k">for</span> <span class="n">iside</span><span class="p">,</span> <span class="n">arglist</span> <span class="ow">in</span> <span class="nb">enumerate</span><span class="p">((</span><span class="bp">self</span><span class="o">.</span><span class="n">lhslist</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">rhslist</span><span class="p">)):</span>
<span class="c1"># lhslist/rhslist is already split by &#39;,&#39; at this point</span>
<span class="k">for</span> <span class="n">objdef</span> <span class="ow">in</span> <span class="n">arglist</span><span class="p">:</span>
<span class="n">aliases</span><span class="p">,</span> <span class="n">option</span><span class="p">,</span> <span class="n">attrs</span> <span class="o">=</span> <span class="p">[],</span> <span class="kc">None</span><span class="p">,</span> <span class="p">[]</span>
<span class="k">if</span> <span class="s2">&quot;:&quot;</span> <span class="ow">in</span> <span class="n">objdef</span><span class="p">:</span>
<span class="n">objdef</span><span class="p">,</span> <span class="n">option</span> <span class="o">=</span> <span class="p">[</span><span class="n">part</span><span class="o">.</span><span class="n">strip</span><span class="p">()</span> <span class="k">for</span> <span class="n">part</span> <span class="ow">in</span> <span class="n">objdef</span><span class="o">.</span><span class="n">rsplit</span><span class="p">(</span><span class="s2">&quot;:&quot;</span><span class="p">,</span> <span class="mi">1</span><span class="p">)]</span>
<span class="k">if</span> <span class="s2">&quot;;&quot;</span> <span class="ow">in</span> <span class="n">objdef</span><span class="p">:</span>
<span class="n">objdef</span><span class="p">,</span> <span class="n">aliases</span> <span class="o">=</span> <span class="p">[</span><span class="n">part</span><span class="o">.</span><span class="n">strip</span><span class="p">()</span> <span class="k">for</span> <span class="n">part</span> <span class="ow">in</span> <span class="n">objdef</span><span class="o">.</span><span class="n">split</span><span class="p">(</span><span class="s2">&quot;;&quot;</span><span class="p">,</span> <span class="mi">1</span><span class="p">)]</span>
<span class="n">aliases</span> <span class="o">=</span> <span class="p">[</span><span class="n">alias</span><span class="o">.</span><span class="n">strip</span><span class="p">()</span> <span class="k">for</span> <span class="n">alias</span> <span class="ow">in</span> <span class="n">aliases</span><span class="o">.</span><span class="n">split</span><span class="p">(</span><span class="s2">&quot;;&quot;</span><span class="p">)</span> <span class="k">if</span> <span class="n">alias</span><span class="o">.</span><span class="n">strip</span><span class="p">()]</span>
<span class="k">if</span> <span class="s2">&quot;/&quot;</span> <span class="ow">in</span> <span class="n">objdef</span><span class="p">:</span>
<span class="n">objdef</span><span class="p">,</span> <span class="n">attrs</span> <span class="o">=</span> <span class="p">[</span><span class="n">part</span><span class="o">.</span><span class="n">strip</span><span class="p">()</span> <span class="k">for</span> <span class="n">part</span> <span class="ow">in</span> <span class="n">objdef</span><span class="o">.</span><span class="n">split</span><span class="p">(</span><span class="s2">&quot;/&quot;</span><span class="p">,</span> <span class="mi">1</span><span class="p">)]</span>
<span class="n">attrs</span> <span class="o">=</span> <span class="p">[</span><span class="n">part</span><span class="o">.</span><span class="n">strip</span><span class="p">()</span><span class="o">.</span><span class="n">lower</span><span class="p">()</span> <span class="k">for</span> <span class="n">part</span> <span class="ow">in</span> <span class="n">attrs</span><span class="o">.</span><span class="n">split</span><span class="p">(</span><span class="s2">&quot;/&quot;</span><span class="p">)</span> <span class="k">if</span> <span class="n">part</span><span class="o">.</span><span class="n">strip</span><span class="p">()]</span>
<span class="c1"># store data</span>
<span class="n">obj_defs</span><span class="p">[</span><span class="n">iside</span><span class="p">]</span><span class="o">.</span><span class="n">append</span><span class="p">({</span><span class="s2">&quot;name&quot;</span><span class="p">:</span> <span class="n">objdef</span><span class="p">,</span> <span class="s2">&quot;option&quot;</span><span class="p">:</span> <span class="n">option</span><span class="p">,</span> <span class="s2">&quot;aliases&quot;</span><span class="p">:</span> <span class="n">aliases</span><span class="p">})</span>
<span class="n">obj_attrs</span><span class="p">[</span><span class="n">iside</span><span class="p">]</span><span class="o">.</span><span class="n">append</span><span class="p">({</span><span class="s2">&quot;name&quot;</span><span class="p">:</span> <span class="n">objdef</span><span class="p">,</span> <span class="s2">&quot;attrs&quot;</span><span class="p">:</span> <span class="n">attrs</span><span class="p">})</span>
<span class="c1"># store for future access</span>
<span class="bp">self</span><span class="o">.</span><span class="n">lhs_objs</span> <span class="o">=</span> <span class="n">obj_defs</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span>
<span class="bp">self</span><span class="o">.</span><span class="n">rhs_objs</span> <span class="o">=</span> <span class="n">obj_defs</span><span class="p">[</span><span class="mi">1</span><span class="p">]</span>
<span class="bp">self</span><span class="o">.</span><span class="n">lhs_objattr</span> <span class="o">=</span> <span class="n">obj_attrs</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span>
<span class="bp">self</span><span class="o">.</span><span class="n">rhs_objattr</span> <span class="o">=</span> <span class="n">obj_attrs</span><span class="p">[</span><span class="mi">1</span><span class="p">]</span></div></div>
<div class="viewcode-block" id="CmdSetObjAlias"><a class="viewcode-back" href="../../../../api/evennia.commands.default.building.html#evennia.commands.default.building.CmdSetObjAlias">[docs]</a><span class="k">class</span> <span class="nc">CmdSetObjAlias</span><span class="p">(</span><span class="n">COMMAND_DEFAULT_CLASS</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> adding permanent aliases for object</span>
<span class="sd"> Usage:</span>
<span class="sd"> alias &lt;obj&gt; [= [alias[,alias,alias,...]]]</span>
<span class="sd"> alias &lt;obj&gt; =</span>
<span class="sd"> alias/category &lt;obj&gt; = [alias[,alias,...]:&lt;category&gt;</span>
<span class="sd"> Switches:</span>
<span class="sd"> category - requires ending input with :category, to store the</span>
<span class="sd"> given aliases with the given category.</span>
<span class="sd"> Assigns aliases to an object so it can be referenced by more</span>
<span class="sd"> than one name. Assign empty to remove all aliases from object. If</span>
<span class="sd"> assigning a category, all aliases given will be using this category.</span>
<span class="sd"> Observe that this is not the same thing as personal aliases</span>
<span class="sd"> created with the &#39;nick&#39; command! Aliases set with alias are</span>
<span class="sd"> changing the object in question, making those aliases usable</span>
<span class="sd"> by everyone.</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="n">key</span> <span class="o">=</span> <span class="s2">&quot;alias&quot;</span>
<span class="n">aliases</span> <span class="o">=</span> <span class="s2">&quot;setobjalias&quot;</span>
<span class="n">switch_options</span> <span class="o">=</span> <span class="p">(</span><span class="s2">&quot;category&quot;</span><span class="p">,)</span>
<span class="n">locks</span> <span class="o">=</span> <span class="s2">&quot;cmd:perm(setobjalias) or perm(Builder)&quot;</span>
<span class="n">help_category</span> <span class="o">=</span> <span class="s2">&quot;Building&quot;</span>
<div class="viewcode-block" id="CmdSetObjAlias.func"><a class="viewcode-back" href="../../../../api/evennia.commands.default.building.html#evennia.commands.default.building.CmdSetObjAlias.func">[docs]</a> <span class="k">def</span> <span class="nf">func</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;Set the aliases.&quot;&quot;&quot;</span>
<span class="n">caller</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">caller</span>
<span class="k">if</span> <span class="ow">not</span> <span class="bp">self</span><span class="o">.</span><span class="n">lhs</span><span class="p">:</span>
<span class="n">string</span> <span class="o">=</span> <span class="s2">&quot;Usage: alias &lt;obj&gt; [= [alias[,alias ...]]]&quot;</span>
<span class="bp">self</span><span class="o">.</span><span class="n">caller</span><span class="o">.</span><span class="n">msg</span><span class="p">(</span><span class="n">string</span><span class="p">)</span>
<span class="k">return</span>
<span class="n">objname</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">lhs</span>
<span class="c1"># Find the object to receive aliases</span>
<span class="n">obj</span> <span class="o">=</span> <span class="n">caller</span><span class="o">.</span><span class="n">search</span><span class="p">(</span><span class="n">objname</span><span class="p">)</span>
<span class="k">if</span> <span class="ow">not</span> <span class="n">obj</span><span class="p">:</span>
<span class="k">return</span>
<span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">rhs</span> <span class="ow">is</span> <span class="kc">None</span><span class="p">:</span>
<span class="c1"># no =, so we just list aliases on object.</span>
<span class="n">aliases</span> <span class="o">=</span> <span class="n">obj</span><span class="o">.</span><span class="n">aliases</span><span class="o">.</span><span class="n">all</span><span class="p">(</span><span class="n">return_key_and_category</span><span class="o">=</span><span class="kc">True</span><span class="p">)</span>
<span class="k">if</span> <span class="n">aliases</span><span class="p">:</span>
<span class="n">caller</span><span class="o">.</span><span class="n">msg</span><span class="p">(</span>
<span class="s2">&quot;Aliases for </span><span class="si">%s</span><span class="s2">: </span><span class="si">%s</span><span class="s2">&quot;</span>
<span class="o">%</span> <span class="p">(</span>
<span class="n">obj</span><span class="o">.</span><span class="n">get_display_name</span><span class="p">(</span><span class="n">caller</span><span class="p">),</span>
<span class="s2">&quot;, &quot;</span><span class="o">.</span><span class="n">join</span><span class="p">(</span>
<span class="s2">&quot;&#39;</span><span class="si">%s</span><span class="s2">&#39;</span><span class="si">%s</span><span class="s2">&quot;</span>
<span class="o">%</span> <span class="p">(</span><span class="n">alias</span><span class="p">,</span> <span class="s2">&quot;&quot;</span> <span class="k">if</span> <span class="n">category</span> <span class="ow">is</span> <span class="kc">None</span> <span class="k">else</span> <span class="s2">&quot;[category:&#39;</span><span class="si">%s</span><span class="s2">&#39;]&quot;</span> <span class="o">%</span> <span class="n">category</span><span class="p">)</span>
<span class="k">for</span> <span class="p">(</span><span class="n">alias</span><span class="p">,</span> <span class="n">category</span><span class="p">)</span> <span class="ow">in</span> <span class="n">aliases</span>
<span class="p">),</span>
<span class="p">)</span>
<span class="p">)</span>
<span class="k">else</span><span class="p">:</span>
<span class="n">caller</span><span class="o">.</span><span class="n">msg</span><span class="p">(</span><span class="s2">&quot;No aliases exist for &#39;</span><span class="si">%s</span><span class="s2">&#39;.&quot;</span> <span class="o">%</span> <span class="n">obj</span><span class="o">.</span><span class="n">get_display_name</span><span class="p">(</span><span class="n">caller</span><span class="p">))</span>
<span class="k">return</span>
<span class="k">if</span> <span class="ow">not</span> <span class="p">(</span><span class="n">obj</span><span class="o">.</span><span class="n">access</span><span class="p">(</span><span class="n">caller</span><span class="p">,</span> <span class="s2">&quot;control&quot;</span><span class="p">)</span> <span class="ow">or</span> <span class="n">obj</span><span class="o">.</span><span class="n">access</span><span class="p">(</span><span class="n">caller</span><span class="p">,</span> <span class="s2">&quot;edit&quot;</span><span class="p">)):</span>
<span class="n">caller</span><span class="o">.</span><span class="n">msg</span><span class="p">(</span><span class="s2">&quot;You don&#39;t have permission to do that.&quot;</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">rhs</span><span class="p">:</span>
<span class="c1"># we have given an empty =, so delete aliases</span>
<span class="n">old_aliases</span> <span class="o">=</span> <span class="n">obj</span><span class="o">.</span><span class="n">aliases</span><span class="o">.</span><span class="n">all</span><span class="p">()</span>
<span class="k">if</span> <span class="n">old_aliases</span><span class="p">:</span>
<span class="n">caller</span><span class="o">.</span><span class="n">msg</span><span class="p">(</span>
<span class="s2">&quot;Cleared aliases from </span><span class="si">%s</span><span class="s2">: </span><span class="si">%s</span><span class="s2">&quot;</span>
<span class="o">%</span> <span class="p">(</span><span class="n">obj</span><span class="o">.</span><span class="n">get_display_name</span><span class="p">(</span><span class="n">caller</span><span class="p">),</span> <span class="s2">&quot;, &quot;</span><span class="o">.</span><span class="n">join</span><span class="p">(</span><span class="n">old_aliases</span><span class="p">))</span>
<span class="p">)</span>
<span class="n">obj</span><span class="o">.</span><span class="n">aliases</span><span class="o">.</span><span class="n">clear</span><span class="p">()</span>
<span class="k">else</span><span class="p">:</span>
<span class="n">caller</span><span class="o">.</span><span class="n">msg</span><span class="p">(</span><span class="s2">&quot;No aliases to clear.&quot;</span><span class="p">)</span>
<span class="k">return</span>
<span class="n">category</span> <span class="o">=</span> <span class="kc">None</span>
<span class="k">if</span> <span class="s2">&quot;category&quot;</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">switches</span><span class="p">:</span>
<span class="k">if</span> <span class="s2">&quot;:&quot;</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">rhs</span><span class="p">:</span>
<span class="n">rhs</span><span class="p">,</span> <span class="n">category</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">rhs</span><span class="o">.</span><span class="n">rsplit</span><span class="p">(</span><span class="s2">&quot;:&quot;</span><span class="p">,</span> <span class="mi">1</span><span class="p">)</span>
<span class="n">category</span> <span class="o">=</span> <span class="n">category</span><span class="o">.</span><span class="n">strip</span><span class="p">()</span>
<span class="k">else</span><span class="p">:</span>
<span class="n">caller</span><span class="o">.</span><span class="n">msg</span><span class="p">(</span>
<span class="s2">&quot;If specifying the /category switch, the category must be given &quot;</span>
<span class="s2">&quot;as :category at the end.&quot;</span>
<span class="p">)</span>
<span class="k">else</span><span class="p">:</span>
<span class="n">rhs</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">rhs</span>
<span class="c1"># merge the old and new aliases (if any)</span>
<span class="n">old_aliases</span> <span class="o">=</span> <span class="n">obj</span><span class="o">.</span><span class="n">aliases</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="n">category</span><span class="o">=</span><span class="n">category</span><span class="p">,</span> <span class="n">return_list</span><span class="o">=</span><span class="kc">True</span><span class="p">)</span>
<span class="n">new_aliases</span> <span class="o">=</span> <span class="p">[</span><span class="n">alias</span><span class="o">.</span><span class="n">strip</span><span class="p">()</span><span class="o">.</span><span class="n">lower</span><span class="p">()</span> <span class="k">for</span> <span class="n">alias</span> <span class="ow">in</span> <span class="n">rhs</span><span class="o">.</span><span class="n">split</span><span class="p">(</span><span class="s2">&quot;,&quot;</span><span class="p">)</span> <span class="k">if</span> <span class="n">alias</span><span class="o">.</span><span class="n">strip</span><span class="p">()]</span>
<span class="c1"># make the aliases only appear once</span>
<span class="n">old_aliases</span><span class="o">.</span><span class="n">extend</span><span class="p">(</span><span class="n">new_aliases</span><span class="p">)</span>
<span class="n">aliases</span> <span class="o">=</span> <span class="nb">list</span><span class="p">(</span><span class="nb">set</span><span class="p">(</span><span class="n">old_aliases</span><span class="p">))</span>
<span class="c1"># save back to object.</span>
<span class="n">obj</span><span class="o">.</span><span class="n">aliases</span><span class="o">.</span><span class="n">add</span><span class="p">(</span><span class="n">aliases</span><span class="p">,</span> <span class="n">category</span><span class="o">=</span><span class="n">category</span><span class="p">)</span>
<span class="c1"># we need to trigger this here, since this will force</span>
<span class="c1"># (default) Exits to rebuild their Exit commands with the new</span>
<span class="c1"># aliases</span>
<span class="n">obj</span><span class="o">.</span><span class="n">at_cmdset_get</span><span class="p">(</span><span class="n">force_init</span><span class="o">=</span><span class="kc">True</span><span class="p">)</span>
<span class="c1"># report all aliases on the object</span>
<span class="n">caller</span><span class="o">.</span><span class="n">msg</span><span class="p">(</span>
<span class="s2">&quot;Alias(es) for &#39;</span><span class="si">%s</span><span class="s2">&#39; set to &#39;</span><span class="si">%s</span><span class="s2">&#39;</span><span class="si">%s</span><span class="s2">.&quot;</span>
<span class="o">%</span> <span class="p">(</span>
<span class="n">obj</span><span class="o">.</span><span class="n">get_display_name</span><span class="p">(</span><span class="n">caller</span><span class="p">),</span>
<span class="nb">str</span><span class="p">(</span><span class="n">obj</span><span class="o">.</span><span class="n">aliases</span><span class="p">),</span>
<span class="s2">&quot; (category: &#39;</span><span class="si">%s</span><span class="s2">&#39;)&quot;</span> <span class="o">%</span> <span class="n">category</span> <span class="k">if</span> <span class="n">category</span> <span class="k">else</span> <span class="s2">&quot;&quot;</span><span class="p">,</span>
<span class="p">)</span>
<span class="p">)</span></div></div>
<div class="viewcode-block" id="CmdCopy"><a class="viewcode-back" href="../../../../api/evennia.commands.default.building.html#evennia.commands.default.building.CmdCopy">[docs]</a><span class="k">class</span> <span class="nc">CmdCopy</span><span class="p">(</span><span class="n">ObjManipCommand</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> copy an object and its properties</span>
<span class="sd"> Usage:</span>
<span class="sd"> copy &lt;original obj&gt; [= &lt;new_name&gt;][;alias;alias..]</span>
<span class="sd"> [:&lt;new_location&gt;] [,&lt;new_name2&gt; ...]</span>
<span class="sd"> Create one or more copies of an object. If you don&#39;t supply any targets,</span>
<span class="sd"> one exact copy of the original object will be created with the name *_copy.</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="n">key</span> <span class="o">=</span> <span class="s2">&quot;copy&quot;</span>
<span class="n">locks</span> <span class="o">=</span> <span class="s2">&quot;cmd:perm(copy) or perm(Builder)&quot;</span>
<span class="n">help_category</span> <span class="o">=</span> <span class="s2">&quot;Building&quot;</span>
<div class="viewcode-block" id="CmdCopy.func"><a class="viewcode-back" href="../../../../api/evennia.commands.default.building.html#evennia.commands.default.building.CmdCopy.func">[docs]</a> <span class="k">def</span> <span class="nf">func</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;Uses ObjManipCommand.parse()&quot;&quot;&quot;</span>
<span class="n">caller</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">caller</span>
<span class="n">args</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">args</span>
<span class="k">if</span> <span class="ow">not</span> <span class="n">args</span><span class="p">:</span>
<span class="n">caller</span><span class="o">.</span><span class="n">msg</span><span class="p">(</span>
<span class="s2">&quot;Usage: copy &lt;obj&gt; [=&lt;new_name&gt;[;alias;alias..]]&quot;</span>
<span class="s2">&quot;[:&lt;new_location&gt;] [, &lt;new_name2&gt;...]&quot;</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">rhs</span><span class="p">:</span>
<span class="c1"># this has no target =, so an identical new object is created.</span>
<span class="n">from_obj_name</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">args</span>
<span class="n">from_obj</span> <span class="o">=</span> <span class="n">caller</span><span class="o">.</span><span class="n">search</span><span class="p">(</span><span class="n">from_obj_name</span><span class="p">)</span>
<span class="k">if</span> <span class="ow">not</span> <span class="n">from_obj</span><span class="p">:</span>
<span class="k">return</span>
<span class="n">to_obj_name</span> <span class="o">=</span> <span class="s2">&quot;</span><span class="si">%s</span><span class="s2">_copy&quot;</span> <span class="o">%</span> <span class="n">from_obj_name</span>
<span class="n">to_obj_aliases</span> <span class="o">=</span> <span class="p">[</span><span class="s2">&quot;</span><span class="si">%s</span><span class="s2">_copy&quot;</span> <span class="o">%</span> <span class="n">alias</span> <span class="k">for</span> <span class="n">alias</span> <span class="ow">in</span> <span class="n">from_obj</span><span class="o">.</span><span class="n">aliases</span><span class="o">.</span><span class="n">all</span><span class="p">()]</span>
<span class="n">copiedobj</span> <span class="o">=</span> <span class="n">ObjectDB</span><span class="o">.</span><span class="n">objects</span><span class="o">.</span><span class="n">copy_object</span><span class="p">(</span>
<span class="n">from_obj</span><span class="p">,</span> <span class="n">new_key</span><span class="o">=</span><span class="n">to_obj_name</span><span class="p">,</span> <span class="n">new_aliases</span><span class="o">=</span><span class="n">to_obj_aliases</span>
<span class="p">)</span>
<span class="k">if</span> <span class="n">copiedobj</span><span class="p">:</span>
<span class="n">string</span> <span class="o">=</span> <span class="s2">&quot;Identical copy of </span><span class="si">%s</span><span class="s2">, named &#39;</span><span class="si">%s</span><span class="s2">&#39; was created.&quot;</span> <span class="o">%</span> <span class="p">(</span>
<span class="n">from_obj_name</span><span class="p">,</span>
<span class="n">to_obj_name</span><span class="p">,</span>
<span class="p">)</span>
<span class="k">else</span><span class="p">:</span>
<span class="n">string</span> <span class="o">=</span> <span class="s2">&quot;There was an error copying </span><span class="si">%s</span><span class="s2">.&quot;</span>
<span class="k">else</span><span class="p">:</span>
<span class="c1"># we have specified =. This might mean many object targets</span>
<span class="n">from_obj_name</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">lhs_objs</span><span class="p">[</span><span class="mi">0</span><span class="p">][</span><span class="s2">&quot;name&quot;</span><span class="p">]</span>
<span class="n">from_obj</span> <span class="o">=</span> <span class="n">caller</span><span class="o">.</span><span class="n">search</span><span class="p">(</span><span class="n">from_obj_name</span><span class="p">)</span>
<span class="k">if</span> <span class="ow">not</span> <span class="n">from_obj</span><span class="p">:</span>
<span class="k">return</span>
<span class="k">for</span> <span class="n">objdef</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">rhs_objs</span><span class="p">:</span>
<span class="c1"># loop through all possible copy-to targets</span>
<span class="n">to_obj_name</span> <span class="o">=</span> <span class="n">objdef</span><span class="p">[</span><span class="s2">&quot;name&quot;</span><span class="p">]</span>
<span class="n">to_obj_aliases</span> <span class="o">=</span> <span class="n">objdef</span><span class="p">[</span><span class="s2">&quot;aliases&quot;</span><span class="p">]</span>
<span class="n">to_obj_location</span> <span class="o">=</span> <span class="n">objdef</span><span class="p">[</span><span class="s2">&quot;option&quot;</span><span class="p">]</span>
<span class="k">if</span> <span class="n">to_obj_location</span><span class="p">:</span>
<span class="n">to_obj_location</span> <span class="o">=</span> <span class="n">caller</span><span class="o">.</span><span class="n">search</span><span class="p">(</span><span class="n">to_obj_location</span><span class="p">,</span> <span class="n">global_search</span><span class="o">=</span><span class="kc">True</span><span class="p">)</span>
<span class="k">if</span> <span class="ow">not</span> <span class="n">to_obj_location</span><span class="p">:</span>
<span class="k">return</span>
<span class="n">copiedobj</span> <span class="o">=</span> <span class="n">ObjectDB</span><span class="o">.</span><span class="n">objects</span><span class="o">.</span><span class="n">copy_object</span><span class="p">(</span>
<span class="n">from_obj</span><span class="p">,</span>
<span class="n">new_key</span><span class="o">=</span><span class="n">to_obj_name</span><span class="p">,</span>
<span class="n">new_location</span><span class="o">=</span><span class="n">to_obj_location</span><span class="p">,</span>
<span class="n">new_aliases</span><span class="o">=</span><span class="n">to_obj_aliases</span><span class="p">,</span>
<span class="p">)</span>
<span class="k">if</span> <span class="n">copiedobj</span><span class="p">:</span>
<span class="n">string</span> <span class="o">=</span> <span class="s2">&quot;Copied </span><span class="si">%s</span><span class="s2"> to &#39;</span><span class="si">%s</span><span class="s2">&#39; (aliases: </span><span class="si">%s</span><span class="s2">).&quot;</span> <span class="o">%</span> <span class="p">(</span>
<span class="n">from_obj_name</span><span class="p">,</span>
<span class="n">to_obj_name</span><span class="p">,</span>
<span class="n">to_obj_aliases</span><span class="p">,</span>
<span class="p">)</span>
<span class="k">else</span><span class="p">:</span>
<span class="n">string</span> <span class="o">=</span> <span class="s2">&quot;There was an error copying </span><span class="si">%s</span><span class="s2"> to &#39;</span><span class="si">%s</span><span class="s2">&#39;.&quot;</span> <span class="o">%</span> <span class="p">(</span><span class="n">from_obj_name</span><span class="p">,</span> <span class="n">to_obj_name</span><span class="p">)</span>
<span class="c1"># we are done, echo to user</span>
<span class="n">caller</span><span class="o">.</span><span class="n">msg</span><span class="p">(</span><span class="n">string</span><span class="p">)</span></div></div>
<div class="viewcode-block" id="CmdCpAttr"><a class="viewcode-back" href="../../../../api/evennia.commands.default.building.html#evennia.commands.default.building.CmdCpAttr">[docs]</a><span class="k">class</span> <span class="nc">CmdCpAttr</span><span class="p">(</span><span class="n">ObjManipCommand</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> copy attributes between objects</span>
<span class="sd"> Usage:</span>
<span class="sd"> cpattr[/switch] &lt;obj&gt;/&lt;attr&gt; = &lt;obj1&gt;/&lt;attr1&gt; [,&lt;obj2&gt;/&lt;attr2&gt;,&lt;obj3&gt;/&lt;attr3&gt;,...]</span>
<span class="sd"> cpattr[/switch] &lt;obj&gt;/&lt;attr&gt; = &lt;obj1&gt; [,&lt;obj2&gt;,&lt;obj3&gt;,...]</span>
<span class="sd"> cpattr[/switch] &lt;attr&gt; = &lt;obj1&gt;/&lt;attr1&gt; [,&lt;obj2&gt;/&lt;attr2&gt;,&lt;obj3&gt;/&lt;attr3&gt;,...]</span>
<span class="sd"> cpattr[/switch] &lt;attr&gt; = &lt;obj1&gt;[,&lt;obj2&gt;,&lt;obj3&gt;,...]</span>
<span class="sd"> Switches:</span>
<span class="sd"> move - delete the attribute from the source object after copying.</span>
<span class="sd"> Example:</span>
<span class="sd"> cpattr coolness = Anna/chillout, Anna/nicety, Tom/nicety</span>
<span class="sd"> -&gt;</span>
<span class="sd"> copies the coolness attribute (defined on yourself), to attributes</span>
<span class="sd"> on Anna and Tom.</span>
<span class="sd"> Copy the attribute one object to one or more attributes on another object.</span>
<span class="sd"> If you don&#39;t supply a source object, yourself is used.</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="n">key</span> <span class="o">=</span> <span class="s2">&quot;cpattr&quot;</span>
<span class="n">switch_options</span> <span class="o">=</span> <span class="p">(</span><span class="s2">&quot;move&quot;</span><span class="p">,)</span>
<span class="n">locks</span> <span class="o">=</span> <span class="s2">&quot;cmd:perm(cpattr) or perm(Builder)&quot;</span>
<span class="n">help_category</span> <span class="o">=</span> <span class="s2">&quot;Building&quot;</span>
<div class="viewcode-block" id="CmdCpAttr.check_from_attr"><a class="viewcode-back" href="../../../../api/evennia.commands.default.building.html#evennia.commands.default.building.CmdCpAttr.check_from_attr">[docs]</a> <span class="k">def</span> <span class="nf">check_from_attr</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">obj</span><span class="p">,</span> <span class="n">attr</span><span class="p">,</span> <span class="n">clear</span><span class="o">=</span><span class="kc">False</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> Hook for overriding on subclassed commands. Checks to make sure a</span>
<span class="sd"> caller can copy the attr from the object in question. If not, return a</span>
<span class="sd"> false value and the command will abort. An error message should be</span>
<span class="sd"> provided by this function.</span>
<span class="sd"> If clear is True, user is attempting to move the attribute.</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="k">return</span> <span class="kc">True</span></div>
<div class="viewcode-block" id="CmdCpAttr.check_to_attr"><a class="viewcode-back" href="../../../../api/evennia.commands.default.building.html#evennia.commands.default.building.CmdCpAttr.check_to_attr">[docs]</a> <span class="k">def</span> <span class="nf">check_to_attr</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">obj</span><span class="p">,</span> <span class="n">attr</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> Hook for overriding on subclassed commands. Checks to make sure a</span>
<span class="sd"> caller can write to the specified attribute on the specified object.</span>
<span class="sd"> If not, return a false value and the attribute will be skipped. An</span>
<span class="sd"> error message should be provided by this function.</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="k">return</span> <span class="kc">True</span></div>
<div class="viewcode-block" id="CmdCpAttr.check_has_attr"><a class="viewcode-back" href="../../../../api/evennia.commands.default.building.html#evennia.commands.default.building.CmdCpAttr.check_has_attr">[docs]</a> <span class="k">def</span> <span class="nf">check_has_attr</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">obj</span><span class="p">,</span> <span class="n">attr</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> Hook for overriding on subclassed commands. Do any preprocessing</span>
<span class="sd"> required and verify an object has an attribute.</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="k">if</span> <span class="ow">not</span> <span class="n">obj</span><span class="o">.</span><span class="n">attributes</span><span class="o">.</span><span class="n">has</span><span class="p">(</span><span class="n">attr</span><span class="p">):</span>
<span class="bp">self</span><span class="o">.</span><span class="n">caller</span><span class="o">.</span><span class="n">msg</span><span class="p">(</span><span class="s2">&quot;</span><span class="si">%s</span><span class="s2"> doesn&#39;t have an attribute </span><span class="si">%s</span><span class="s2">.&quot;</span> <span class="o">%</span> <span class="p">(</span><span class="n">obj</span><span class="o">.</span><span class="n">name</span><span class="p">,</span> <span class="n">attr</span><span class="p">))</span>
<span class="k">return</span> <span class="kc">False</span>
<span class="k">return</span> <span class="kc">True</span></div>
<div class="viewcode-block" id="CmdCpAttr.get_attr"><a class="viewcode-back" href="../../../../api/evennia.commands.default.building.html#evennia.commands.default.building.CmdCpAttr.get_attr">[docs]</a> <span class="k">def</span> <span class="nf">get_attr</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">obj</span><span class="p">,</span> <span class="n">attr</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> Hook for overriding on subclassed commands. Do any preprocessing</span>
<span class="sd"> required and get the attribute from the object.</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="k">return</span> <span class="n">obj</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="n">attr</span><span class="p">)</span></div>
<div class="viewcode-block" id="CmdCpAttr.func"><a class="viewcode-back" href="../../../../api/evennia.commands.default.building.html#evennia.commands.default.building.CmdCpAttr.func">[docs]</a> <span class="k">def</span> <span class="nf">func</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> Do the copying.</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="n">caller</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">caller</span>
<span class="k">if</span> <span class="ow">not</span> <span class="bp">self</span><span class="o">.</span><span class="n">rhs</span><span class="p">:</span>
<span class="n">string</span> <span class="o">=</span> <span class="s2">&quot;&quot;&quot;Usage:</span>
<span class="s2"> cpattr[/switch] &lt;obj&gt;/&lt;attr&gt; = &lt;obj1&gt;/&lt;attr1&gt; [,&lt;obj2&gt;/&lt;attr2&gt;,&lt;obj3&gt;/&lt;attr3&gt;,...]</span>
<span class="s2"> cpattr[/switch] &lt;obj&gt;/&lt;attr&gt; = &lt;obj1&gt; [,&lt;obj2&gt;,&lt;obj3&gt;,...]</span>
<span class="s2"> cpattr[/switch] &lt;attr&gt; = &lt;obj1&gt;/&lt;attr1&gt; [,&lt;obj2&gt;/&lt;attr2&gt;,&lt;obj3&gt;/&lt;attr3&gt;,...]</span>
<span class="s2"> cpattr[/switch] &lt;attr&gt; = &lt;obj1&gt;[,&lt;obj2&gt;,&lt;obj3&gt;,...]&quot;&quot;&quot;</span>
<span class="n">caller</span><span class="o">.</span><span class="n">msg</span><span class="p">(</span><span class="n">string</span><span class="p">)</span>
<span class="k">return</span>
<span class="n">lhs_objattr</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">lhs_objattr</span>
<span class="n">to_objs</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">rhs_objattr</span>
<span class="n">from_obj_name</span> <span class="o">=</span> <span class="n">lhs_objattr</span><span class="p">[</span><span class="mi">0</span><span class="p">][</span><span class="s2">&quot;name&quot;</span><span class="p">]</span>
<span class="n">from_obj_attrs</span> <span class="o">=</span> <span class="n">lhs_objattr</span><span class="p">[</span><span class="mi">0</span><span class="p">][</span><span class="s2">&quot;attrs&quot;</span><span class="p">]</span>
<span class="k">if</span> <span class="ow">not</span> <span class="n">from_obj_attrs</span><span class="p">:</span>
<span class="c1"># this means the from_obj_name is actually an attribute</span>
<span class="c1"># name on self.</span>
<span class="n">from_obj_attrs</span> <span class="o">=</span> <span class="p">[</span><span class="n">from_obj_name</span><span class="p">]</span>
<span class="n">from_obj</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">caller</span>
<span class="k">else</span><span class="p">:</span>
<span class="n">from_obj</span> <span class="o">=</span> <span class="n">caller</span><span class="o">.</span><span class="n">search</span><span class="p">(</span><span class="n">from_obj_name</span><span class="p">)</span>
<span class="k">if</span> <span class="ow">not</span> <span class="n">from_obj</span> <span class="ow">or</span> <span class="ow">not</span> <span class="n">to_objs</span><span class="p">:</span>
<span class="n">caller</span><span class="o">.</span><span class="n">msg</span><span class="p">(</span><span class="s2">&quot;You have to supply both source object and target(s).&quot;</span><span class="p">)</span>
<span class="k">return</span>
<span class="c1"># copy to all to_obj:ects</span>
<span class="k">if</span> <span class="s2">&quot;move&quot;</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">switches</span><span class="p">:</span>
<span class="n">clear</span> <span class="o">=</span> <span class="kc">True</span>
<span class="k">else</span><span class="p">:</span>
<span class="n">clear</span> <span class="o">=</span> <span class="kc">False</span>
<span class="k">if</span> <span class="ow">not</span> <span class="bp">self</span><span class="o">.</span><span class="n">check_from_attr</span><span class="p">(</span><span class="n">from_obj</span><span class="p">,</span> <span class="n">from_obj_attrs</span><span class="p">[</span><span class="mi">0</span><span class="p">],</span> <span class="n">clear</span><span class="o">=</span><span class="n">clear</span><span class="p">):</span>
<span class="k">return</span>
<span class="k">for</span> <span class="n">attr</span> <span class="ow">in</span> <span class="n">from_obj_attrs</span><span class="p">:</span>
<span class="k">if</span> <span class="ow">not</span> <span class="bp">self</span><span class="o">.</span><span class="n">check_has_attr</span><span class="p">(</span><span class="n">from_obj</span><span class="p">,</span> <span class="n">attr</span><span class="p">):</span>
<span class="k">return</span>
<span class="k">if</span> <span class="p">(</span><span class="nb">len</span><span class="p">(</span><span class="n">from_obj_attrs</span><span class="p">)</span> <span class="o">!=</span> <span class="nb">len</span><span class="p">(</span><span class="nb">set</span><span class="p">(</span><span class="n">from_obj_attrs</span><span class="p">)))</span> <span class="ow">and</span> <span class="n">clear</span><span class="p">:</span>
<span class="bp">self</span><span class="o">.</span><span class="n">caller</span><span class="o">.</span><span class="n">msg</span><span class="p">(</span><span class="s2">&quot;|RCannot have duplicate source names when moving!&quot;</span><span class="p">)</span>
<span class="k">return</span>
<span class="n">result</span> <span class="o">=</span> <span class="p">[]</span>
<span class="k">for</span> <span class="n">to_obj</span> <span class="ow">in</span> <span class="n">to_objs</span><span class="p">:</span>
<span class="n">to_obj_name</span> <span class="o">=</span> <span class="n">to_obj</span><span class="p">[</span><span class="s2">&quot;name&quot;</span><span class="p">]</span>
<span class="n">to_obj_attrs</span> <span class="o">=</span> <span class="n">to_obj</span><span class="p">[</span><span class="s2">&quot;attrs&quot;</span><span class="p">]</span>
<span class="n">to_obj</span> <span class="o">=</span> <span class="n">caller</span><span class="o">.</span><span class="n">search</span><span class="p">(</span><span class="n">to_obj_name</span><span class="p">)</span>
<span class="k">if</span> <span class="ow">not</span> <span class="n">to_obj</span><span class="p">:</span>
<span class="n">result</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="s2">&quot;</span><span class="se">\n</span><span class="s2">Could not find object &#39;</span><span class="si">%s</span><span class="s2">&#39;&quot;</span> <span class="o">%</span> <span class="n">to_obj_name</span><span class="p">)</span>
<span class="k">continue</span>
<span class="k">for</span> <span class="n">inum</span><span class="p">,</span> <span class="n">from_attr</span> <span class="ow">in</span> <span class="nb">enumerate</span><span class="p">(</span><span class="n">from_obj_attrs</span><span class="p">):</span>
<span class="k">try</span><span class="p">:</span>
<span class="n">to_attr</span> <span class="o">=</span> <span class="n">to_obj_attrs</span><span class="p">[</span><span class="n">inum</span><span class="p">]</span>
<span class="k">except</span> <span class="ne">IndexError</span><span class="p">:</span>
<span class="c1"># if there are too few attributes given</span>
<span class="c1"># on the to_obj, we copy the original name instead.</span>
<span class="n">to_attr</span> <span class="o">=</span> <span class="n">from_attr</span>
<span class="k">if</span> <span class="ow">not</span> <span class="bp">self</span><span class="o">.</span><span class="n">check_to_attr</span><span class="p">(</span><span class="n">to_obj</span><span class="p">,</span> <span class="n">to_attr</span><span class="p">):</span>
<span class="k">continue</span>
<span class="n">value</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">get_attr</span><span class="p">(</span><span class="n">from_obj</span><span class="p">,</span> <span class="n">from_attr</span><span class="p">)</span>
<span class="n">to_obj</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="n">to_attr</span><span class="p">,</span> <span class="n">value</span><span class="p">)</span>
<span class="k">if</span> <span class="n">clear</span> <span class="ow">and</span> <span class="ow">not</span> <span class="p">(</span><span class="n">from_obj</span> <span class="o">==</span> <span class="n">to_obj</span> <span class="ow">and</span> <span class="n">from_attr</span> <span class="o">==</span> <span class="n">to_attr</span><span class="p">):</span>
<span class="n">from_obj</span><span class="o">.</span><span class="n">attributes</span><span class="o">.</span><span class="n">remove</span><span class="p">(</span><span class="n">from_attr</span><span class="p">)</span>
<span class="n">result</span><span class="o">.</span><span class="n">append</span><span class="p">(</span>
<span class="s2">&quot;</span><span class="se">\n</span><span class="s2">Moved </span><span class="si">%s</span><span class="s2">.</span><span class="si">%s</span><span class="s2"> -&gt; </span><span class="si">%s</span><span class="s2">.</span><span class="si">%s</span><span class="s2">. (value: </span><span class="si">%s</span><span class="s2">)&quot;</span>
<span class="o">%</span> <span class="p">(</span><span class="n">from_obj</span><span class="o">.</span><span class="n">name</span><span class="p">,</span> <span class="n">from_attr</span><span class="p">,</span> <span class="n">to_obj_name</span><span class="p">,</span> <span class="n">to_attr</span><span class="p">,</span> <span class="nb">repr</span><span class="p">(</span><span class="n">value</span><span class="p">))</span>
<span class="p">)</span>
<span class="k">else</span><span class="p">:</span>
<span class="n">result</span><span class="o">.</span><span class="n">append</span><span class="p">(</span>
<span class="s2">&quot;</span><span class="se">\n</span><span class="s2">Copied </span><span class="si">%s</span><span class="s2">.</span><span class="si">%s</span><span class="s2"> -&gt; </span><span class="si">%s</span><span class="s2">.</span><span class="si">%s</span><span class="s2">. (value: </span><span class="si">%s</span><span class="s2">)&quot;</span>
<span class="o">%</span> <span class="p">(</span><span class="n">from_obj</span><span class="o">.</span><span class="n">name</span><span class="p">,</span> <span class="n">from_attr</span><span class="p">,</span> <span class="n">to_obj_name</span><span class="p">,</span> <span class="n">to_attr</span><span class="p">,</span> <span class="nb">repr</span><span class="p">(</span><span class="n">value</span><span class="p">))</span>
<span class="p">)</span>
<span class="n">caller</span><span class="o">.</span><span class="n">msg</span><span class="p">(</span><span class="s2">&quot;&quot;</span><span class="o">.</span><span class="n">join</span><span class="p">(</span><span class="n">result</span><span class="p">))</span></div></div>
<div class="viewcode-block" id="CmdMvAttr"><a class="viewcode-back" href="../../../../api/evennia.commands.default.building.html#evennia.commands.default.building.CmdMvAttr">[docs]</a><span class="k">class</span> <span class="nc">CmdMvAttr</span><span class="p">(</span><span class="n">ObjManipCommand</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> move attributes between objects</span>
<span class="sd"> Usage:</span>
<span class="sd"> mvattr[/switch] &lt;obj&gt;/&lt;attr&gt; = &lt;obj1&gt;/&lt;attr1&gt; [,&lt;obj2&gt;/&lt;attr2&gt;,&lt;obj3&gt;/&lt;attr3&gt;,...]</span>
<span class="sd"> mvattr[/switch] &lt;obj&gt;/&lt;attr&gt; = &lt;obj1&gt; [,&lt;obj2&gt;,&lt;obj3&gt;,...]</span>
<span class="sd"> mvattr[/switch] &lt;attr&gt; = &lt;obj1&gt;/&lt;attr1&gt; [,&lt;obj2&gt;/&lt;attr2&gt;,&lt;obj3&gt;/&lt;attr3&gt;,...]</span>
<span class="sd"> mvattr[/switch] &lt;attr&gt; = &lt;obj1&gt;[,&lt;obj2&gt;,&lt;obj3&gt;,...]</span>
<span class="sd"> Switches:</span>
<span class="sd"> copy - Don&#39;t delete the original after moving.</span>
<span class="sd"> Move an attribute from one object to one or more attributes on another</span>
<span class="sd"> object. If you don&#39;t supply a source object, yourself is used.</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="n">key</span> <span class="o">=</span> <span class="s2">&quot;mvattr&quot;</span>
<span class="n">switch_options</span> <span class="o">=</span> <span class="p">(</span><span class="s2">&quot;copy&quot;</span><span class="p">,)</span>
<span class="n">locks</span> <span class="o">=</span> <span class="s2">&quot;cmd:perm(mvattr) or perm(Builder)&quot;</span>
<span class="n">help_category</span> <span class="o">=</span> <span class="s2">&quot;Building&quot;</span>
<div class="viewcode-block" id="CmdMvAttr.func"><a class="viewcode-back" href="../../../../api/evennia.commands.default.building.html#evennia.commands.default.building.CmdMvAttr.func">[docs]</a> <span class="k">def</span> <span class="nf">func</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> Do the moving</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="k">if</span> <span class="ow">not</span> <span class="bp">self</span><span class="o">.</span><span class="n">rhs</span><span class="p">:</span>
<span class="n">string</span> <span class="o">=</span> <span class="s2">&quot;&quot;&quot;Usage:</span>
<span class="s2"> mvattr[/switch] &lt;obj&gt;/&lt;attr&gt; = &lt;obj1&gt;/&lt;attr1&gt; [,&lt;obj2&gt;/&lt;attr2&gt;,&lt;obj3&gt;/&lt;attr3&gt;,...]</span>
<span class="s2"> mvattr[/switch] &lt;obj&gt;/&lt;attr&gt; = &lt;obj1&gt; [,&lt;obj2&gt;,&lt;obj3&gt;,...]</span>
<span class="s2"> mvattr[/switch] &lt;attr&gt; = &lt;obj1&gt;/&lt;attr1&gt; [,&lt;obj2&gt;/&lt;attr2&gt;,&lt;obj3&gt;/&lt;attr3&gt;,...]</span>
<span class="s2"> mvattr[/switch] &lt;attr&gt; = &lt;obj1&gt;[,&lt;obj2&gt;,&lt;obj3&gt;,...]&quot;&quot;&quot;</span>
<span class="bp">self</span><span class="o">.</span><span class="n">caller</span><span class="o">.</span><span class="n">msg</span><span class="p">(</span><span class="n">string</span><span class="p">)</span>
<span class="k">return</span>
<span class="c1"># simply use cpattr for all the functionality</span>
<span class="k">if</span> <span class="s2">&quot;copy&quot;</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">switches</span><span class="p">:</span>
<span class="bp">self</span><span class="o">.</span><span class="n">execute_cmd</span><span class="p">(</span><span class="s2">&quot;cpattr </span><span class="si">%s</span><span class="s2">&quot;</span> <span class="o">%</span> <span class="bp">self</span><span class="o">.</span><span class="n">args</span><span class="p">)</span>
<span class="k">else</span><span class="p">:</span>
<span class="bp">self</span><span class="o">.</span><span class="n">execute_cmd</span><span class="p">(</span><span class="s2">&quot;cpattr/move </span><span class="si">%s</span><span class="s2">&quot;</span> <span class="o">%</span> <span class="bp">self</span><span class="o">.</span><span class="n">args</span><span class="p">)</span></div></div>
<div class="viewcode-block" id="CmdCreate"><a class="viewcode-back" href="../../../../api/evennia.commands.default.building.html#evennia.commands.default.building.CmdCreate">[docs]</a><span class="k">class</span> <span class="nc">CmdCreate</span><span class="p">(</span><span class="n">ObjManipCommand</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> create new objects</span>
<span class="sd"> Usage:</span>
<span class="sd"> create[/drop] &lt;objname&gt;[;alias;alias...][:typeclass], &lt;objname&gt;...</span>
<span class="sd"> switch:</span>
<span class="sd"> drop - automatically drop the new object into your current</span>
<span class="sd"> location (this is not echoed). This also sets the new</span>
<span class="sd"> object&#39;s home to the current location rather than to you.</span>
<span class="sd"> Creates one or more new objects. If typeclass is given, the object</span>
<span class="sd"> is created as a child of this typeclass. The typeclass script is</span>
<span class="sd"> assumed to be located under types/ and any further</span>
<span class="sd"> directory structure is given in Python notation. So if you have a</span>
<span class="sd"> correct typeclass &#39;RedButton&#39; defined in</span>
<span class="sd"> types/examples/red_button.py, you could create a new</span>
<span class="sd"> object of this type like this:</span>
<span class="sd"> create/drop button;red : examples.red_button.RedButton</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="n">key</span> <span class="o">=</span> <span class="s2">&quot;create&quot;</span>
<span class="n">switch_options</span> <span class="o">=</span> <span class="p">(</span><span class="s2">&quot;drop&quot;</span><span class="p">,)</span>
<span class="n">locks</span> <span class="o">=</span> <span class="s2">&quot;cmd:perm(create) or perm(Builder)&quot;</span>
<span class="n">help_category</span> <span class="o">=</span> <span class="s2">&quot;Building&quot;</span>
<span class="c1"># lockstring of newly created objects, for easy overloading.</span>
<span class="c1"># Will be formatted with the {id} of the creating object.</span>
<span class="n">new_obj_lockstring</span> <span class="o">=</span> <span class="s2">&quot;control:id(</span><span class="si">{id}</span><span class="s2">) or perm(Admin);delete:id(</span><span class="si">{id}</span><span class="s2">) or perm(Admin)&quot;</span>
<div class="viewcode-block" id="CmdCreate.func"><a class="viewcode-back" href="../../../../api/evennia.commands.default.building.html#evennia.commands.default.building.CmdCreate.func">[docs]</a> <span class="k">def</span> <span class="nf">func</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> Creates the object.</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="n">caller</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">caller</span>
<span class="k">if</span> <span class="ow">not</span> <span class="bp">self</span><span class="o">.</span><span class="n">args</span><span class="p">:</span>
<span class="n">string</span> <span class="o">=</span> <span class="s2">&quot;Usage: create[/drop] &lt;newname&gt;[;alias;alias...] [:typeclass.path]&quot;</span>
<span class="n">caller</span><span class="o">.</span><span class="n">msg</span><span class="p">(</span><span class="n">string</span><span class="p">)</span>
<span class="k">return</span>
<span class="c1"># create the objects</span>
<span class="k">for</span> <span class="n">objdef</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">lhs_objs</span><span class="p">:</span>
<span class="n">string</span> <span class="o">=</span> <span class="s2">&quot;&quot;</span>
<span class="n">name</span> <span class="o">=</span> <span class="n">objdef</span><span class="p">[</span><span class="s2">&quot;name&quot;</span><span class="p">]</span>
<span class="n">aliases</span> <span class="o">=</span> <span class="n">objdef</span><span class="p">[</span><span class="s2">&quot;aliases&quot;</span><span class="p">]</span>
<span class="n">typeclass</span> <span class="o">=</span> <span class="n">objdef</span><span class="p">[</span><span class="s2">&quot;option&quot;</span><span class="p">]</span>
<span class="c1"># create object (if not a valid typeclass, the default</span>
<span class="c1"># object typeclass will automatically be used)</span>
<span class="n">lockstring</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">new_obj_lockstring</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="nb">id</span><span class="o">=</span><span class="n">caller</span><span class="o">.</span><span class="n">id</span><span class="p">)</span>
<span class="n">obj</span> <span class="o">=</span> <span class="n">create</span><span class="o">.</span><span class="n">create_object</span><span class="p">(</span>
<span class="n">typeclass</span><span class="p">,</span>
<span class="n">name</span><span class="p">,</span>
<span class="n">caller</span><span class="p">,</span>
<span class="n">home</span><span class="o">=</span><span class="n">caller</span><span class="p">,</span>
<span class="n">aliases</span><span class="o">=</span><span class="n">aliases</span><span class="p">,</span>
<span class="n">locks</span><span class="o">=</span><span class="n">lockstring</span><span class="p">,</span>
<span class="n">report_to</span><span class="o">=</span><span class="n">caller</span><span class="p">,</span>
<span class="p">)</span>
<span class="k">if</span> <span class="ow">not</span> <span class="n">obj</span><span class="p">:</span>
<span class="k">continue</span>
<span class="k">if</span> <span class="n">aliases</span><span class="p">:</span>
<span class="n">string</span> <span class="o">=</span> <span class="s2">&quot;You create a new </span><span class="si">%s</span><span class="s2">: </span><span class="si">%s</span><span class="s2"> (aliases: </span><span class="si">%s</span><span class="s2">).&quot;</span>
<span class="n">string</span> <span class="o">=</span> <span class="n">string</span> <span class="o">%</span> <span class="p">(</span><span class="n">obj</span><span class="o">.</span><span class="n">typename</span><span class="p">,</span> <span class="n">obj</span><span class="o">.</span><span class="n">name</span><span class="p">,</span> <span class="s2">&quot;, &quot;</span><span class="o">.</span><span class="n">join</span><span class="p">(</span><span class="n">aliases</span><span class="p">))</span>
<span class="k">else</span><span class="p">:</span>
<span class="n">string</span> <span class="o">=</span> <span class="s2">&quot;You create a new </span><span class="si">%s</span><span class="s2">: </span><span class="si">%s</span><span class="s2">.&quot;</span>
<span class="n">string</span> <span class="o">=</span> <span class="n">string</span> <span class="o">%</span> <span class="p">(</span><span class="n">obj</span><span class="o">.</span><span class="n">typename</span><span class="p">,</span> <span class="n">obj</span><span class="o">.</span><span class="n">name</span><span class="p">)</span>
<span class="c1"># set a default desc</span>
<span class="k">if</span> <span class="ow">not</span> <span class="n">obj</span><span class="o">.</span><span class="n">db</span><span class="o">.</span><span class="n">desc</span><span class="p">:</span>
<span class="n">obj</span><span class="o">.</span><span class="n">db</span><span class="o">.</span><span class="n">desc</span> <span class="o">=</span> <span class="s2">&quot;You see nothing special.&quot;</span>
<span class="k">if</span> <span class="s2">&quot;drop&quot;</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">switches</span><span class="p">:</span>
<span class="k">if</span> <span class="n">caller</span><span class="o">.</span><span class="n">location</span><span class="p">:</span>
<span class="n">obj</span><span class="o">.</span><span class="n">home</span> <span class="o">=</span> <span class="n">caller</span><span class="o">.</span><span class="n">location</span>
<span class="n">obj</span><span class="o">.</span><span class="n">move_to</span><span class="p">(</span><span class="n">caller</span><span class="o">.</span><span class="n">location</span><span class="p">,</span> <span class="n">quiet</span><span class="o">=</span><span class="kc">True</span><span class="p">)</span>
<span class="k">if</span> <span class="n">string</span><span class="p">:</span>
<span class="n">caller</span><span class="o">.</span><span class="n">msg</span><span class="p">(</span><span class="n">string</span><span class="p">)</span></div></div>
<span class="k">def</span> <span class="nf">_desc_load</span><span class="p">(</span><span class="n">caller</span><span class="p">):</span>
<span class="k">return</span> <span class="n">caller</span><span class="o">.</span><span class="n">db</span><span class="o">.</span><span class="n">evmenu_target</span><span class="o">.</span><span class="n">db</span><span class="o">.</span><span class="n">desc</span> <span class="ow">or</span> <span class="s2">&quot;&quot;</span>
<span class="k">def</span> <span class="nf">_desc_save</span><span class="p">(</span><span class="n">caller</span><span class="p">,</span> <span class="n">buf</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> Save line buffer to the desc prop. This should</span>
<span class="sd"> return True if successful and also report its status to the user.</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="n">caller</span><span class="o">.</span><span class="n">db</span><span class="o">.</span><span class="n">evmenu_target</span><span class="o">.</span><span class="n">db</span><span class="o">.</span><span class="n">desc</span> <span class="o">=</span> <span class="n">buf</span>
<span class="n">caller</span><span class="o">.</span><span class="n">msg</span><span class="p">(</span><span class="s2">&quot;Saved.&quot;</span><span class="p">)</span>
<span class="k">return</span> <span class="kc">True</span>
<span class="k">def</span> <span class="nf">_desc_quit</span><span class="p">(</span><span class="n">caller</span><span class="p">):</span>
<span class="n">caller</span><span class="o">.</span><span class="n">attributes</span><span class="o">.</span><span class="n">remove</span><span class="p">(</span><span class="s2">&quot;evmenu_target&quot;</span><span class="p">)</span>
<span class="n">caller</span><span class="o">.</span><span class="n">msg</span><span class="p">(</span><span class="s2">&quot;Exited editor.&quot;</span><span class="p">)</span>
<div class="viewcode-block" id="CmdDesc"><a class="viewcode-back" href="../../../../api/evennia.commands.default.building.html#evennia.commands.default.building.CmdDesc">[docs]</a><span class="k">class</span> <span class="nc">CmdDesc</span><span class="p">(</span><span class="n">COMMAND_DEFAULT_CLASS</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> describe an object or the current room.</span>
<span class="sd"> Usage:</span>
<span class="sd"> desc [&lt;obj&gt; =] &lt;description&gt;</span>
<span class="sd"> Switches:</span>
<span class="sd"> edit - Open up a line editor for more advanced editing.</span>
<span class="sd"> Sets the &quot;desc&quot; attribute on an object. If an object is not given,</span>
<span class="sd"> describe the current room.</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="n">key</span> <span class="o">=</span> <span class="s2">&quot;desc&quot;</span>
<span class="n">aliases</span> <span class="o">=</span> <span class="s2">&quot;describe&quot;</span>
<span class="n">switch_options</span> <span class="o">=</span> <span class="p">(</span><span class="s2">&quot;edit&quot;</span><span class="p">,)</span>
<span class="n">locks</span> <span class="o">=</span> <span class="s2">&quot;cmd:perm(desc) or perm(Builder)&quot;</span>
<span class="n">help_category</span> <span class="o">=</span> <span class="s2">&quot;Building&quot;</span>
<div class="viewcode-block" id="CmdDesc.edit_handler"><a class="viewcode-back" href="../../../../api/evennia.commands.default.building.html#evennia.commands.default.building.CmdDesc.edit_handler">[docs]</a> <span class="k">def</span> <span class="nf">edit_handler</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">rhs</span><span class="p">:</span>
<span class="bp">self</span><span class="o">.</span><span class="n">msg</span><span class="p">(</span><span class="s2">&quot;|rYou may specify a value, or use the edit switch, &quot;</span> <span class="s2">&quot;but not both.|n&quot;</span><span class="p">)</span>
<span class="k">return</span>
<span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">args</span><span class="p">:</span>
<span class="n">obj</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">caller</span><span class="o">.</span><span class="n">search</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">args</span><span class="p">)</span>
<span class="k">else</span><span class="p">:</span>
<span class="n">obj</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">caller</span><span class="o">.</span><span class="n">location</span> <span class="ow">or</span> <span class="bp">self</span><span class="o">.</span><span class="n">msg</span><span class="p">(</span><span class="s2">&quot;|rYou can&#39;t describe oblivion.|n&quot;</span><span class="p">)</span>
<span class="k">if</span> <span class="ow">not</span> <span class="n">obj</span><span class="p">:</span>
<span class="k">return</span>
<span class="k">if</span> <span class="ow">not</span> <span class="p">(</span><span class="n">obj</span><span class="o">.</span><span class="n">access</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">caller</span><span class="p">,</span> <span class="s2">&quot;control&quot;</span><span class="p">)</span> <span class="ow">or</span> <span class="n">obj</span><span class="o">.</span><span class="n">access</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">caller</span><span class="p">,</span> <span class="s2">&quot;edit&quot;</span><span class="p">)):</span>
<span class="bp">self</span><span class="o">.</span><span class="n">caller</span><span class="o">.</span><span class="n">msg</span><span class="p">(</span><span class="s2">&quot;You don&#39;t have permission to edit the description of </span><span class="si">%s</span><span class="s2">.&quot;</span> <span class="o">%</span> <span class="n">obj</span><span class="o">.</span><span class="n">key</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">caller</span><span class="o">.</span><span class="n">db</span><span class="o">.</span><span class="n">evmenu_target</span> <span class="o">=</span> <span class="n">obj</span>
<span class="c1"># launch the editor</span>
<span class="n">EvEditor</span><span class="p">(</span>
<span class="bp">self</span><span class="o">.</span><span class="n">caller</span><span class="p">,</span>
<span class="n">loadfunc</span><span class="o">=</span><span class="n">_desc_load</span><span class="p">,</span>
<span class="n">savefunc</span><span class="o">=</span><span class="n">_desc_save</span><span class="p">,</span>
<span class="n">quitfunc</span><span class="o">=</span><span class="n">_desc_quit</span><span class="p">,</span>
<span class="n">key</span><span class="o">=</span><span class="s2">&quot;desc&quot;</span><span class="p">,</span>
<span class="n">persistent</span><span class="o">=</span><span class="kc">True</span><span class="p">,</span>
<span class="p">)</span>
<span class="k">return</span></div>
<div class="viewcode-block" id="CmdDesc.func"><a class="viewcode-back" href="../../../../api/evennia.commands.default.building.html#evennia.commands.default.building.CmdDesc.func">[docs]</a> <span class="k">def</span> <span class="nf">func</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;Define command&quot;&quot;&quot;</span>
<span class="n">caller</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">caller</span>
<span class="k">if</span> <span class="ow">not</span> <span class="bp">self</span><span class="o">.</span><span class="n">args</span> <span class="ow">and</span> <span class="s2">&quot;edit&quot;</span> <span class="ow">not</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">switches</span><span class="p">:</span>
<span class="n">caller</span><span class="o">.</span><span class="n">msg</span><span class="p">(</span><span class="s2">&quot;Usage: desc [&lt;obj&gt; =] &lt;description&gt;&quot;</span><span class="p">)</span>
<span class="k">return</span>
<span class="k">if</span> <span class="s2">&quot;edit&quot;</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">switches</span><span class="p">:</span>
<span class="bp">self</span><span class="o">.</span><span class="n">edit_handler</span><span class="p">()</span>
<span class="k">return</span>
<span class="k">if</span> <span class="s2">&quot;=&quot;</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">args</span><span class="p">:</span>
<span class="c1"># We have an =</span>
<span class="n">obj</span> <span class="o">=</span> <span class="n">caller</span><span class="o">.</span><span class="n">search</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">lhs</span><span class="p">)</span>
<span class="k">if</span> <span class="ow">not</span> <span class="n">obj</span><span class="p">:</span>
<span class="k">return</span>
<span class="n">desc</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">rhs</span> <span class="ow">or</span> <span class="s2">&quot;&quot;</span>
<span class="k">else</span><span class="p">:</span>
<span class="n">obj</span> <span class="o">=</span> <span class="n">caller</span><span class="o">.</span><span class="n">location</span> <span class="ow">or</span> <span class="bp">self</span><span class="o">.</span><span class="n">msg</span><span class="p">(</span><span class="s2">&quot;|rYou can&#39;t describe oblivion.|n&quot;</span><span class="p">)</span>
<span class="k">if</span> <span class="ow">not</span> <span class="n">obj</span><span class="p">:</span>
<span class="k">return</span>
<span class="n">desc</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">args</span>
<span class="k">if</span> <span class="n">obj</span><span class="o">.</span><span class="n">access</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">caller</span><span class="p">,</span> <span class="s2">&quot;control&quot;</span><span class="p">)</span> <span class="ow">or</span> <span class="n">obj</span><span class="o">.</span><span class="n">access</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">caller</span><span class="p">,</span> <span class="s2">&quot;edit&quot;</span><span class="p">):</span>
<span class="n">obj</span><span class="o">.</span><span class="n">db</span><span class="o">.</span><span class="n">desc</span> <span class="o">=</span> <span class="n">desc</span>
<span class="n">caller</span><span class="o">.</span><span class="n">msg</span><span class="p">(</span><span class="s2">&quot;The description was set on </span><span class="si">%s</span><span class="s2">.&quot;</span> <span class="o">%</span> <span class="n">obj</span><span class="o">.</span><span class="n">get_display_name</span><span class="p">(</span><span class="n">caller</span><span class="p">))</span>
<span class="k">else</span><span class="p">:</span>
<span class="n">caller</span><span class="o">.</span><span class="n">msg</span><span class="p">(</span><span class="s2">&quot;You don&#39;t have permission to edit the description of </span><span class="si">%s</span><span class="s2">.&quot;</span> <span class="o">%</span> <span class="n">obj</span><span class="o">.</span><span class="n">key</span><span class="p">)</span></div></div>
<div class="viewcode-block" id="CmdDestroy"><a class="viewcode-back" href="../../../../api/evennia.commands.default.building.html#evennia.commands.default.building.CmdDestroy">[docs]</a><span class="k">class</span> <span class="nc">CmdDestroy</span><span class="p">(</span><span class="n">COMMAND_DEFAULT_CLASS</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> permanently delete objects</span>
<span class="sd"> Usage:</span>
<span class="sd"> destroy[/switches] [obj, obj2, obj3, [dbref-dbref], ...]</span>
<span class="sd"> Switches:</span>
<span class="sd"> override - The destroy command will usually avoid accidentally</span>
<span class="sd"> destroying account objects. This switch overrides this safety.</span>
<span class="sd"> force - destroy without confirmation.</span>
<span class="sd"> Examples:</span>
<span class="sd"> destroy house, roof, door, 44-78</span>
<span class="sd"> destroy 5-10, flower, 45</span>
<span class="sd"> destroy/force north</span>
<span class="sd"> Destroys one or many objects. If dbrefs are used, a range to delete can be</span>
<span class="sd"> given, e.g. 4-10. Also the end points will be deleted. This command</span>
<span class="sd"> displays a confirmation before destroying, to make sure of your choice.</span>
<span class="sd"> You can specify the /force switch to bypass this confirmation.</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="n">key</span> <span class="o">=</span> <span class="s2">&quot;destroy&quot;</span>
<span class="n">aliases</span> <span class="o">=</span> <span class="p">[</span><span class="s2">&quot;delete&quot;</span><span class="p">,</span> <span class="s2">&quot;del&quot;</span><span class="p">]</span>
<span class="n">switch_options</span> <span class="o">=</span> <span class="p">(</span><span class="s2">&quot;override&quot;</span><span class="p">,</span> <span class="s2">&quot;force&quot;</span><span class="p">)</span>
<span class="n">locks</span> <span class="o">=</span> <span class="s2">&quot;cmd:perm(destroy) or perm(Builder)&quot;</span>
<span class="n">help_category</span> <span class="o">=</span> <span class="s2">&quot;Building&quot;</span>
<span class="n">confirm</span> <span class="o">=</span> <span class="kc">True</span> <span class="c1"># set to False to always bypass confirmation</span>
<span class="n">default_confirm</span> <span class="o">=</span> <span class="s2">&quot;yes&quot;</span> <span class="c1"># what to assume if just pressing enter (yes/no)</span>
<div class="viewcode-block" id="CmdDestroy.func"><a class="viewcode-back" href="../../../../api/evennia.commands.default.building.html#evennia.commands.default.building.CmdDestroy.func">[docs]</a> <span class="k">def</span> <span class="nf">func</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;Implements the command.&quot;&quot;&quot;</span>
<span class="n">caller</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">caller</span>
<span class="n">delete</span> <span class="o">=</span> <span class="kc">True</span>
<span class="k">if</span> <span class="ow">not</span> <span class="bp">self</span><span class="o">.</span><span class="n">args</span> <span class="ow">or</span> <span class="ow">not</span> <span class="bp">self</span><span class="o">.</span><span class="n">lhslist</span><span class="p">:</span>
<span class="n">caller</span><span class="o">.</span><span class="n">msg</span><span class="p">(</span><span class="s2">&quot;Usage: destroy[/switches] [obj, obj2, obj3, [dbref-dbref],...]&quot;</span><span class="p">)</span>
<span class="n">delete</span> <span class="o">=</span> <span class="kc">False</span>
<span class="k">def</span> <span class="nf">delobj</span><span class="p">(</span><span class="n">obj</span><span class="p">):</span>
<span class="c1"># helper function for deleting a single object</span>
<span class="n">string</span> <span class="o">=</span> <span class="s2">&quot;&quot;</span>
<span class="k">if</span> <span class="ow">not</span> <span class="n">obj</span><span class="o">.</span><span class="n">pk</span><span class="p">:</span>
<span class="n">string</span> <span class="o">=</span> <span class="s2">&quot;</span><span class="se">\n</span><span class="s2">Object </span><span class="si">%s</span><span class="s2"> was already deleted.&quot;</span> <span class="o">%</span> <span class="n">obj</span><span class="o">.</span><span class="n">db_key</span>
<span class="k">else</span><span class="p">:</span>
<span class="n">objname</span> <span class="o">=</span> <span class="n">obj</span><span class="o">.</span><span class="n">name</span>
<span class="k">if</span> <span class="ow">not</span> <span class="p">(</span><span class="n">obj</span><span class="o">.</span><span class="n">access</span><span class="p">(</span><span class="n">caller</span><span class="p">,</span> <span class="s2">&quot;control&quot;</span><span class="p">)</span> <span class="ow">or</span> <span class="n">obj</span><span class="o">.</span><span class="n">access</span><span class="p">(</span><span class="n">caller</span><span class="p">,</span> <span class="s2">&quot;delete&quot;</span><span class="p">)):</span>
<span class="k">return</span> <span class="s2">&quot;</span><span class="se">\n</span><span class="s2">You don&#39;t have permission to delete </span><span class="si">%s</span><span class="s2">.&quot;</span> <span class="o">%</span> <span class="n">objname</span>
<span class="k">if</span> <span class="n">obj</span><span class="o">.</span><span class="n">account</span> <span class="ow">and</span> <span class="s2">&quot;override&quot;</span> <span class="ow">not</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">switches</span><span class="p">:</span>
<span class="k">return</span> <span class="p">(</span>
<span class="s2">&quot;</span><span class="se">\n</span><span class="s2">Object </span><span class="si">%s</span><span class="s2"> is controlled by an active account. Use /override to delete anyway.&quot;</span>
<span class="o">%</span> <span class="n">objname</span>
<span class="p">)</span>
<span class="k">if</span> <span class="n">obj</span><span class="o">.</span><span class="n">dbid</span> <span class="o">==</span> <span class="nb">int</span><span class="p">(</span><span class="n">settings</span><span class="o">.</span><span class="n">DEFAULT_HOME</span><span class="o">.</span><span class="n">lstrip</span><span class="p">(</span><span class="s2">&quot;#&quot;</span><span class="p">)):</span>
<span class="k">return</span> <span class="p">(</span>
<span class="s2">&quot;</span><span class="se">\n</span><span class="s2">You are trying to delete |c</span><span class="si">%s</span><span class="s2">|n, which is set as DEFAULT_HOME. &quot;</span>
<span class="s2">&quot;Re-point settings.DEFAULT_HOME to another &quot;</span>
<span class="s2">&quot;object before continuing.&quot;</span> <span class="o">%</span> <span class="n">objname</span>
<span class="p">)</span>
<span class="n">had_exits</span> <span class="o">=</span> <span class="nb">hasattr</span><span class="p">(</span><span class="n">obj</span><span class="p">,</span> <span class="s2">&quot;exits&quot;</span><span class="p">)</span> <span class="ow">and</span> <span class="n">obj</span><span class="o">.</span><span class="n">exits</span>
<span class="n">had_objs</span> <span class="o">=</span> <span class="nb">hasattr</span><span class="p">(</span><span class="n">obj</span><span class="p">,</span> <span class="s2">&quot;contents&quot;</span><span class="p">)</span> <span class="ow">and</span> <span class="nb">any</span><span class="p">(</span>
<span class="n">obj</span>
<span class="k">for</span> <span class="n">obj</span> <span class="ow">in</span> <span class="n">obj</span><span class="o">.</span><span class="n">contents</span>
<span class="k">if</span> <span class="ow">not</span> <span class="p">(</span><span class="nb">hasattr</span><span class="p">(</span><span class="n">obj</span><span class="p">,</span> <span class="s2">&quot;exits&quot;</span><span class="p">)</span> <span class="ow">and</span> <span class="n">obj</span> <span class="ow">not</span> <span class="ow">in</span> <span class="n">obj</span><span class="o">.</span><span class="n">exits</span><span class="p">)</span>
<span class="p">)</span>
<span class="c1"># do the deletion</span>
<span class="n">okay</span> <span class="o">=</span> <span class="n">obj</span><span class="o">.</span><span class="n">delete</span><span class="p">()</span>
<span class="k">if</span> <span class="ow">not</span> <span class="n">okay</span><span class="p">:</span>
<span class="n">string</span> <span class="o">+=</span> <span class="p">(</span>
<span class="s2">&quot;</span><span class="se">\n</span><span class="s2">ERROR: </span><span class="si">%s</span><span class="s2"> not deleted, probably because delete() returned False.&quot;</span>
<span class="o">%</span> <span class="n">objname</span>
<span class="p">)</span>
<span class="k">else</span><span class="p">:</span>
<span class="n">string</span> <span class="o">+=</span> <span class="s2">&quot;</span><span class="se">\n</span><span class="si">%s</span><span class="s2"> was destroyed.&quot;</span> <span class="o">%</span> <span class="n">objname</span>
<span class="k">if</span> <span class="n">had_exits</span><span class="p">:</span>
<span class="n">string</span> <span class="o">+=</span> <span class="s2">&quot; Exits to and from </span><span class="si">%s</span><span class="s2"> were destroyed as well.&quot;</span> <span class="o">%</span> <span class="n">objname</span>
<span class="k">if</span> <span class="n">had_objs</span><span class="p">:</span>
<span class="n">string</span> <span class="o">+=</span> <span class="s2">&quot; Objects inside </span><span class="si">%s</span><span class="s2"> were moved to their homes.&quot;</span> <span class="o">%</span> <span class="n">objname</span>
<span class="k">return</span> <span class="n">string</span>
<span class="n">objs</span> <span class="o">=</span> <span class="p">[]</span>
<span class="k">for</span> <span class="n">objname</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">lhslist</span><span class="p">:</span>
<span class="k">if</span> <span class="ow">not</span> <span class="n">delete</span><span class="p">:</span>
<span class="k">continue</span>
<span class="k">if</span> <span class="s2">&quot;-&quot;</span> <span class="ow">in</span> <span class="n">objname</span><span class="p">:</span>
<span class="c1"># might be a range of dbrefs</span>
<span class="n">dmin</span><span class="p">,</span> <span class="n">dmax</span> <span class="o">=</span> <span class="p">[</span><span class="n">utils</span><span class="o">.</span><span class="n">dbref</span><span class="p">(</span><span class="n">part</span><span class="p">,</span> <span class="n">reqhash</span><span class="o">=</span><span class="kc">False</span><span class="p">)</span> <span class="k">for</span> <span class="n">part</span> <span class="ow">in</span> <span class="n">objname</span><span class="o">.</span><span class="n">split</span><span class="p">(</span><span class="s2">&quot;-&quot;</span><span class="p">,</span> <span class="mi">1</span><span class="p">)]</span>
<span class="k">if</span> <span class="n">dmin</span> <span class="ow">and</span> <span class="n">dmax</span><span class="p">:</span>
<span class="k">for</span> <span class="n">dbref</span> <span class="ow">in</span> <span class="nb">range</span><span class="p">(</span><span class="nb">int</span><span class="p">(</span><span class="n">dmin</span><span class="p">),</span> <span class="nb">int</span><span class="p">(</span><span class="n">dmax</span> <span class="o">+</span> <span class="mi">1</span><span class="p">)):</span>
<span class="n">obj</span> <span class="o">=</span> <span class="n">caller</span><span class="o">.</span><span class="n">search</span><span class="p">(</span><span class="s2">&quot;#&quot;</span> <span class="o">+</span> <span class="nb">str</span><span class="p">(</span><span class="n">dbref</span><span class="p">))</span>
<span class="k">if</span> <span class="n">obj</span><span class="p">:</span>
<span class="n">objs</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">obj</span><span class="p">)</span>
<span class="k">continue</span>
<span class="k">else</span><span class="p">:</span>
<span class="n">obj</span> <span class="o">=</span> <span class="n">caller</span><span class="o">.</span><span class="n">search</span><span class="p">(</span><span class="n">objname</span><span class="p">)</span>
<span class="k">else</span><span class="p">:</span>
<span class="n">obj</span> <span class="o">=</span> <span class="n">caller</span><span class="o">.</span><span class="n">search</span><span class="p">(</span><span class="n">objname</span><span class="p">)</span>
<span class="k">if</span> <span class="n">obj</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">caller</span><span class="o">.</span><span class="n">msg</span><span class="p">(</span>
<span class="s2">&quot; (Objects to destroy must either be local or specified with a unique #dbref.)&quot;</span>
<span class="p">)</span>
<span class="k">elif</span> <span class="n">obj</span> <span class="ow">not</span> <span class="ow">in</span> <span class="n">objs</span><span class="p">:</span>
<span class="n">objs</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">obj</span><span class="p">)</span>
<span class="k">if</span> <span class="n">objs</span> <span class="ow">and</span> <span class="p">(</span><span class="s2">&quot;force&quot;</span> <span class="ow">not</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">switches</span> <span class="ow">and</span> <span class="nb">type</span><span class="p">(</span><span class="bp">self</span><span class="p">)</span><span class="o">.</span><span class="n">confirm</span><span class="p">):</span>
<span class="n">confirm</span> <span class="o">=</span> <span class="s2">&quot;Are you sure you want to destroy &quot;</span>
<span class="k">if</span> <span class="nb">len</span><span class="p">(</span><span class="n">objs</span><span class="p">)</span> <span class="o">==</span> <span class="mi">1</span><span class="p">:</span>
<span class="n">confirm</span> <span class="o">+=</span> <span class="n">objs</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span><span class="o">.</span><span class="n">get_display_name</span><span class="p">(</span><span class="n">caller</span><span class="p">)</span>
<span class="k">elif</span> <span class="nb">len</span><span class="p">(</span><span class="n">objs</span><span class="p">)</span> <span class="o">&lt;</span> <span class="mi">5</span><span class="p">:</span>
<span class="n">confirm</span> <span class="o">+=</span> <span class="s2">&quot;, &quot;</span><span class="o">.</span><span class="n">join</span><span class="p">([</span><span class="n">obj</span><span class="o">.</span><span class="n">get_display_name</span><span class="p">(</span><span class="n">caller</span><span class="p">)</span> <span class="k">for</span> <span class="n">obj</span> <span class="ow">in</span> <span class="n">objs</span><span class="p">])</span>
<span class="k">else</span><span class="p">:</span>
<span class="n">confirm</span> <span class="o">+=</span> <span class="s2">&quot;, &quot;</span><span class="o">.</span><span class="n">join</span><span class="p">([</span><span class="s2">&quot;#</span><span class="si">{}</span><span class="s2">&quot;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">obj</span><span class="o">.</span><span class="n">id</span><span class="p">)</span> <span class="k">for</span> <span class="n">obj</span> <span class="ow">in</span> <span class="n">objs</span><span class="p">])</span>
<span class="n">confirm</span> <span class="o">+=</span> <span class="s2">&quot; [yes]/no?&quot;</span> <span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">default_confirm</span> <span class="o">==</span> <span class="s2">&quot;yes&quot;</span> <span class="k">else</span> <span class="s2">&quot; yes/[no]&quot;</span>
<span class="n">answer</span> <span class="o">=</span> <span class="s2">&quot;&quot;</span>
<span class="n">answer</span> <span class="o">=</span> <span class="k">yield</span> <span class="p">(</span><span class="n">confirm</span><span class="p">)</span>
<span class="n">answer</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">default_confirm</span> <span class="k">if</span> <span class="n">answer</span> <span class="o">==</span> <span class="s2">&quot;&quot;</span> <span class="k">else</span> <span class="n">answer</span>
<span class="k">if</span> <span class="n">answer</span> <span class="ow">and</span> <span class="n">answer</span> <span class="ow">not</span> <span class="ow">in</span> <span class="p">(</span><span class="s2">&quot;yes&quot;</span><span class="p">,</span> <span class="s2">&quot;y&quot;</span><span class="p">,</span> <span class="s2">&quot;no&quot;</span><span class="p">,</span> <span class="s2">&quot;n&quot;</span><span class="p">):</span>
<span class="n">caller</span><span class="o">.</span><span class="n">msg</span><span class="p">(</span>
<span class="s2">&quot;Canceled: Either accept the default by pressing return or specify yes/no.&quot;</span>
<span class="p">)</span>
<span class="n">delete</span> <span class="o">=</span> <span class="kc">False</span>
<span class="k">elif</span> <span class="n">answer</span><span class="o">.</span><span class="n">strip</span><span class="p">()</span><span class="o">.</span><span class="n">lower</span><span class="p">()</span> <span class="ow">in</span> <span class="p">(</span><span class="s2">&quot;n&quot;</span><span class="p">,</span> <span class="s2">&quot;no&quot;</span><span class="p">):</span>
<span class="n">caller</span><span class="o">.</span><span class="n">msg</span><span class="p">(</span><span class="s2">&quot;Canceled: No object was destroyed.&quot;</span><span class="p">)</span>
<span class="n">delete</span> <span class="o">=</span> <span class="kc">False</span>
<span class="k">if</span> <span class="n">delete</span><span class="p">:</span>
<span class="n">results</span> <span class="o">=</span> <span class="p">[]</span>
<span class="k">for</span> <span class="n">obj</span> <span class="ow">in</span> <span class="n">objs</span><span class="p">:</span>
<span class="n">results</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">delobj</span><span class="p">(</span><span class="n">obj</span><span class="p">))</span>
<span class="k">if</span> <span class="n">results</span><span class="p">:</span>
<span class="n">caller</span><span class="o">.</span><span class="n">msg</span><span class="p">(</span><span class="s2">&quot;&quot;</span><span class="o">.</span><span class="n">join</span><span class="p">(</span><span class="n">results</span><span class="p">)</span><span class="o">.</span><span class="n">strip</span><span class="p">())</span></div></div>
<div class="viewcode-block" id="CmdDig"><a class="viewcode-back" href="../../../../api/evennia.commands.default.building.html#evennia.commands.default.building.CmdDig">[docs]</a><span class="k">class</span> <span class="nc">CmdDig</span><span class="p">(</span><span class="n">ObjManipCommand</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> build new rooms and connect them to the current location</span>
<span class="sd"> Usage:</span>
<span class="sd"> dig[/switches] &lt;roomname&gt;[;alias;alias...][:typeclass]</span>
<span class="sd"> [= &lt;exit_to_there&gt;[;alias][:typeclass]]</span>
<span class="sd"> [, &lt;exit_to_here&gt;[;alias][:typeclass]]</span>
<span class="sd"> Switches:</span>
<span class="sd"> tel or teleport - move yourself to the new room</span>
<span class="sd"> Examples:</span>
<span class="sd"> dig kitchen = north;n, south;s</span>
<span class="sd"> dig house:myrooms.MyHouseTypeclass</span>
<span class="sd"> dig sheer cliff;cliff;sheer = climb up, climb down</span>
<span class="sd"> This command is a convenient way to build rooms quickly; it creates the</span>
<span class="sd"> new room and you can optionally set up exits back and forth between your</span>
<span class="sd"> current room and the new one. You can add as many aliases as you</span>
<span class="sd"> like to the name of the room and the exits in question; an example</span>
<span class="sd"> would be &#39;north;no;n&#39;.</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="n">key</span> <span class="o">=</span> <span class="s2">&quot;dig&quot;</span>
<span class="n">switch_options</span> <span class="o">=</span> <span class="p">(</span><span class="s2">&quot;teleport&quot;</span><span class="p">,)</span>
<span class="n">locks</span> <span class="o">=</span> <span class="s2">&quot;cmd:perm(dig) or perm(Builder)&quot;</span>
<span class="n">help_category</span> <span class="o">=</span> <span class="s2">&quot;Building&quot;</span>
<span class="c1"># lockstring of newly created rooms, for easy overloading.</span>
<span class="c1"># Will be formatted with the {id} of the creating object.</span>
<span class="n">new_room_lockstring</span> <span class="o">=</span> <span class="p">(</span>
<span class="s2">&quot;control:id(</span><span class="si">{id}</span><span class="s2">) or perm(Admin); &quot;</span>
<span class="s2">&quot;delete:id(</span><span class="si">{id}</span><span class="s2">) or perm(Admin); &quot;</span>
<span class="s2">&quot;edit:id(</span><span class="si">{id}</span><span class="s2">) or perm(Admin)&quot;</span>
<span class="p">)</span>
<div class="viewcode-block" id="CmdDig.func"><a class="viewcode-back" href="../../../../api/evennia.commands.default.building.html#evennia.commands.default.building.CmdDig.func">[docs]</a> <span class="k">def</span> <span class="nf">func</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;Do the digging. Inherits variables from ObjManipCommand.parse()&quot;&quot;&quot;</span>
<span class="n">caller</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">caller</span>
<span class="k">if</span> <span class="ow">not</span> <span class="bp">self</span><span class="o">.</span><span class="n">lhs</span><span class="p">:</span>
<span class="n">string</span> <span class="o">=</span> <span class="s2">&quot;Usage: dig[/teleport] &lt;roomname&gt;[;alias;alias...]&quot;</span> <span class="s2">&quot;[:parent] [= &lt;exit_there&gt;&quot;</span>
<span class="n">string</span> <span class="o">+=</span> <span class="s2">&quot;[;alias;alias..][:parent]] &quot;</span>
<span class="n">string</span> <span class="o">+=</span> <span class="s2">&quot;[, &lt;exit_back_here&gt;[;alias;alias..][:parent]]&quot;</span>
<span class="n">caller</span><span class="o">.</span><span class="n">msg</span><span class="p">(</span><span class="n">string</span><span class="p">)</span>
<span class="k">return</span>
<span class="n">room</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">lhs_objs</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span>
<span class="k">if</span> <span class="ow">not</span> <span class="n">room</span><span class="p">[</span><span class="s2">&quot;name&quot;</span><span class="p">]:</span>
<span class="n">caller</span><span class="o">.</span><span class="n">msg</span><span class="p">(</span><span class="s2">&quot;You must supply a new room name.&quot;</span><span class="p">)</span>
<span class="k">return</span>
<span class="n">location</span> <span class="o">=</span> <span class="n">caller</span><span class="o">.</span><span class="n">location</span>
<span class="c1"># Create the new room</span>
<span class="n">typeclass</span> <span class="o">=</span> <span class="n">room</span><span class="p">[</span><span class="s2">&quot;option&quot;</span><span class="p">]</span>
<span class="k">if</span> <span class="ow">not</span> <span class="n">typeclass</span><span class="p">:</span>
<span class="n">typeclass</span> <span class="o">=</span> <span class="n">settings</span><span class="o">.</span><span class="n">BASE_ROOM_TYPECLASS</span>
<span class="c1"># create room</span>
<span class="n">new_room</span> <span class="o">=</span> <span class="n">create</span><span class="o">.</span><span class="n">create_object</span><span class="p">(</span>
<span class="n">typeclass</span><span class="p">,</span> <span class="n">room</span><span class="p">[</span><span class="s2">&quot;name&quot;</span><span class="p">],</span> <span class="n">aliases</span><span class="o">=</span><span class="n">room</span><span class="p">[</span><span class="s2">&quot;aliases&quot;</span><span class="p">],</span> <span class="n">report_to</span><span class="o">=</span><span class="n">caller</span>
<span class="p">)</span>
<span class="n">lockstring</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">new_room_lockstring</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="nb">id</span><span class="o">=</span><span class="n">caller</span><span class="o">.</span><span class="n">id</span><span class="p">)</span>
<span class="n">new_room</span><span class="o">.</span><span class="n">locks</span><span class="o">.</span><span class="n">add</span><span class="p">(</span><span class="n">lockstring</span><span class="p">)</span>
<span class="n">alias_string</span> <span class="o">=</span> <span class="s2">&quot;&quot;</span>
<span class="k">if</span> <span class="n">new_room</span><span class="o">.</span><span class="n">aliases</span><span class="o">.</span><span class="n">all</span><span class="p">():</span>
<span class="n">alias_string</span> <span class="o">=</span> <span class="s2">&quot; (</span><span class="si">%s</span><span class="s2">)&quot;</span> <span class="o">%</span> <span class="s2">&quot;, &quot;</span><span class="o">.</span><span class="n">join</span><span class="p">(</span><span class="n">new_room</span><span class="o">.</span><span class="n">aliases</span><span class="o">.</span><span class="n">all</span><span class="p">())</span>
<span class="n">room_string</span> <span class="o">=</span> <span class="s2">&quot;Created room </span><span class="si">%s</span><span class="s2">(</span><span class="si">%s</span><span class="s2">)</span><span class="si">%s</span><span class="s2"> of type </span><span class="si">%s</span><span class="s2">.&quot;</span> <span class="o">%</span> <span class="p">(</span>
<span class="n">new_room</span><span class="p">,</span>
<span class="n">new_room</span><span class="o">.</span><span class="n">dbref</span><span class="p">,</span>
<span class="n">alias_string</span><span class="p">,</span>
<span class="n">typeclass</span><span class="p">,</span>
<span class="p">)</span>
<span class="c1"># create exit to room</span>
<span class="n">exit_to_string</span> <span class="o">=</span> <span class="s2">&quot;&quot;</span>
<span class="n">exit_back_string</span> <span class="o">=</span> <span class="s2">&quot;&quot;</span>
<span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">rhs_objs</span><span class="p">:</span>
<span class="n">to_exit</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">rhs_objs</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span>
<span class="k">if</span> <span class="ow">not</span> <span class="n">to_exit</span><span class="p">[</span><span class="s2">&quot;name&quot;</span><span class="p">]:</span>
<span class="n">exit_to_string</span> <span class="o">=</span> <span class="s2">&quot;</span><span class="se">\n</span><span class="s2">No exit created to new room.&quot;</span>
<span class="k">elif</span> <span class="ow">not</span> <span class="n">location</span><span class="p">:</span>
<span class="n">exit_to_string</span> <span class="o">=</span> <span class="s2">&quot;</span><span class="se">\n</span><span class="s2">You cannot create an exit from a None-location.&quot;</span>
<span class="k">else</span><span class="p">:</span>
<span class="c1"># Build the exit to the new room from the current one</span>
<span class="n">typeclass</span> <span class="o">=</span> <span class="n">to_exit</span><span class="p">[</span><span class="s2">&quot;option&quot;</span><span class="p">]</span>
<span class="k">if</span> <span class="ow">not</span> <span class="n">typeclass</span><span class="p">:</span>
<span class="n">typeclass</span> <span class="o">=</span> <span class="n">settings</span><span class="o">.</span><span class="n">BASE_EXIT_TYPECLASS</span>
<span class="n">new_to_exit</span> <span class="o">=</span> <span class="n">create</span><span class="o">.</span><span class="n">create_object</span><span class="p">(</span>
<span class="n">typeclass</span><span class="p">,</span>
<span class="n">to_exit</span><span class="p">[</span><span class="s2">&quot;name&quot;</span><span class="p">],</span>
<span class="n">location</span><span class="p">,</span>
<span class="n">aliases</span><span class="o">=</span><span class="n">to_exit</span><span class="p">[</span><span class="s2">&quot;aliases&quot;</span><span class="p">],</span>
<span class="n">locks</span><span class="o">=</span><span class="n">lockstring</span><span class="p">,</span>
<span class="n">destination</span><span class="o">=</span><span class="n">new_room</span><span class="p">,</span>
<span class="n">report_to</span><span class="o">=</span><span class="n">caller</span><span class="p">,</span>
<span class="p">)</span>
<span class="n">alias_string</span> <span class="o">=</span> <span class="s2">&quot;&quot;</span>
<span class="k">if</span> <span class="n">new_to_exit</span><span class="o">.</span><span class="n">aliases</span><span class="o">.</span><span class="n">all</span><span class="p">():</span>
<span class="n">alias_string</span> <span class="o">=</span> <span class="s2">&quot; (</span><span class="si">%s</span><span class="s2">)&quot;</span> <span class="o">%</span> <span class="s2">&quot;, &quot;</span><span class="o">.</span><span class="n">join</span><span class="p">(</span><span class="n">new_to_exit</span><span class="o">.</span><span class="n">aliases</span><span class="o">.</span><span class="n">all</span><span class="p">())</span>
<span class="n">exit_to_string</span> <span class="o">=</span> <span class="s2">&quot;</span><span class="se">\n</span><span class="s2">Created Exit from </span><span class="si">%s</span><span class="s2"> to </span><span class="si">%s</span><span class="s2">: </span><span class="si">%s</span><span class="s2">(</span><span class="si">%s</span><span class="s2">)</span><span class="si">%s</span><span class="s2">.&quot;</span>
<span class="n">exit_to_string</span> <span class="o">=</span> <span class="n">exit_to_string</span> <span class="o">%</span> <span class="p">(</span>
<span class="n">location</span><span class="o">.</span><span class="n">name</span><span class="p">,</span>
<span class="n">new_room</span><span class="o">.</span><span class="n">name</span><span class="p">,</span>
<span class="n">new_to_exit</span><span class="p">,</span>
<span class="n">new_to_exit</span><span class="o">.</span><span class="n">dbref</span><span class="p">,</span>
<span class="n">alias_string</span><span class="p">,</span>
<span class="p">)</span>
<span class="c1"># Create exit back from new room</span>
<span class="k">if</span> <span class="nb">len</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">rhs_objs</span><span class="p">)</span> <span class="o">&gt;</span> <span class="mi">1</span><span class="p">:</span>
<span class="c1"># Building the exit back to the current room</span>
<span class="n">back_exit</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">rhs_objs</span><span class="p">[</span><span class="mi">1</span><span class="p">]</span>
<span class="k">if</span> <span class="ow">not</span> <span class="n">back_exit</span><span class="p">[</span><span class="s2">&quot;name&quot;</span><span class="p">]:</span>
<span class="n">exit_back_string</span> <span class="o">=</span> <span class="s2">&quot;</span><span class="se">\n</span><span class="s2">No back exit created.&quot;</span>
<span class="k">elif</span> <span class="ow">not</span> <span class="n">location</span><span class="p">:</span>
<span class="n">exit_back_string</span> <span class="o">=</span> <span class="s2">&quot;</span><span class="se">\n</span><span class="s2">You cannot create an exit back to a None-location.&quot;</span>
<span class="k">else</span><span class="p">:</span>
<span class="n">typeclass</span> <span class="o">=</span> <span class="n">back_exit</span><span class="p">[</span><span class="s2">&quot;option&quot;</span><span class="p">]</span>
<span class="k">if</span> <span class="ow">not</span> <span class="n">typeclass</span><span class="p">:</span>
<span class="n">typeclass</span> <span class="o">=</span> <span class="n">settings</span><span class="o">.</span><span class="n">BASE_EXIT_TYPECLASS</span>
<span class="n">new_back_exit</span> <span class="o">=</span> <span class="n">create</span><span class="o">.</span><span class="n">create_object</span><span class="p">(</span>
<span class="n">typeclass</span><span class="p">,</span>
<span class="n">back_exit</span><span class="p">[</span><span class="s2">&quot;name&quot;</span><span class="p">],</span>
<span class="n">new_room</span><span class="p">,</span>
<span class="n">aliases</span><span class="o">=</span><span class="n">back_exit</span><span class="p">[</span><span class="s2">&quot;aliases&quot;</span><span class="p">],</span>
<span class="n">locks</span><span class="o">=</span><span class="n">lockstring</span><span class="p">,</span>
<span class="n">destination</span><span class="o">=</span><span class="n">location</span><span class="p">,</span>
<span class="n">report_to</span><span class="o">=</span><span class="n">caller</span><span class="p">,</span>
<span class="p">)</span>
<span class="n">alias_string</span> <span class="o">=</span> <span class="s2">&quot;&quot;</span>
<span class="k">if</span> <span class="n">new_back_exit</span><span class="o">.</span><span class="n">aliases</span><span class="o">.</span><span class="n">all</span><span class="p">():</span>
<span class="n">alias_string</span> <span class="o">=</span> <span class="s2">&quot; (</span><span class="si">%s</span><span class="s2">)&quot;</span> <span class="o">%</span> <span class="s2">&quot;, &quot;</span><span class="o">.</span><span class="n">join</span><span class="p">(</span><span class="n">new_back_exit</span><span class="o">.</span><span class="n">aliases</span><span class="o">.</span><span class="n">all</span><span class="p">())</span>
<span class="n">exit_back_string</span> <span class="o">=</span> <span class="s2">&quot;</span><span class="se">\n</span><span class="s2">Created Exit back from </span><span class="si">%s</span><span class="s2"> to </span><span class="si">%s</span><span class="s2">: </span><span class="si">%s</span><span class="s2">(</span><span class="si">%s</span><span class="s2">)</span><span class="si">%s</span><span class="s2">.&quot;</span>
<span class="n">exit_back_string</span> <span class="o">=</span> <span class="n">exit_back_string</span> <span class="o">%</span> <span class="p">(</span>
<span class="n">new_room</span><span class="o">.</span><span class="n">name</span><span class="p">,</span>
<span class="n">location</span><span class="o">.</span><span class="n">name</span><span class="p">,</span>
<span class="n">new_back_exit</span><span class="p">,</span>
<span class="n">new_back_exit</span><span class="o">.</span><span class="n">dbref</span><span class="p">,</span>
<span class="n">alias_string</span><span class="p">,</span>
<span class="p">)</span>
<span class="n">caller</span><span class="o">.</span><span class="n">msg</span><span class="p">(</span><span class="s2">&quot;</span><span class="si">%s%s%s</span><span class="s2">&quot;</span> <span class="o">%</span> <span class="p">(</span><span class="n">room_string</span><span class="p">,</span> <span class="n">exit_to_string</span><span class="p">,</span> <span class="n">exit_back_string</span><span class="p">))</span>
<span class="k">if</span> <span class="n">new_room</span> <span class="ow">and</span> <span class="s2">&quot;teleport&quot;</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">switches</span><span class="p">:</span>
<span class="n">caller</span><span class="o">.</span><span class="n">move_to</span><span class="p">(</span><span class="n">new_room</span><span class="p">)</span></div></div>
<div class="viewcode-block" id="CmdTunnel"><a class="viewcode-back" href="../../../../api/evennia.commands.default.building.html#evennia.commands.default.building.CmdTunnel">[docs]</a><span class="k">class</span> <span class="nc">CmdTunnel</span><span class="p">(</span><span class="n">COMMAND_DEFAULT_CLASS</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> create new rooms in cardinal directions only</span>
<span class="sd"> Usage:</span>
<span class="sd"> tunnel[/switch] &lt;direction&gt;[:typeclass] [= &lt;roomname&gt;[;alias;alias;...][:typeclass]]</span>
<span class="sd"> Switches:</span>
<span class="sd"> oneway - do not create an exit back to the current location</span>
<span class="sd"> tel - teleport to the newly created room</span>
<span class="sd"> Example:</span>
<span class="sd"> tunnel n</span>
<span class="sd"> tunnel n = house;mike&#39;s place;green building</span>
<span class="sd"> This is a simple way to build using pre-defined directions:</span>
<span class="sd"> |wn,ne,e,se,s,sw,w,nw|n (north, northeast etc)</span>
<span class="sd"> |wu,d|n (up and down)</span>
<span class="sd"> |wi,o|n (in and out)</span>
<span class="sd"> The full names (north, in, southwest, etc) will always be put as</span>
<span class="sd"> main name for the exit, using the abbreviation as an alias (so an</span>
<span class="sd"> exit will always be able to be used with both &quot;north&quot; as well as</span>
<span class="sd"> &quot;n&quot; for example). Opposite directions will automatically be</span>
<span class="sd"> created back from the new room unless the /oneway switch is given.</span>
<span class="sd"> For more flexibility and power in creating rooms, use dig.</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="n">key</span> <span class="o">=</span> <span class="s2">&quot;tunnel&quot;</span>
<span class="n">aliases</span> <span class="o">=</span> <span class="p">[</span><span class="s2">&quot;tun&quot;</span><span class="p">]</span>
<span class="n">switch_options</span> <span class="o">=</span> <span class="p">(</span><span class="s2">&quot;oneway&quot;</span><span class="p">,</span> <span class="s2">&quot;tel&quot;</span><span class="p">)</span>
<span class="n">locks</span> <span class="o">=</span> <span class="s2">&quot;cmd: perm(tunnel) or perm(Builder)&quot;</span>
<span class="n">help_category</span> <span class="o">=</span> <span class="s2">&quot;Building&quot;</span>
<span class="c1"># store the direction, full name and its opposite</span>
<span class="n">directions</span> <span class="o">=</span> <span class="p">{</span>
<span class="s2">&quot;n&quot;</span><span class="p">:</span> <span class="p">(</span><span class="s2">&quot;north&quot;</span><span class="p">,</span> <span class="s2">&quot;s&quot;</span><span class="p">),</span>
<span class="s2">&quot;ne&quot;</span><span class="p">:</span> <span class="p">(</span><span class="s2">&quot;northeast&quot;</span><span class="p">,</span> <span class="s2">&quot;sw&quot;</span><span class="p">),</span>
<span class="s2">&quot;e&quot;</span><span class="p">:</span> <span class="p">(</span><span class="s2">&quot;east&quot;</span><span class="p">,</span> <span class="s2">&quot;w&quot;</span><span class="p">),</span>
<span class="s2">&quot;se&quot;</span><span class="p">:</span> <span class="p">(</span><span class="s2">&quot;southeast&quot;</span><span class="p">,</span> <span class="s2">&quot;nw&quot;</span><span class="p">),</span>
<span class="s2">&quot;s&quot;</span><span class="p">:</span> <span class="p">(</span><span class="s2">&quot;south&quot;</span><span class="p">,</span> <span class="s2">&quot;n&quot;</span><span class="p">),</span>
<span class="s2">&quot;sw&quot;</span><span class="p">:</span> <span class="p">(</span><span class="s2">&quot;southwest&quot;</span><span class="p">,</span> <span class="s2">&quot;ne&quot;</span><span class="p">),</span>
<span class="s2">&quot;w&quot;</span><span class="p">:</span> <span class="p">(</span><span class="s2">&quot;west&quot;</span><span class="p">,</span> <span class="s2">&quot;e&quot;</span><span class="p">),</span>
<span class="s2">&quot;nw&quot;</span><span class="p">:</span> <span class="p">(</span><span class="s2">&quot;northwest&quot;</span><span class="p">,</span> <span class="s2">&quot;se&quot;</span><span class="p">),</span>
<span class="s2">&quot;u&quot;</span><span class="p">:</span> <span class="p">(</span><span class="s2">&quot;up&quot;</span><span class="p">,</span> <span class="s2">&quot;d&quot;</span><span class="p">),</span>
<span class="s2">&quot;d&quot;</span><span class="p">:</span> <span class="p">(</span><span class="s2">&quot;down&quot;</span><span class="p">,</span> <span class="s2">&quot;u&quot;</span><span class="p">),</span>
<span class="s2">&quot;i&quot;</span><span class="p">:</span> <span class="p">(</span><span class="s2">&quot;in&quot;</span><span class="p">,</span> <span class="s2">&quot;o&quot;</span><span class="p">),</span>
<span class="s2">&quot;o&quot;</span><span class="p">:</span> <span class="p">(</span><span class="s2">&quot;out&quot;</span><span class="p">,</span> <span class="s2">&quot;i&quot;</span><span class="p">),</span>
<span class="p">}</span>
<div class="viewcode-block" id="CmdTunnel.func"><a class="viewcode-back" href="../../../../api/evennia.commands.default.building.html#evennia.commands.default.building.CmdTunnel.func">[docs]</a> <span class="k">def</span> <span class="nf">func</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;Implements the tunnel command&quot;&quot;&quot;</span>
<span class="k">if</span> <span class="ow">not</span> <span class="bp">self</span><span class="o">.</span><span class="n">args</span> <span class="ow">or</span> <span class="ow">not</span> <span class="bp">self</span><span class="o">.</span><span class="n">lhs</span><span class="p">:</span>
<span class="n">string</span> <span class="o">=</span> <span class="p">(</span>
<span class="s2">&quot;Usage: tunnel[/switch] &lt;direction&gt;[:typeclass] [= &lt;roomname&gt;&quot;</span>
<span class="s2">&quot;[;alias;alias;...][:typeclass]]&quot;</span>
<span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">caller</span><span class="o">.</span><span class="n">msg</span><span class="p">(</span><span class="n">string</span><span class="p">)</span>
<span class="k">return</span>
<span class="c1"># If we get a typeclass, we need to get just the exitname</span>
<span class="n">exitshort</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">lhs</span><span class="o">.</span><span class="n">split</span><span class="p">(</span><span class="s2">&quot;:&quot;</span><span class="p">)[</span><span class="mi">0</span><span class="p">]</span>
<span class="k">if</span> <span class="n">exitshort</span> <span class="ow">not</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">directions</span><span class="p">:</span>
<span class="n">string</span> <span class="o">=</span> <span class="s2">&quot;tunnel can only understand the following directions: </span><span class="si">%s</span><span class="s2">.&quot;</span> <span class="o">%</span> <span class="s2">&quot;,&quot;</span><span class="o">.</span><span class="n">join</span><span class="p">(</span>
<span class="nb">sorted</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">directions</span><span class="o">.</span><span class="n">keys</span><span class="p">())</span>
<span class="p">)</span>
<span class="n">string</span> <span class="o">+=</span> <span class="s2">&quot;</span><span class="se">\n</span><span class="s2">(use dig for more freedom)&quot;</span>
<span class="bp">self</span><span class="o">.</span><span class="n">caller</span><span class="o">.</span><span class="n">msg</span><span class="p">(</span><span class="n">string</span><span class="p">)</span>
<span class="k">return</span>
<span class="c1"># retrieve all input and parse it</span>
<span class="n">exitname</span><span class="p">,</span> <span class="n">backshort</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">directions</span><span class="p">[</span><span class="n">exitshort</span><span class="p">]</span>
<span class="n">backname</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">directions</span><span class="p">[</span><span class="n">backshort</span><span class="p">][</span><span class="mi">0</span><span class="p">]</span>
<span class="c1"># if we recieved a typeclass for the exit, add it to the alias(short name)</span>
<span class="k">if</span> <span class="s2">&quot;:&quot;</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">lhs</span><span class="p">:</span>
<span class="c1"># limit to only the first : character</span>
<span class="n">exit_typeclass</span> <span class="o">=</span> <span class="s2">&quot;:&quot;</span> <span class="o">+</span> <span class="bp">self</span><span class="o">.</span><span class="n">lhs</span><span class="o">.</span><span class="n">split</span><span class="p">(</span><span class="s2">&quot;:&quot;</span><span class="p">,</span> <span class="mi">1</span><span class="p">)[</span><span class="o">-</span><span class="mi">1</span><span class="p">]</span>
<span class="c1"># exitshort and backshort are the last part of the exit strings,</span>
<span class="c1"># so we add our typeclass argument after</span>
<span class="n">exitshort</span> <span class="o">+=</span> <span class="n">exit_typeclass</span>
<span class="n">backshort</span> <span class="o">+=</span> <span class="n">exit_typeclass</span>
<span class="n">roomname</span> <span class="o">=</span> <span class="s2">&quot;Some place&quot;</span>
<span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">rhs</span><span class="p">:</span>
<span class="n">roomname</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">rhs</span> <span class="c1"># this may include aliases; that&#39;s fine.</span>
<span class="n">telswitch</span> <span class="o">=</span> <span class="s2">&quot;&quot;</span>
<span class="k">if</span> <span class="s2">&quot;tel&quot;</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">switches</span><span class="p">:</span>
<span class="n">telswitch</span> <span class="o">=</span> <span class="s2">&quot;/teleport&quot;</span>
<span class="n">backstring</span> <span class="o">=</span> <span class="s2">&quot;&quot;</span>
<span class="k">if</span> <span class="s2">&quot;oneway&quot;</span> <span class="ow">not</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">switches</span><span class="p">:</span>
<span class="n">backstring</span> <span class="o">=</span> <span class="s2">&quot;, </span><span class="si">%s</span><span class="s2">;</span><span class="si">%s</span><span class="s2">&quot;</span> <span class="o">%</span> <span class="p">(</span><span class="n">backname</span><span class="p">,</span> <span class="n">backshort</span><span class="p">)</span>
<span class="c1"># build the string we will use to call dig</span>
<span class="n">digstring</span> <span class="o">=</span> <span class="s2">&quot;dig</span><span class="si">%s</span><span class="s2"> </span><span class="si">%s</span><span class="s2"> = </span><span class="si">%s</span><span class="s2">;</span><span class="si">%s%s</span><span class="s2">&quot;</span> <span class="o">%</span> <span class="p">(</span><span class="n">telswitch</span><span class="p">,</span> <span class="n">roomname</span><span class="p">,</span> <span class="n">exitname</span><span class="p">,</span> <span class="n">exitshort</span><span class="p">,</span> <span class="n">backstring</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">execute_cmd</span><span class="p">(</span><span class="n">digstring</span><span class="p">)</span></div></div>
<div class="viewcode-block" id="CmdLink"><a class="viewcode-back" href="../../../../api/evennia.commands.default.building.html#evennia.commands.default.building.CmdLink">[docs]</a><span class="k">class</span> <span class="nc">CmdLink</span><span class="p">(</span><span class="n">COMMAND_DEFAULT_CLASS</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> link existing rooms together with exits</span>
<span class="sd"> Usage:</span>
<span class="sd"> link[/switches] &lt;object&gt; = &lt;target&gt;</span>
<span class="sd"> link[/switches] &lt;object&gt; =</span>
<span class="sd"> link[/switches] &lt;object&gt;</span>
<span class="sd"> Switch:</span>
<span class="sd"> twoway - connect two exits. For this to work, BOTH &lt;object&gt;</span>
<span class="sd"> and &lt;target&gt; must be exit objects.</span>
<span class="sd"> If &lt;object&gt; is an exit, set its destination to &lt;target&gt;. Two-way operation</span>
<span class="sd"> instead sets the destination to the *locations* of the respective given</span>
<span class="sd"> arguments.</span>
<span class="sd"> The second form (a lone =) sets the destination to None (same as</span>
<span class="sd"> the unlink command) and the third form (without =) just shows the</span>
<span class="sd"> currently set destination.</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="n">key</span> <span class="o">=</span> <span class="s2">&quot;link&quot;</span>
<span class="n">locks</span> <span class="o">=</span> <span class="s2">&quot;cmd:perm(link) or perm(Builder)&quot;</span>
<span class="n">help_category</span> <span class="o">=</span> <span class="s2">&quot;Building&quot;</span>
<div class="viewcode-block" id="CmdLink.func"><a class="viewcode-back" href="../../../../api/evennia.commands.default.building.html#evennia.commands.default.building.CmdLink.func">[docs]</a> <span class="k">def</span> <span class="nf">func</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;Perform the link&quot;&quot;&quot;</span>
<span class="n">caller</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">caller</span>
<span class="k">if</span> <span class="ow">not</span> <span class="bp">self</span><span class="o">.</span><span class="n">args</span><span class="p">:</span>
<span class="n">caller</span><span class="o">.</span><span class="n">msg</span><span class="p">(</span><span class="s2">&quot;Usage: link[/twoway] &lt;object&gt; = &lt;target&gt;&quot;</span><span class="p">)</span>
<span class="k">return</span>
<span class="n">object_name</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">lhs</span>
<span class="c1"># try to search locally first</span>
<span class="n">results</span> <span class="o">=</span> <span class="n">caller</span><span class="o">.</span><span class="n">search</span><span class="p">(</span><span class="n">object_name</span><span class="p">,</span> <span class="n">quiet</span><span class="o">=</span><span class="kc">True</span><span class="p">)</span>
<span class="k">if</span> <span class="nb">len</span><span class="p">(</span><span class="n">results</span><span class="p">)</span> <span class="o">&gt;</span> <span class="mi">1</span><span class="p">:</span> <span class="c1"># local results was a multimatch. Inform them to be more specific</span>
<span class="n">_AT_SEARCH_RESULT</span> <span class="o">=</span> <span class="n">variable_from_module</span><span class="p">(</span><span class="o">*</span><span class="n">settings</span><span class="o">.</span><span class="n">SEARCH_AT_RESULT</span><span class="o">.</span><span class="n">rsplit</span><span class="p">(</span><span class="s2">&quot;.&quot;</span><span class="p">,</span> <span class="mi">1</span><span class="p">))</span>
<span class="k">return</span> <span class="n">_AT_SEARCH_RESULT</span><span class="p">(</span><span class="n">results</span><span class="p">,</span> <span class="n">caller</span><span class="p">,</span> <span class="n">query</span><span class="o">=</span><span class="n">object_name</span><span class="p">)</span>
<span class="k">elif</span> <span class="nb">len</span><span class="p">(</span><span class="n">results</span><span class="p">)</span> <span class="o">==</span> <span class="mi">1</span><span class="p">:</span> <span class="c1"># A unique local match</span>
<span class="n">obj</span> <span class="o">=</span> <span class="n">results</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span>
<span class="k">else</span><span class="p">:</span> <span class="c1"># No matches. Search globally</span>
<span class="n">obj</span> <span class="o">=</span> <span class="n">caller</span><span class="o">.</span><span class="n">search</span><span class="p">(</span><span class="n">object_name</span><span class="p">,</span> <span class="n">global_search</span><span class="o">=</span><span class="kc">True</span><span class="p">)</span>
<span class="k">if</span> <span class="ow">not</span> <span class="n">obj</span><span class="p">:</span>
<span class="k">return</span>
<span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">rhs</span><span class="p">:</span>
<span class="c1"># this means a target name was given</span>
<span class="n">target</span> <span class="o">=</span> <span class="n">caller</span><span class="o">.</span><span class="n">search</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">rhs</span><span class="p">,</span> <span class="n">global_search</span><span class="o">=</span><span class="kc">True</span><span class="p">)</span>
<span class="k">if</span> <span class="ow">not</span> <span class="n">target</span><span class="p">:</span>
<span class="k">return</span>
<span class="k">if</span> <span class="n">target</span> <span class="o">==</span> <span class="n">obj</span><span class="p">:</span>
<span class="bp">self</span><span class="o">.</span><span class="n">caller</span><span class="o">.</span><span class="n">msg</span><span class="p">(</span><span class="s2">&quot;Cannot link an object to itself.&quot;</span><span class="p">)</span>
<span class="k">return</span>
<span class="n">string</span> <span class="o">=</span> <span class="s2">&quot;&quot;</span>
<span class="n">note</span> <span class="o">=</span> <span class="s2">&quot;Note: </span><span class="si">%s</span><span class="s2">(</span><span class="si">%s</span><span class="s2">) did not have a destination set before. Make sure you linked the right thing.&quot;</span>
<span class="k">if</span> <span class="ow">not</span> <span class="n">obj</span><span class="o">.</span><span class="n">destination</span><span class="p">:</span>
<span class="n">string</span> <span class="o">=</span> <span class="n">note</span> <span class="o">%</span> <span class="p">(</span><span class="n">obj</span><span class="o">.</span><span class="n">name</span><span class="p">,</span> <span class="n">obj</span><span class="o">.</span><span class="n">dbref</span><span class="p">)</span>
<span class="k">if</span> <span class="s2">&quot;twoway&quot;</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">switches</span><span class="p">:</span>
<span class="k">if</span> <span class="ow">not</span> <span class="p">(</span><span class="n">target</span><span class="o">.</span><span class="n">location</span> <span class="ow">and</span> <span class="n">obj</span><span class="o">.</span><span class="n">location</span><span class="p">):</span>
<span class="n">string</span> <span class="o">=</span> <span class="s2">&quot;To create a two-way link, </span><span class="si">%s</span><span class="s2"> and </span><span class="si">%s</span><span class="s2"> must both have a location&quot;</span> <span class="o">%</span> <span class="p">(</span>
<span class="n">obj</span><span class="p">,</span>
<span class="n">target</span><span class="p">,</span>
<span class="p">)</span>
<span class="n">string</span> <span class="o">+=</span> <span class="s2">&quot; (i.e. they cannot be rooms, but should be exits).&quot;</span>
<span class="bp">self</span><span class="o">.</span><span class="n">caller</span><span class="o">.</span><span class="n">msg</span><span class="p">(</span><span class="n">string</span><span class="p">)</span>
<span class="k">return</span>
<span class="k">if</span> <span class="ow">not</span> <span class="n">target</span><span class="o">.</span><span class="n">destination</span><span class="p">:</span>
<span class="n">string</span> <span class="o">+=</span> <span class="n">note</span> <span class="o">%</span> <span class="p">(</span><span class="n">target</span><span class="o">.</span><span class="n">name</span><span class="p">,</span> <span class="n">target</span><span class="o">.</span><span class="n">dbref</span><span class="p">)</span>
<span class="n">obj</span><span class="o">.</span><span class="n">destination</span> <span class="o">=</span> <span class="n">target</span><span class="o">.</span><span class="n">location</span>
<span class="n">target</span><span class="o">.</span><span class="n">destination</span> <span class="o">=</span> <span class="n">obj</span><span class="o">.</span><span class="n">location</span>
<span class="n">string</span> <span class="o">+=</span> <span class="s2">&quot;</span><span class="se">\n</span><span class="s2">Link created </span><span class="si">%s</span><span class="s2"> (in </span><span class="si">%s</span><span class="s2">) &lt;-&gt; </span><span class="si">%s</span><span class="s2"> (in </span><span class="si">%s</span><span class="s2">) (two-way).&quot;</span> <span class="o">%</span> <span class="p">(</span>
<span class="n">obj</span><span class="o">.</span><span class="n">name</span><span class="p">,</span>
<span class="n">obj</span><span class="o">.</span><span class="n">location</span><span class="p">,</span>
<span class="n">target</span><span class="o">.</span><span class="n">name</span><span class="p">,</span>
<span class="n">target</span><span class="o">.</span><span class="n">location</span><span class="p">,</span>
<span class="p">)</span>
<span class="k">else</span><span class="p">:</span>
<span class="n">obj</span><span class="o">.</span><span class="n">destination</span> <span class="o">=</span> <span class="n">target</span>
<span class="n">string</span> <span class="o">+=</span> <span class="s2">&quot;</span><span class="se">\n</span><span class="s2">Link created </span><span class="si">%s</span><span class="s2"> -&gt; </span><span class="si">%s</span><span class="s2"> (one way).&quot;</span> <span class="o">%</span> <span class="p">(</span><span class="n">obj</span><span class="o">.</span><span class="n">name</span><span class="p">,</span> <span class="n">target</span><span class="p">)</span>
<span class="k">elif</span> <span class="bp">self</span><span class="o">.</span><span class="n">rhs</span> <span class="ow">is</span> <span class="kc">None</span><span class="p">:</span>
<span class="c1"># this means that no = was given (otherwise rhs</span>
<span class="c1"># would have been an empty string). So we inspect</span>
<span class="c1"># the home/destination on object</span>
<span class="n">dest</span> <span class="o">=</span> <span class="n">obj</span><span class="o">.</span><span class="n">destination</span>
<span class="k">if</span> <span class="n">dest</span><span class="p">:</span>
<span class="n">string</span> <span class="o">=</span> <span class="s2">&quot;</span><span class="si">%s</span><span class="s2"> is an exit to </span><span class="si">%s</span><span class="s2">.&quot;</span> <span class="o">%</span> <span class="p">(</span><span class="n">obj</span><span class="o">.</span><span class="n">name</span><span class="p">,</span> <span class="n">dest</span><span class="o">.</span><span class="n">name</span><span class="p">)</span>
<span class="k">else</span><span class="p">:</span>
<span class="n">string</span> <span class="o">=</span> <span class="s2">&quot;</span><span class="si">%s</span><span class="s2"> is not an exit. Its home location is </span><span class="si">%s</span><span class="s2">.&quot;</span> <span class="o">%</span> <span class="p">(</span><span class="n">obj</span><span class="o">.</span><span class="n">name</span><span class="p">,</span> <span class="n">obj</span><span class="o">.</span><span class="n">home</span><span class="p">)</span>
<span class="k">else</span><span class="p">:</span>
<span class="c1"># We gave the command link &#39;obj = &#39; which means we want to</span>
<span class="c1"># clear destination.</span>
<span class="k">if</span> <span class="n">obj</span><span class="o">.</span><span class="n">destination</span><span class="p">:</span>
<span class="n">obj</span><span class="o">.</span><span class="n">destination</span> <span class="o">=</span> <span class="kc">None</span>
<span class="n">string</span> <span class="o">=</span> <span class="s2">&quot;Former exit </span><span class="si">%s</span><span class="s2"> no longer links anywhere.&quot;</span> <span class="o">%</span> <span class="n">obj</span><span class="o">.</span><span class="n">name</span>
<span class="k">else</span><span class="p">:</span>
<span class="n">string</span> <span class="o">=</span> <span class="s2">&quot;</span><span class="si">%s</span><span class="s2"> had no destination to unlink.&quot;</span> <span class="o">%</span> <span class="n">obj</span><span class="o">.</span><span class="n">name</span>
<span class="c1"># give feedback</span>
<span class="n">caller</span><span class="o">.</span><span class="n">msg</span><span class="p">(</span><span class="n">string</span><span class="o">.</span><span class="n">strip</span><span class="p">())</span></div></div>
<div class="viewcode-block" id="CmdUnLink"><a class="viewcode-back" href="../../../../api/evennia.commands.default.building.html#evennia.commands.default.building.CmdUnLink">[docs]</a><span class="k">class</span> <span class="nc">CmdUnLink</span><span class="p">(</span><span class="n">CmdLink</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> remove exit-connections between rooms</span>
<span class="sd"> Usage:</span>
<span class="sd"> unlink &lt;Object&gt;</span>
<span class="sd"> Unlinks an object, for example an exit, disconnecting</span>
<span class="sd"> it from whatever it was connected to.</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="c1"># this is just a child of CmdLink</span>
<span class="n">key</span> <span class="o">=</span> <span class="s2">&quot;unlink&quot;</span>
<span class="n">locks</span> <span class="o">=</span> <span class="s2">&quot;cmd:perm(unlink) or perm(Builder)&quot;</span>
<span class="n">help_key</span> <span class="o">=</span> <span class="s2">&quot;Building&quot;</span>
<div class="viewcode-block" id="CmdUnLink.func"><a class="viewcode-back" href="../../../../api/evennia.commands.default.building.html#evennia.commands.default.building.CmdUnLink.func">[docs]</a> <span class="k">def</span> <span class="nf">func</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> All we need to do here is to set the right command</span>
<span class="sd"> and call func in CmdLink</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="n">caller</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">caller</span>
<span class="k">if</span> <span class="ow">not</span> <span class="bp">self</span><span class="o">.</span><span class="n">args</span><span class="p">:</span>
<span class="n">caller</span><span class="o">.</span><span class="n">msg</span><span class="p">(</span><span class="s2">&quot;Usage: unlink &lt;object&gt;&quot;</span><span class="p">)</span>
<span class="k">return</span>
<span class="c1"># This mimics &#39;link &lt;obj&gt; = &#39; which is the same as unlink</span>
<span class="bp">self</span><span class="o">.</span><span class="n">rhs</span> <span class="o">=</span> <span class="s2">&quot;&quot;</span>
<span class="c1"># call the link functionality</span>
<span class="nb">super</span><span class="p">()</span><span class="o">.</span><span class="n">func</span><span class="p">()</span></div></div>
<div class="viewcode-block" id="CmdSetHome"><a class="viewcode-back" href="../../../../api/evennia.commands.default.building.html#evennia.commands.default.building.CmdSetHome">[docs]</a><span class="k">class</span> <span class="nc">CmdSetHome</span><span class="p">(</span><span class="n">CmdLink</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> set an object&#39;s home location</span>
<span class="sd"> Usage:</span>
<span class="sd"> sethome &lt;obj&gt; [= &lt;home_location&gt;]</span>
<span class="sd"> sethom &lt;obj&gt;</span>
<span class="sd"> The &quot;home&quot; location is a &quot;safety&quot; location for objects; they</span>
<span class="sd"> will be moved there if their current location ceases to exist. All</span>
<span class="sd"> objects should always have a home location for this reason.</span>
<span class="sd"> It is also a convenient target of the &quot;home&quot; command.</span>
<span class="sd"> If no location is given, just view the object&#39;s home location.</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="n">key</span> <span class="o">=</span> <span class="s2">&quot;sethome&quot;</span>
<span class="n">locks</span> <span class="o">=</span> <span class="s2">&quot;cmd:perm(sethome) or perm(Builder)&quot;</span>
<span class="n">help_category</span> <span class="o">=</span> <span class="s2">&quot;Building&quot;</span>
<div class="viewcode-block" id="CmdSetHome.func"><a class="viewcode-back" href="../../../../api/evennia.commands.default.building.html#evennia.commands.default.building.CmdSetHome.func">[docs]</a> <span class="k">def</span> <span class="nf">func</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;implement the command&quot;&quot;&quot;</span>
<span class="k">if</span> <span class="ow">not</span> <span class="bp">self</span><span class="o">.</span><span class="n">args</span><span class="p">:</span>
<span class="n">string</span> <span class="o">=</span> <span class="s2">&quot;Usage: sethome &lt;obj&gt; [= &lt;home_location&gt;]&quot;</span>
<span class="bp">self</span><span class="o">.</span><span class="n">caller</span><span class="o">.</span><span class="n">msg</span><span class="p">(</span><span class="n">string</span><span class="p">)</span>
<span class="k">return</span>
<span class="n">obj</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">caller</span><span class="o">.</span><span class="n">search</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">lhs</span><span class="p">,</span> <span class="n">global_search</span><span class="o">=</span><span class="kc">True</span><span class="p">)</span>
<span class="k">if</span> <span class="ow">not</span> <span class="n">obj</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">rhs</span><span class="p">:</span>
<span class="c1"># just view</span>
<span class="n">home</span> <span class="o">=</span> <span class="n">obj</span><span class="o">.</span><span class="n">home</span>
<span class="k">if</span> <span class="ow">not</span> <span class="n">home</span><span class="p">:</span>
<span class="n">string</span> <span class="o">=</span> <span class="s2">&quot;This object has no home location set!&quot;</span>
<span class="k">else</span><span class="p">:</span>
<span class="n">string</span> <span class="o">=</span> <span class="s2">&quot;</span><span class="si">%s</span><span class="s2">&#39;s current home is </span><span class="si">%s</span><span class="s2">(</span><span class="si">%s</span><span class="s2">).&quot;</span> <span class="o">%</span> <span class="p">(</span><span class="n">obj</span><span class="p">,</span> <span class="n">home</span><span class="p">,</span> <span class="n">home</span><span class="o">.</span><span class="n">dbref</span><span class="p">)</span>
<span class="k">else</span><span class="p">:</span>
<span class="c1"># set a home location</span>
<span class="n">new_home</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">caller</span><span class="o">.</span><span class="n">search</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">rhs</span><span class="p">,</span> <span class="n">global_search</span><span class="o">=</span><span class="kc">True</span><span class="p">)</span>
<span class="k">if</span> <span class="ow">not</span> <span class="n">new_home</span><span class="p">:</span>
<span class="k">return</span>
<span class="n">old_home</span> <span class="o">=</span> <span class="n">obj</span><span class="o">.</span><span class="n">home</span>
<span class="n">obj</span><span class="o">.</span><span class="n">home</span> <span class="o">=</span> <span class="n">new_home</span>
<span class="k">if</span> <span class="n">old_home</span><span class="p">:</span>
<span class="n">string</span> <span class="o">=</span> <span class="s2">&quot;Home location of </span><span class="si">%s</span><span class="s2"> was changed from </span><span class="si">%s</span><span class="s2">(</span><span class="si">%s</span><span class="s2">) to </span><span class="si">%s</span><span class="s2">(</span><span class="si">%s</span><span class="s2">).&quot;</span> <span class="o">%</span> <span class="p">(</span>
<span class="n">obj</span><span class="p">,</span>
<span class="n">old_home</span><span class="p">,</span>
<span class="n">old_home</span><span class="o">.</span><span class="n">dbref</span><span class="p">,</span>
<span class="n">new_home</span><span class="p">,</span>
<span class="n">new_home</span><span class="o">.</span><span class="n">dbref</span><span class="p">,</span>
<span class="p">)</span>
<span class="k">else</span><span class="p">:</span>
<span class="n">string</span> <span class="o">=</span> <span class="s2">&quot;Home location of </span><span class="si">%s</span><span class="s2"> was set to </span><span class="si">%s</span><span class="s2">(</span><span class="si">%s</span><span class="s2">).&quot;</span> <span class="o">%</span> <span class="p">(</span><span class="n">obj</span><span class="p">,</span> <span class="n">new_home</span><span class="p">,</span> <span class="n">new_home</span><span class="o">.</span><span class="n">dbref</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">caller</span><span class="o">.</span><span class="n">msg</span><span class="p">(</span><span class="n">string</span><span class="p">)</span></div></div>
<div class="viewcode-block" id="CmdListCmdSets"><a class="viewcode-back" href="../../../../api/evennia.commands.default.building.html#evennia.commands.default.building.CmdListCmdSets">[docs]</a><span class="k">class</span> <span class="nc">CmdListCmdSets</span><span class="p">(</span><span class="n">COMMAND_DEFAULT_CLASS</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> list command sets defined on an object</span>
<span class="sd"> Usage:</span>
<span class="sd"> cmdsets &lt;obj&gt;</span>
<span class="sd"> This displays all cmdsets assigned</span>
<span class="sd"> to a user. Defaults to yourself.</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="n">key</span> <span class="o">=</span> <span class="s2">&quot;cmdsets&quot;</span>
<span class="n">aliases</span> <span class="o">=</span> <span class="s2">&quot;listcmsets&quot;</span>
<span class="n">locks</span> <span class="o">=</span> <span class="s2">&quot;cmd:perm(listcmdsets) or perm(Builder)&quot;</span>
<span class="n">help_category</span> <span class="o">=</span> <span class="s2">&quot;Building&quot;</span>
<div class="viewcode-block" id="CmdListCmdSets.func"><a class="viewcode-back" href="../../../../api/evennia.commands.default.building.html#evennia.commands.default.building.CmdListCmdSets.func">[docs]</a> <span class="k">def</span> <span class="nf">func</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;list the cmdsets&quot;&quot;&quot;</span>
<span class="n">caller</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">caller</span>
<span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">arglist</span><span class="p">:</span>
<span class="n">obj</span> <span class="o">=</span> <span class="n">caller</span><span class="o">.</span><span class="n">search</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">arglist</span><span class="p">[</span><span class="mi">0</span><span class="p">])</span>
<span class="k">if</span> <span class="ow">not</span> <span class="n">obj</span><span class="p">:</span>
<span class="k">return</span>
<span class="k">else</span><span class="p">:</span>
<span class="n">obj</span> <span class="o">=</span> <span class="n">caller</span>
<span class="n">string</span> <span class="o">=</span> <span class="s2">&quot;</span><span class="si">%s</span><span class="s2">&quot;</span> <span class="o">%</span> <span class="n">obj</span><span class="o">.</span><span class="n">cmdset</span>
<span class="n">caller</span><span class="o">.</span><span class="n">msg</span><span class="p">(</span><span class="n">string</span><span class="p">)</span></div></div>
<div class="viewcode-block" id="CmdName"><a class="viewcode-back" href="../../../../api/evennia.commands.default.building.html#evennia.commands.default.building.CmdName">[docs]</a><span class="k">class</span> <span class="nc">CmdName</span><span class="p">(</span><span class="n">ObjManipCommand</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> change the name and/or aliases of an object</span>
<span class="sd"> Usage:</span>
<span class="sd"> name &lt;obj&gt; = &lt;newname&gt;;alias1;alias2</span>
<span class="sd"> Rename an object to something new. Use *obj to</span>
<span class="sd"> rename an account.</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="n">key</span> <span class="o">=</span> <span class="s2">&quot;name&quot;</span>
<span class="n">aliases</span> <span class="o">=</span> <span class="p">[</span><span class="s2">&quot;rename&quot;</span><span class="p">]</span>
<span class="n">locks</span> <span class="o">=</span> <span class="s2">&quot;cmd:perm(rename) or perm(Builder)&quot;</span>
<span class="n">help_category</span> <span class="o">=</span> <span class="s2">&quot;Building&quot;</span>
<div class="viewcode-block" id="CmdName.func"><a class="viewcode-back" href="../../../../api/evennia.commands.default.building.html#evennia.commands.default.building.CmdName.func">[docs]</a> <span class="k">def</span> <span class="nf">func</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;change the name&quot;&quot;&quot;</span>
<span class="n">caller</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">caller</span>
<span class="k">if</span> <span class="ow">not</span> <span class="bp">self</span><span class="o">.</span><span class="n">args</span><span class="p">:</span>
<span class="n">caller</span><span class="o">.</span><span class="n">msg</span><span class="p">(</span><span class="s2">&quot;Usage: name &lt;obj&gt; = &lt;newname&gt;[;alias;alias;...]&quot;</span><span class="p">)</span>
<span class="k">return</span>
<span class="n">obj</span> <span class="o">=</span> <span class="kc">None</span>
<span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">lhs_objs</span><span class="p">:</span>
<span class="n">objname</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">lhs_objs</span><span class="p">[</span><span class="mi">0</span><span class="p">][</span><span class="s2">&quot;name&quot;</span><span class="p">]</span>
<span class="k">if</span> <span class="n">objname</span><span class="o">.</span><span class="n">startswith</span><span class="p">(</span><span class="s2">&quot;*&quot;</span><span class="p">):</span>
<span class="c1"># account mode</span>
<span class="n">obj</span> <span class="o">=</span> <span class="n">caller</span><span class="o">.</span><span class="n">account</span><span class="o">.</span><span class="n">search</span><span class="p">(</span><span class="n">objname</span><span class="o">.</span><span class="n">lstrip</span><span class="p">(</span><span class="s2">&quot;*&quot;</span><span class="p">))</span>
<span class="k">if</span> <span class="n">obj</span><span class="p">:</span>
<span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">rhs_objs</span><span class="p">[</span><span class="mi">0</span><span class="p">][</span><span class="s2">&quot;aliases&quot;</span><span class="p">]:</span>
<span class="n">caller</span><span class="o">.</span><span class="n">msg</span><span class="p">(</span><span class="s2">&quot;Accounts can&#39;t have aliases.&quot;</span><span class="p">)</span>
<span class="k">return</span>
<span class="n">newname</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">rhs</span>
<span class="k">if</span> <span class="ow">not</span> <span class="n">newname</span><span class="p">:</span>
<span class="n">caller</span><span class="o">.</span><span class="n">msg</span><span class="p">(</span><span class="s2">&quot;No name defined!&quot;</span><span class="p">)</span>
<span class="k">return</span>
<span class="k">if</span> <span class="ow">not</span> <span class="p">(</span><span class="n">obj</span><span class="o">.</span><span class="n">access</span><span class="p">(</span><span class="n">caller</span><span class="p">,</span> <span class="s2">&quot;control&quot;</span><span class="p">)</span> <span class="ow">or</span> <span class="n">obj</span><span class="o">.</span><span class="n">access</span><span class="p">(</span><span class="n">caller</span><span class="p">,</span> <span class="s2">&quot;edit&quot;</span><span class="p">)):</span>
<span class="n">caller</span><span class="o">.</span><span class="n">msg</span><span class="p">(</span><span class="s2">&quot;You don&#39;t have right to edit this account </span><span class="si">%s</span><span class="s2">.&quot;</span> <span class="o">%</span> <span class="n">obj</span><span class="p">)</span>
<span class="k">return</span>
<span class="n">obj</span><span class="o">.</span><span class="n">username</span> <span class="o">=</span> <span class="n">newname</span>
<span class="n">obj</span><span class="o">.</span><span class="n">save</span><span class="p">()</span>
<span class="n">caller</span><span class="o">.</span><span class="n">msg</span><span class="p">(</span><span class="s2">&quot;Account&#39;s name changed to &#39;</span><span class="si">%s</span><span class="s2">&#39;.&quot;</span> <span class="o">%</span> <span class="n">newname</span><span class="p">)</span>
<span class="k">return</span>
<span class="c1"># object search, also with *</span>
<span class="n">obj</span> <span class="o">=</span> <span class="n">caller</span><span class="o">.</span><span class="n">search</span><span class="p">(</span><span class="n">objname</span><span class="p">)</span>
<span class="k">if</span> <span class="ow">not</span> <span class="n">obj</span><span class="p">:</span>
<span class="k">return</span>
<span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">rhs_objs</span><span class="p">:</span>
<span class="n">newname</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">rhs_objs</span><span class="p">[</span><span class="mi">0</span><span class="p">][</span><span class="s2">&quot;name&quot;</span><span class="p">]</span>
<span class="n">aliases</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">rhs_objs</span><span class="p">[</span><span class="mi">0</span><span class="p">][</span><span class="s2">&quot;aliases&quot;</span><span class="p">]</span>
<span class="k">else</span><span class="p">:</span>
<span class="n">newname</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">rhs</span>
<span class="n">aliases</span> <span class="o">=</span> <span class="kc">None</span>
<span class="k">if</span> <span class="ow">not</span> <span class="n">newname</span> <span class="ow">and</span> <span class="ow">not</span> <span class="n">aliases</span><span class="p">:</span>
<span class="n">caller</span><span class="o">.</span><span class="n">msg</span><span class="p">(</span><span class="s2">&quot;No names or aliases defined!&quot;</span><span class="p">)</span>
<span class="k">return</span>
<span class="k">if</span> <span class="ow">not</span> <span class="p">(</span><span class="n">obj</span><span class="o">.</span><span class="n">access</span><span class="p">(</span><span class="n">caller</span><span class="p">,</span> <span class="s2">&quot;control&quot;</span><span class="p">)</span> <span class="ow">or</span> <span class="n">obj</span><span class="o">.</span><span class="n">access</span><span class="p">(</span><span class="n">caller</span><span class="p">,</span> <span class="s2">&quot;edit&quot;</span><span class="p">)):</span>
<span class="n">caller</span><span class="o">.</span><span class="n">msg</span><span class="p">(</span><span class="s2">&quot;You don&#39;t have the right to edit </span><span class="si">%s</span><span class="s2">.&quot;</span> <span class="o">%</span> <span class="n">obj</span><span class="p">)</span>
<span class="k">return</span>
<span class="c1"># change the name and set aliases:</span>
<span class="k">if</span> <span class="n">newname</span><span class="p">:</span>
<span class="n">obj</span><span class="o">.</span><span class="n">name</span> <span class="o">=</span> <span class="n">newname</span>
<span class="n">astring</span> <span class="o">=</span> <span class="s2">&quot;&quot;</span>
<span class="k">if</span> <span class="n">aliases</span><span class="p">:</span>
<span class="p">[</span><span class="n">obj</span><span class="o">.</span><span class="n">aliases</span><span class="o">.</span><span class="n">add</span><span class="p">(</span><span class="n">alias</span><span class="p">)</span> <span class="k">for</span> <span class="n">alias</span> <span class="ow">in</span> <span class="n">aliases</span><span class="p">]</span>
<span class="n">astring</span> <span class="o">=</span> <span class="s2">&quot; (</span><span class="si">%s</span><span class="s2">)&quot;</span> <span class="o">%</span> <span class="p">(</span><span class="s2">&quot;, &quot;</span><span class="o">.</span><span class="n">join</span><span class="p">(</span><span class="n">aliases</span><span class="p">))</span>
<span class="c1"># fix for exits - we need their exit-command to change name too</span>
<span class="k">if</span> <span class="n">obj</span><span class="o">.</span><span class="n">destination</span><span class="p">:</span>
<span class="n">obj</span><span class="o">.</span><span class="n">flush_from_cache</span><span class="p">(</span><span class="n">force</span><span class="o">=</span><span class="kc">True</span><span class="p">)</span>
<span class="n">caller</span><span class="o">.</span><span class="n">msg</span><span class="p">(</span><span class="s2">&quot;Object&#39;s name changed to &#39;</span><span class="si">%s</span><span class="s2">&#39;</span><span class="si">%s</span><span class="s2">.&quot;</span> <span class="o">%</span> <span class="p">(</span><span class="n">newname</span><span class="p">,</span> <span class="n">astring</span><span class="p">))</span></div></div>
<div class="viewcode-block" id="CmdOpen"><a class="viewcode-back" href="../../../../api/evennia.commands.default.building.html#evennia.commands.default.building.CmdOpen">[docs]</a><span class="k">class</span> <span class="nc">CmdOpen</span><span class="p">(</span><span class="n">ObjManipCommand</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> open a new exit from the current room</span>
<span class="sd"> Usage:</span>
<span class="sd"> open &lt;new exit&gt;[;alias;alias..][:typeclass] [,&lt;return exit&gt;[;alias;..][:typeclass]]] = &lt;destination&gt;</span>
<span class="sd"> Handles the creation of exits. If a destination is given, the exit</span>
<span class="sd"> will point there. The &lt;return exit&gt; argument sets up an exit at the</span>
<span class="sd"> destination leading back to the current room. Destination name</span>
<span class="sd"> can be given both as a #dbref and a name, if that name is globally</span>
<span class="sd"> unique.</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="n">key</span> <span class="o">=</span> <span class="s2">&quot;open&quot;</span>
<span class="n">locks</span> <span class="o">=</span> <span class="s2">&quot;cmd:perm(open) or perm(Builder)&quot;</span>
<span class="n">help_category</span> <span class="o">=</span> <span class="s2">&quot;Building&quot;</span>
<span class="n">new_obj_lockstring</span> <span class="o">=</span> <span class="s2">&quot;control:id(</span><span class="si">{id}</span><span class="s2">) or perm(Admin);delete:id(</span><span class="si">{id}</span><span class="s2">) or perm(Admin)&quot;</span>
<span class="c1"># a custom member method to chug out exits and do checks</span>
<div class="viewcode-block" id="CmdOpen.create_exit"><a class="viewcode-back" href="../../../../api/evennia.commands.default.building.html#evennia.commands.default.building.CmdOpen.create_exit">[docs]</a> <span class="k">def</span> <span class="nf">create_exit</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">exit_name</span><span class="p">,</span> <span class="n">location</span><span class="p">,</span> <span class="n">destination</span><span class="p">,</span> <span class="n">exit_aliases</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span> <span class="n">typeclass</span><span class="o">=</span><span class="kc">None</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> Helper function to avoid code duplication.</span>
<span class="sd"> At this point we know destination is a valid location</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="n">caller</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">caller</span>
<span class="n">string</span> <span class="o">=</span> <span class="s2">&quot;&quot;</span>
<span class="c1"># check if this exit object already exists at the location.</span>
<span class="c1"># we need to ignore errors (so no automatic feedback)since we</span>
<span class="c1"># have to know the result of the search to decide what to do.</span>
<span class="n">exit_obj</span> <span class="o">=</span> <span class="n">caller</span><span class="o">.</span><span class="n">search</span><span class="p">(</span><span class="n">exit_name</span><span class="p">,</span> <span class="n">location</span><span class="o">=</span><span class="n">location</span><span class="p">,</span> <span class="n">quiet</span><span class="o">=</span><span class="kc">True</span><span class="p">,</span> <span class="n">exact</span><span class="o">=</span><span class="kc">True</span><span class="p">)</span>
<span class="k">if</span> <span class="nb">len</span><span class="p">(</span><span class="n">exit_obj</span><span class="p">)</span> <span class="o">&gt;</span> <span class="mi">1</span><span class="p">:</span>
<span class="c1"># give error message and return</span>
<span class="n">caller</span><span class="o">.</span><span class="n">search</span><span class="p">(</span><span class="n">exit_name</span><span class="p">,</span> <span class="n">location</span><span class="o">=</span><span class="n">location</span><span class="p">,</span> <span class="n">exact</span><span class="o">=</span><span class="kc">True</span><span class="p">)</span>
<span class="k">return</span> <span class="kc">None</span>
<span class="k">if</span> <span class="n">exit_obj</span><span class="p">:</span>
<span class="n">exit_obj</span> <span class="o">=</span> <span class="n">exit_obj</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span>
<span class="k">if</span> <span class="ow">not</span> <span class="n">exit_obj</span><span class="o">.</span><span class="n">destination</span><span class="p">:</span>
<span class="c1"># we are trying to link a non-exit</span>
<span class="n">string</span> <span class="o">=</span> <span class="s2">&quot;&#39;</span><span class="si">%s</span><span class="s2">&#39; already exists and is not an exit!</span><span class="se">\n</span><span class="s2">If you want to convert it &quot;</span>
<span class="n">string</span> <span class="o">+=</span> <span class="p">(</span>
<span class="s2">&quot;to an exit, you must assign an object to the &#39;destination&#39; property first.&quot;</span>
<span class="p">)</span>
<span class="n">caller</span><span class="o">.</span><span class="n">msg</span><span class="p">(</span><span class="n">string</span> <span class="o">%</span> <span class="n">exit_name</span><span class="p">)</span>
<span class="k">return</span> <span class="kc">None</span>
<span class="c1"># we are re-linking an old exit.</span>
<span class="n">old_destination</span> <span class="o">=</span> <span class="n">exit_obj</span><span class="o">.</span><span class="n">destination</span>
<span class="k">if</span> <span class="n">old_destination</span><span class="p">:</span>
<span class="n">string</span> <span class="o">=</span> <span class="s2">&quot;Exit </span><span class="si">%s</span><span class="s2"> already exists.&quot;</span> <span class="o">%</span> <span class="n">exit_name</span>
<span class="k">if</span> <span class="n">old_destination</span><span class="o">.</span><span class="n">id</span> <span class="o">!=</span> <span class="n">destination</span><span class="o">.</span><span class="n">id</span><span class="p">:</span>
<span class="c1"># reroute the old exit.</span>
<span class="n">exit_obj</span><span class="o">.</span><span class="n">destination</span> <span class="o">=</span> <span class="n">destination</span>
<span class="k">if</span> <span class="n">exit_aliases</span><span class="p">:</span>
<span class="p">[</span><span class="n">exit_obj</span><span class="o">.</span><span class="n">aliases</span><span class="o">.</span><span class="n">add</span><span class="p">(</span><span class="n">alias</span><span class="p">)</span> <span class="k">for</span> <span class="n">alias</span> <span class="ow">in</span> <span class="n">exit_aliases</span><span class="p">]</span>
<span class="n">string</span> <span class="o">+=</span> <span class="s2">&quot; Rerouted its old destination &#39;</span><span class="si">%s</span><span class="s2">&#39; to &#39;</span><span class="si">%s</span><span class="s2">&#39; and changed aliases.&quot;</span> <span class="o">%</span> <span class="p">(</span>
<span class="n">old_destination</span><span class="o">.</span><span class="n">name</span><span class="p">,</span>
<span class="n">destination</span><span class="o">.</span><span class="n">name</span><span class="p">,</span>
<span class="p">)</span>
<span class="k">else</span><span class="p">:</span>
<span class="n">string</span> <span class="o">+=</span> <span class="s2">&quot; It already points to the correct place.&quot;</span>
<span class="k">else</span><span class="p">:</span>
<span class="c1"># exit does not exist before. Create a new one.</span>
<span class="n">lockstring</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">new_obj_lockstring</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="nb">id</span><span class="o">=</span><span class="n">caller</span><span class="o">.</span><span class="n">id</span><span class="p">)</span>
<span class="k">if</span> <span class="ow">not</span> <span class="n">typeclass</span><span class="p">:</span>
<span class="n">typeclass</span> <span class="o">=</span> <span class="n">settings</span><span class="o">.</span><span class="n">BASE_EXIT_TYPECLASS</span>
<span class="n">exit_obj</span> <span class="o">=</span> <span class="n">create</span><span class="o">.</span><span class="n">create_object</span><span class="p">(</span>
<span class="n">typeclass</span><span class="p">,</span>
<span class="n">key</span><span class="o">=</span><span class="n">exit_name</span><span class="p">,</span>
<span class="n">location</span><span class="o">=</span><span class="n">location</span><span class="p">,</span>
<span class="n">aliases</span><span class="o">=</span><span class="n">exit_aliases</span><span class="p">,</span>
<span class="n">locks</span><span class="o">=</span><span class="n">lockstring</span><span class="p">,</span>
<span class="n">report_to</span><span class="o">=</span><span class="n">caller</span><span class="p">,</span>
<span class="p">)</span>
<span class="k">if</span> <span class="n">exit_obj</span><span class="p">:</span>
<span class="c1"># storing a destination is what makes it an exit!</span>
<span class="n">exit_obj</span><span class="o">.</span><span class="n">destination</span> <span class="o">=</span> <span class="n">destination</span>
<span class="n">string</span> <span class="o">=</span> <span class="p">(</span>
<span class="s2">&quot;&quot;</span>
<span class="k">if</span> <span class="ow">not</span> <span class="n">exit_aliases</span>
<span class="k">else</span> <span class="s2">&quot; (aliases: </span><span class="si">%s</span><span class="s2">)&quot;</span> <span class="o">%</span> <span class="p">(</span><span class="s2">&quot;, &quot;</span><span class="o">.</span><span class="n">join</span><span class="p">([</span><span class="nb">str</span><span class="p">(</span><span class="n">e</span><span class="p">)</span> <span class="k">for</span> <span class="n">e</span> <span class="ow">in</span> <span class="n">exit_aliases</span><span class="p">]))</span>
<span class="p">)</span>
<span class="n">string</span> <span class="o">=</span> <span class="s2">&quot;Created new Exit &#39;</span><span class="si">%s</span><span class="s2">&#39; from </span><span class="si">%s</span><span class="s2"> to </span><span class="si">%s%s</span><span class="s2">.&quot;</span> <span class="o">%</span> <span class="p">(</span>
<span class="n">exit_name</span><span class="p">,</span>
<span class="n">location</span><span class="o">.</span><span class="n">name</span><span class="p">,</span>
<span class="n">destination</span><span class="o">.</span><span class="n">name</span><span class="p">,</span>
<span class="n">string</span><span class="p">,</span>
<span class="p">)</span>
<span class="k">else</span><span class="p">:</span>
<span class="n">string</span> <span class="o">=</span> <span class="s2">&quot;Error: Exit &#39;</span><span class="si">%s</span><span class="s2">&#39; not created.&quot;</span> <span class="o">%</span> <span class="n">exit_name</span>
<span class="c1"># emit results</span>
<span class="n">caller</span><span class="o">.</span><span class="n">msg</span><span class="p">(</span><span class="n">string</span><span class="p">)</span>
<span class="k">return</span> <span class="n">exit_obj</span></div>
<div class="viewcode-block" id="CmdOpen.func"><a class="viewcode-back" href="../../../../api/evennia.commands.default.building.html#evennia.commands.default.building.CmdOpen.func">[docs]</a> <span class="k">def</span> <span class="nf">func</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> This is where the processing starts.</span>
<span class="sd"> Uses the ObjManipCommand.parser() for pre-processing</span>
<span class="sd"> as well as the self.create_exit() method.</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="n">caller</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">caller</span>
<span class="k">if</span> <span class="ow">not</span> <span class="bp">self</span><span class="o">.</span><span class="n">args</span> <span class="ow">or</span> <span class="ow">not</span> <span class="bp">self</span><span class="o">.</span><span class="n">rhs</span><span class="p">:</span>
<span class="n">string</span> <span class="o">=</span> <span class="s2">&quot;Usage: open &lt;new exit&gt;[;alias...][:typeclass][,&lt;return exit&gt;[;alias..][:typeclass]]] &quot;</span>
<span class="n">string</span> <span class="o">+=</span> <span class="s2">&quot;= &lt;destination&gt;&quot;</span>
<span class="n">caller</span><span class="o">.</span><span class="n">msg</span><span class="p">(</span><span class="n">string</span><span class="p">)</span>
<span class="k">return</span>
<span class="c1"># We must have a location to open an exit</span>
<span class="n">location</span> <span class="o">=</span> <span class="n">caller</span><span class="o">.</span><span class="n">location</span>
<span class="k">if</span> <span class="ow">not</span> <span class="n">location</span><span class="p">:</span>
<span class="n">caller</span><span class="o">.</span><span class="n">msg</span><span class="p">(</span><span class="s2">&quot;You cannot create an exit from a None-location.&quot;</span><span class="p">)</span>
<span class="k">return</span>
<span class="c1"># obtain needed info from cmdline</span>
<span class="n">exit_name</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">lhs_objs</span><span class="p">[</span><span class="mi">0</span><span class="p">][</span><span class="s2">&quot;name&quot;</span><span class="p">]</span>
<span class="n">exit_aliases</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">lhs_objs</span><span class="p">[</span><span class="mi">0</span><span class="p">][</span><span class="s2">&quot;aliases&quot;</span><span class="p">]</span>
<span class="n">exit_typeclass</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">lhs_objs</span><span class="p">[</span><span class="mi">0</span><span class="p">][</span><span class="s2">&quot;option&quot;</span><span class="p">]</span>
<span class="n">dest_name</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">rhs</span>
<span class="c1"># first, check so the destination exists.</span>
<span class="n">destination</span> <span class="o">=</span> <span class="n">caller</span><span class="o">.</span><span class="n">search</span><span class="p">(</span><span class="n">dest_name</span><span class="p">,</span> <span class="n">global_search</span><span class="o">=</span><span class="kc">True</span><span class="p">)</span>
<span class="k">if</span> <span class="ow">not</span> <span class="n">destination</span><span class="p">:</span>
<span class="k">return</span>
<span class="c1"># Create exit</span>
<span class="n">ok</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">create_exit</span><span class="p">(</span><span class="n">exit_name</span><span class="p">,</span> <span class="n">location</span><span class="p">,</span> <span class="n">destination</span><span class="p">,</span> <span class="n">exit_aliases</span><span class="p">,</span> <span class="n">exit_typeclass</span><span class="p">)</span>
<span class="k">if</span> <span class="ow">not</span> <span class="n">ok</span><span class="p">:</span>
<span class="c1"># an error; the exit was not created, so we quit.</span>
<span class="k">return</span>
<span class="c1"># Create back exit, if any</span>
<span class="k">if</span> <span class="nb">len</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">lhs_objs</span><span class="p">)</span> <span class="o">&gt;</span> <span class="mi">1</span><span class="p">:</span>
<span class="n">back_exit_name</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">lhs_objs</span><span class="p">[</span><span class="mi">1</span><span class="p">][</span><span class="s2">&quot;name&quot;</span><span class="p">]</span>
<span class="n">back_exit_aliases</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">lhs_objs</span><span class="p">[</span><span class="mi">1</span><span class="p">][</span><span class="s2">&quot;aliases&quot;</span><span class="p">]</span>
<span class="n">back_exit_typeclass</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">lhs_objs</span><span class="p">[</span><span class="mi">1</span><span class="p">][</span><span class="s2">&quot;option&quot;</span><span class="p">]</span>
<span class="bp">self</span><span class="o">.</span><span class="n">create_exit</span><span class="p">(</span>
<span class="n">back_exit_name</span><span class="p">,</span> <span class="n">destination</span><span class="p">,</span> <span class="n">location</span><span class="p">,</span> <span class="n">back_exit_aliases</span><span class="p">,</span> <span class="n">back_exit_typeclass</span>
<span class="p">)</span></div></div>
<span class="k">def</span> <span class="nf">_convert_from_string</span><span class="p">(</span><span class="n">cmd</span><span class="p">,</span> <span class="n">strobj</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> Converts a single object in *string form* to its equivalent python</span>
<span class="sd"> type.</span>
<span class="sd"> Python earlier than 2.6:</span>
<span class="sd"> Handles floats, ints, and limited nested lists and dicts</span>
<span class="sd"> (can&#39;t handle lists in a dict, for example, this is mainly due to</span>
<span class="sd"> the complexity of parsing this rather than any technical difficulty -</span>
<span class="sd"> if there is a need for set-ing such complex structures on the</span>
<span class="sd"> command line we might consider adding it).</span>
<span class="sd"> Python 2.6 and later:</span>
<span class="sd"> Supports all Python structures through literal_eval as long as they</span>
<span class="sd"> are valid Python syntax. If they are not (such as [test, test2], ie</span>
<span class="sd"> without the quotes around the strings), the entire structure will</span>
<span class="sd"> be converted to a string and a warning will be given.</span>
<span class="sd"> We need to convert like this since all data being sent over the</span>
<span class="sd"> telnet connection by the Account is text - but we will want to</span>
<span class="sd"> store it as the &quot;real&quot; python type so we can do convenient</span>
<span class="sd"> comparisons later (e.g. obj.db.value = 2, if value is stored as a</span>
<span class="sd"> string this will always fail).</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="c1"># Use literal_eval to parse python structure exactly.</span>
<span class="k">try</span><span class="p">:</span>
<span class="k">return</span> <span class="n">_LITERAL_EVAL</span><span class="p">(</span><span class="n">strobj</span><span class="p">)</span>
<span class="k">except</span> <span class="p">(</span><span class="ne">SyntaxError</span><span class="p">,</span> <span class="ne">ValueError</span><span class="p">):</span>
<span class="c1"># treat as string</span>
<span class="n">strobj</span> <span class="o">=</span> <span class="n">utils</span><span class="o">.</span><span class="n">to_str</span><span class="p">(</span><span class="n">strobj</span><span class="p">)</span>
<span class="n">string</span> <span class="o">=</span> <span class="p">(</span>
<span class="s1">&#39;|RNote: name &quot;|r</span><span class="si">%s</span><span class="s1">|R&quot; was converted to a string. &#39;</span>
<span class="s2">&quot;Make sure this is acceptable.&quot;</span> <span class="o">%</span> <span class="n">strobj</span>
<span class="p">)</span>
<span class="n">cmd</span><span class="o">.</span><span class="n">caller</span><span class="o">.</span><span class="n">msg</span><span class="p">(</span><span class="n">string</span><span class="p">)</span>
<span class="k">return</span> <span class="n">strobj</span>
<span class="k">except</span> <span class="ne">Exception</span> <span class="k">as</span> <span class="n">err</span><span class="p">:</span>
<span class="n">string</span> <span class="o">=</span> <span class="s2">&quot;|RUnknown error in evaluating Attribute: </span><span class="si">{}</span><span class="s2">&quot;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">err</span><span class="p">)</span>
<span class="k">return</span> <span class="n">string</span>
<div class="viewcode-block" id="CmdSetAttribute"><a class="viewcode-back" href="../../../../api/evennia.commands.default.building.html#evennia.commands.default.building.CmdSetAttribute">[docs]</a><span class="k">class</span> <span class="nc">CmdSetAttribute</span><span class="p">(</span><span class="n">ObjManipCommand</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> set attribute on an object or account</span>
<span class="sd"> Usage:</span>
<span class="sd"> set &lt;obj&gt;/&lt;attr&gt; = &lt;value&gt;</span>
<span class="sd"> set &lt;obj&gt;/&lt;attr&gt; =</span>
<span class="sd"> set &lt;obj&gt;/&lt;attr&gt;</span>
<span class="sd"> set *&lt;account&gt;/&lt;attr&gt; = &lt;value&gt;</span>
<span class="sd"> Switch:</span>
<span class="sd"> edit: Open the line editor (string values only)</span>
<span class="sd"> script: If we&#39;re trying to set an attribute on a script</span>
<span class="sd"> channel: If we&#39;re trying to set an attribute on a channel</span>
<span class="sd"> account: If we&#39;re trying to set an attribute on an account</span>
<span class="sd"> room: Setting an attribute on a room (global search)</span>
<span class="sd"> exit: Setting an attribute on an exit (global search)</span>
<span class="sd"> char: Setting an attribute on a character (global search)</span>
<span class="sd"> character: Alias for char, as above.</span>
<span class="sd"> Sets attributes on objects. The second example form above clears a</span>
<span class="sd"> previously set attribute while the third form inspects the current value of</span>
<span class="sd"> the attribute (if any). The last one (with the star) is a shortcut for</span>
<span class="sd"> operating on a player Account rather than an Object.</span>
<span class="sd"> The most common data to save with this command are strings and</span>
<span class="sd"> numbers. You can however also set Python primitives such as lists,</span>
<span class="sd"> dictionaries and tuples on objects (this might be important for</span>
<span class="sd"> the functionality of certain custom objects). This is indicated</span>
<span class="sd"> by you starting your value with one of |c&#39;|n, |c&quot;|n, |c(|n, |c[|n</span>
<span class="sd"> or |c{ |n.</span>
<span class="sd"> Once you have stored a Python primitive as noted above, you can include</span>
<span class="sd"> |c[&lt;key&gt;]|n in &lt;attr&gt; to reference nested values in e.g. a list or dict.</span>
<span class="sd"> Remember that if you use Python primitives like this, you must</span>
<span class="sd"> write proper Python syntax too - notably you must include quotes</span>
<span class="sd"> around your strings or you will get an error.</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="n">key</span> <span class="o">=</span> <span class="s2">&quot;set&quot;</span>
<span class="n">locks</span> <span class="o">=</span> <span class="s2">&quot;cmd:perm(set) or perm(Builder)&quot;</span>
<span class="n">help_category</span> <span class="o">=</span> <span class="s2">&quot;Building&quot;</span>
<span class="n">nested_re</span> <span class="o">=</span> <span class="n">re</span><span class="o">.</span><span class="n">compile</span><span class="p">(</span><span class="sa">r</span><span class="s2">&quot;\[.*?\]&quot;</span><span class="p">)</span>
<span class="n">not_found</span> <span class="o">=</span> <span class="nb">object</span><span class="p">()</span>
<div class="viewcode-block" id="CmdSetAttribute.check_obj"><a class="viewcode-back" href="../../../../api/evennia.commands.default.building.html#evennia.commands.default.building.CmdSetAttribute.check_obj">[docs]</a> <span class="k">def</span> <span class="nf">check_obj</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">obj</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> This may be overridden by subclasses in case restrictions need to be</span>
<span class="sd"> placed on whether certain objects can have attributes set by certain</span>
<span class="sd"> accounts.</span>
<span class="sd"> This function is expected to display its own error message.</span>
<span class="sd"> Returning False will abort the command.</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="k">return</span> <span class="kc">True</span></div>
<div class="viewcode-block" id="CmdSetAttribute.check_attr"><a class="viewcode-back" href="../../../../api/evennia.commands.default.building.html#evennia.commands.default.building.CmdSetAttribute.check_attr">[docs]</a> <span class="k">def</span> <span class="nf">check_attr</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">obj</span><span class="p">,</span> <span class="n">attr_name</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> This may be overridden by subclasses in case restrictions need to be</span>
<span class="sd"> placed on what attributes can be set by who beyond the normal lock.</span>
<span class="sd"> This functions is expected to display its own error message. It is</span>
<span class="sd"> run once for every attribute that is checked, blocking only those</span>
<span class="sd"> attributes which are not permitted and letting the others through.</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="k">return</span> <span class="n">attr_name</span></div>
<div class="viewcode-block" id="CmdSetAttribute.split_nested_attr"><a class="viewcode-back" href="../../../../api/evennia.commands.default.building.html#evennia.commands.default.building.CmdSetAttribute.split_nested_attr">[docs]</a> <span class="k">def</span> <span class="nf">split_nested_attr</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">attr</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> Yields tuples of (possible attr name, nested keys on that attr).</span>
<span class="sd"> For performance, this is biased to the deepest match, but allows compatability</span>
<span class="sd"> with older attrs that might have been named with `[]`&#39;s.</span>
<span class="sd"> &gt; list(split_nested_attr(&quot;nested[&#39;asdf&#39;][0]&quot;))</span>
<span class="sd"> [</span>
<span class="sd"> (&#39;nested&#39;, [&#39;asdf&#39;, 0]),</span>
<span class="sd"> (&quot;nested[&#39;asdf&#39;]&quot;, [0]),</span>
<span class="sd"> (&quot;nested[&#39;asdf&#39;][0]&quot;, []),</span>
<span class="sd"> ]</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="n">quotes</span> <span class="o">=</span> <span class="s2">&quot;</span><span class="se">\&quot;</span><span class="s2">&#39;&quot;</span>
<span class="k">def</span> <span class="nf">clean_key</span><span class="p">(</span><span class="n">val</span><span class="p">):</span>
<span class="n">val</span> <span class="o">=</span> <span class="n">val</span><span class="o">.</span><span class="n">strip</span><span class="p">(</span><span class="s2">&quot;[]&quot;</span><span class="p">)</span>
<span class="k">if</span> <span class="n">val</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span> <span class="ow">in</span> <span class="n">quotes</span><span class="p">:</span>
<span class="k">return</span> <span class="n">val</span><span class="o">.</span><span class="n">strip</span><span class="p">(</span><span class="n">quotes</span><span class="p">)</span>
<span class="k">if</span> <span class="n">val</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span> <span class="o">==</span> <span class="n">LIST_APPEND_CHAR</span><span class="p">:</span>
<span class="c1"># List insert/append syntax</span>
<span class="k">return</span> <span class="n">val</span>
<span class="k">try</span><span class="p">:</span>
<span class="k">return</span> <span class="nb">int</span><span class="p">(</span><span class="n">val</span><span class="p">)</span>
<span class="k">except</span> <span class="ne">ValueError</span><span class="p">:</span>
<span class="k">return</span> <span class="n">val</span>
<span class="n">parts</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">nested_re</span><span class="o">.</span><span class="n">findall</span><span class="p">(</span><span class="n">attr</span><span class="p">)</span>
<span class="n">base_attr</span> <span class="o">=</span> <span class="s2">&quot;&quot;</span>
<span class="k">if</span> <span class="n">parts</span><span class="p">:</span>
<span class="n">base_attr</span> <span class="o">=</span> <span class="n">attr</span><span class="p">[:</span> <span class="n">attr</span><span class="o">.</span><span class="n">find</span><span class="p">(</span><span class="n">parts</span><span class="p">[</span><span class="mi">0</span><span class="p">])]</span>
<span class="k">for</span> <span class="n">index</span><span class="p">,</span> <span class="n">part</span> <span class="ow">in</span> <span class="nb">enumerate</span><span class="p">(</span><span class="n">parts</span><span class="p">):</span>
<span class="k">yield</span> <span class="p">(</span><span class="n">base_attr</span><span class="p">,</span> <span class="p">[</span><span class="n">clean_key</span><span class="p">(</span><span class="n">p</span><span class="p">)</span> <span class="k">for</span> <span class="n">p</span> <span class="ow">in</span> <span class="n">parts</span><span class="p">[</span><span class="n">index</span><span class="p">:]])</span>
<span class="n">base_attr</span> <span class="o">+=</span> <span class="n">part</span>
<span class="k">yield</span> <span class="p">(</span><span class="n">attr</span><span class="p">,</span> <span class="p">[])</span></div>
<div class="viewcode-block" id="CmdSetAttribute.do_nested_lookup"><a class="viewcode-back" href="../../../../api/evennia.commands.default.building.html#evennia.commands.default.building.CmdSetAttribute.do_nested_lookup">[docs]</a> <span class="k">def</span> <span class="nf">do_nested_lookup</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">value</span><span class="p">,</span> <span class="o">*</span><span class="n">keys</span><span class="p">):</span>
<span class="n">result</span> <span class="o">=</span> <span class="n">value</span>
<span class="k">for</span> <span class="n">key</span> <span class="ow">in</span> <span class="n">keys</span><span class="p">:</span>
<span class="k">try</span><span class="p">:</span>
<span class="n">result</span> <span class="o">=</span> <span class="n">result</span><span class="o">.</span><span class="fm">__getitem__</span><span class="p">(</span><span class="n">key</span><span class="p">)</span>
<span class="k">except</span> <span class="p">(</span><span class="ne">IndexError</span><span class="p">,</span> <span class="ne">KeyError</span><span class="p">,</span> <span class="ne">TypeError</span><span class="p">):</span>
<span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">not_found</span>
<span class="k">return</span> <span class="n">result</span></div>
<div class="viewcode-block" id="CmdSetAttribute.view_attr"><a class="viewcode-back" href="../../../../api/evennia.commands.default.building.html#evennia.commands.default.building.CmdSetAttribute.view_attr">[docs]</a> <span class="k">def</span> <span class="nf">view_attr</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">obj</span><span class="p">,</span> <span class="n">attr</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> Look up the value of an attribute and return a string displaying it.</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="n">nested</span> <span class="o">=</span> <span class="kc">False</span>
<span class="k">for</span> <span class="n">key</span><span class="p">,</span> <span class="n">nested_keys</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">split_nested_attr</span><span class="p">(</span><span class="n">attr</span><span class="p">):</span>
<span class="n">nested</span> <span class="o">=</span> <span class="kc">True</span>
<span class="k">if</span> <span class="n">obj</span><span class="o">.</span><span class="n">attributes</span><span class="o">.</span><span class="n">has</span><span class="p">(</span><span class="n">key</span><span class="p">):</span>
<span class="n">val</span> <span class="o">=</span> <span class="n">obj</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="n">key</span><span class="p">)</span>
<span class="n">val</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">do_nested_lookup</span><span class="p">(</span><span class="n">val</span><span class="p">,</span> <span class="o">*</span><span class="n">nested_keys</span><span class="p">)</span>
<span class="k">if</span> <span class="n">val</span> <span class="ow">is</span> <span class="ow">not</span> <span class="bp">self</span><span class="o">.</span><span class="n">not_found</span><span class="p">:</span>
<span class="k">return</span> <span class="s2">&quot;</span><span class="se">\n</span><span class="s2">Attribute </span><span class="si">%s</span><span class="s2">/</span><span class="si">%s</span><span class="s2"> = </span><span class="si">%s</span><span class="s2">&quot;</span> <span class="o">%</span> <span class="p">(</span><span class="n">obj</span><span class="o">.</span><span class="n">name</span><span class="p">,</span> <span class="n">attr</span><span class="p">,</span> <span class="n">val</span><span class="p">)</span>
<span class="n">error</span> <span class="o">=</span> <span class="s2">&quot;</span><span class="se">\n</span><span class="si">%s</span><span class="s2"> has no attribute &#39;</span><span class="si">%s</span><span class="s2">&#39;.&quot;</span> <span class="o">%</span> <span class="p">(</span><span class="n">obj</span><span class="o">.</span><span class="n">name</span><span class="p">,</span> <span class="n">attr</span><span class="p">)</span>
<span class="k">if</span> <span class="n">nested</span><span class="p">:</span>
<span class="n">error</span> <span class="o">+=</span> <span class="s2">&quot; (Nested lookups attempted)&quot;</span>
<span class="k">return</span> <span class="n">error</span></div>
<div class="viewcode-block" id="CmdSetAttribute.rm_attr"><a class="viewcode-back" href="../../../../api/evennia.commands.default.building.html#evennia.commands.default.building.CmdSetAttribute.rm_attr">[docs]</a> <span class="k">def</span> <span class="nf">rm_attr</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">obj</span><span class="p">,</span> <span class="n">attr</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> Remove an attribute from the object, or a nested data structure, and report back.</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="n">nested</span> <span class="o">=</span> <span class="kc">False</span>
<span class="k">for</span> <span class="n">key</span><span class="p">,</span> <span class="n">nested_keys</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">split_nested_attr</span><span class="p">(</span><span class="n">attr</span><span class="p">):</span>
<span class="n">nested</span> <span class="o">=</span> <span class="kc">True</span>
<span class="k">if</span> <span class="n">obj</span><span class="o">.</span><span class="n">attributes</span><span class="o">.</span><span class="n">has</span><span class="p">(</span><span class="n">key</span><span class="p">):</span>
<span class="k">if</span> <span class="n">nested_keys</span><span class="p">:</span>
<span class="n">del_key</span> <span class="o">=</span> <span class="n">nested_keys</span><span class="p">[</span><span class="o">-</span><span class="mi">1</span><span class="p">]</span>
<span class="n">val</span> <span class="o">=</span> <span class="n">obj</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="n">key</span><span class="p">)</span>
<span class="n">deep</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">do_nested_lookup</span><span class="p">(</span><span class="n">val</span><span class="p">,</span> <span class="o">*</span><span class="n">nested_keys</span><span class="p">[:</span><span class="o">-</span><span class="mi">1</span><span class="p">])</span>
<span class="k">if</span> <span class="n">deep</span> <span class="ow">is</span> <span class="ow">not</span> <span class="bp">self</span><span class="o">.</span><span class="n">not_found</span><span class="p">:</span>
<span class="k">try</span><span class="p">:</span>
<span class="k">del</span> <span class="n">deep</span><span class="p">[</span><span class="n">del_key</span><span class="p">]</span>
<span class="k">except</span> <span class="p">(</span><span class="ne">IndexError</span><span class="p">,</span> <span class="ne">KeyError</span><span class="p">,</span> <span class="ne">TypeError</span><span class="p">):</span>
<span class="k">continue</span>
<span class="k">return</span> <span class="s2">&quot;</span><span class="se">\n</span><span class="s2">Deleted attribute &#39;</span><span class="si">%s</span><span class="s2">&#39; (= nested) from </span><span class="si">%s</span><span class="s2">.&quot;</span> <span class="o">%</span> <span class="p">(</span><span class="n">attr</span><span class="p">,</span> <span class="n">obj</span><span class="o">.</span><span class="n">name</span><span class="p">)</span>
<span class="k">else</span><span class="p">:</span>
<span class="n">exists</span> <span class="o">=</span> <span class="n">obj</span><span class="o">.</span><span class="n">attributes</span><span class="o">.</span><span class="n">has</span><span class="p">(</span><span class="n">key</span><span class="p">)</span>
<span class="n">obj</span><span class="o">.</span><span class="n">attributes</span><span class="o">.</span><span class="n">remove</span><span class="p">(</span><span class="n">attr</span><span class="p">)</span>
<span class="k">return</span> <span class="s2">&quot;</span><span class="se">\n</span><span class="s2">Deleted attribute &#39;</span><span class="si">%s</span><span class="s2">&#39; (= </span><span class="si">%s</span><span class="s2">) from </span><span class="si">%s</span><span class="s2">.&quot;</span> <span class="o">%</span> <span class="p">(</span><span class="n">attr</span><span class="p">,</span> <span class="n">exists</span><span class="p">,</span> <span class="n">obj</span><span class="o">.</span><span class="n">name</span><span class="p">)</span>
<span class="n">error</span> <span class="o">=</span> <span class="s2">&quot;</span><span class="se">\n</span><span class="si">%s</span><span class="s2"> has no attribute &#39;</span><span class="si">%s</span><span class="s2">&#39;.&quot;</span> <span class="o">%</span> <span class="p">(</span><span class="n">obj</span><span class="o">.</span><span class="n">name</span><span class="p">,</span> <span class="n">attr</span><span class="p">)</span>
<span class="k">if</span> <span class="n">nested</span><span class="p">:</span>
<span class="n">error</span> <span class="o">+=</span> <span class="s2">&quot; (Nested lookups attempted)&quot;</span>
<span class="k">return</span> <span class="n">error</span></div>
<div class="viewcode-block" id="CmdSetAttribute.set_attr"><a class="viewcode-back" href="../../../../api/evennia.commands.default.building.html#evennia.commands.default.building.CmdSetAttribute.set_attr">[docs]</a> <span class="k">def</span> <span class="nf">set_attr</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">obj</span><span class="p">,</span> <span class="n">attr</span><span class="p">,</span> <span class="n">value</span><span class="p">):</span>
<span class="n">done</span> <span class="o">=</span> <span class="kc">False</span>
<span class="k">for</span> <span class="n">key</span><span class="p">,</span> <span class="n">nested_keys</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">split_nested_attr</span><span class="p">(</span><span class="n">attr</span><span class="p">):</span>
<span class="k">if</span> <span class="n">obj</span><span class="o">.</span><span class="n">attributes</span><span class="o">.</span><span class="n">has</span><span class="p">(</span><span class="n">key</span><span class="p">)</span> <span class="ow">and</span> <span class="n">nested_keys</span><span class="p">:</span>
<span class="n">acc_key</span> <span class="o">=</span> <span class="n">nested_keys</span><span class="p">[</span><span class="o">-</span><span class="mi">1</span><span class="p">]</span>
<span class="n">lookup_value</span> <span class="o">=</span> <span class="n">obj</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="n">key</span><span class="p">)</span>
<span class="n">deep</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">do_nested_lookup</span><span class="p">(</span><span class="n">lookup_value</span><span class="p">,</span> <span class="o">*</span><span class="n">nested_keys</span><span class="p">[:</span><span class="o">-</span><span class="mi">1</span><span class="p">])</span>
<span class="k">if</span> <span class="n">deep</span> <span class="ow">is</span> <span class="ow">not</span> <span class="bp">self</span><span class="o">.</span><span class="n">not_found</span><span class="p">:</span>
<span class="c1"># To support appending and inserting to lists</span>
<span class="c1"># a key that starts with LIST_APPEND_CHAR will insert a new item at that</span>
<span class="c1"># location, and move the other elements down.</span>
<span class="c1"># Using LIST_APPEND_CHAR alone will append to the list</span>
<span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">acc_key</span><span class="p">,</span> <span class="nb">str</span><span class="p">)</span> <span class="ow">and</span> <span class="n">acc_key</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span> <span class="o">==</span> <span class="n">LIST_APPEND_CHAR</span><span class="p">:</span>
<span class="k">try</span><span class="p">:</span>
<span class="k">if</span> <span class="nb">len</span><span class="p">(</span><span class="n">acc_key</span><span class="p">)</span> <span class="o">&gt;</span> <span class="mi">1</span><span class="p">:</span>
<span class="n">where</span> <span class="o">=</span> <span class="nb">int</span><span class="p">(</span><span class="n">acc_key</span><span class="p">[</span><span class="mi">1</span><span class="p">:])</span>
<span class="n">deep</span><span class="o">.</span><span class="n">insert</span><span class="p">(</span><span class="n">where</span><span class="p">,</span> <span class="n">value</span><span class="p">)</span>
<span class="k">else</span><span class="p">:</span>
<span class="n">deep</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">value</span><span class="p">)</span>
<span class="k">except</span> <span class="p">(</span><span class="ne">ValueError</span><span class="p">,</span> <span class="ne">AttributeError</span><span class="p">):</span>
<span class="k">pass</span>
<span class="k">else</span><span class="p">:</span>
<span class="n">value</span> <span class="o">=</span> <span class="n">lookup_value</span>
<span class="n">attr</span> <span class="o">=</span> <span class="n">key</span>
<span class="n">done</span> <span class="o">=</span> <span class="kc">True</span>
<span class="k">break</span>
<span class="c1"># List magic failed, just use like a key/index</span>
<span class="k">try</span><span class="p">:</span>
<span class="n">deep</span><span class="p">[</span><span class="n">acc_key</span><span class="p">]</span> <span class="o">=</span> <span class="n">value</span>
<span class="k">except</span> <span class="ne">TypeError</span> <span class="k">as</span> <span class="n">err</span><span class="p">:</span>
<span class="c1"># Tuples can&#39;t be modified</span>
<span class="k">return</span> <span class="s2">&quot;</span><span class="se">\n</span><span class="si">%s</span><span class="s2"> - </span><span class="si">%s</span><span class="s2">&quot;</span> <span class="o">%</span> <span class="p">(</span><span class="n">err</span><span class="p">,</span> <span class="n">deep</span><span class="p">)</span>
<span class="n">value</span> <span class="o">=</span> <span class="n">lookup_value</span>
<span class="n">attr</span> <span class="o">=</span> <span class="n">key</span>
<span class="n">done</span> <span class="o">=</span> <span class="kc">True</span>
<span class="k">break</span>
<span class="n">verb</span> <span class="o">=</span> <span class="s2">&quot;Modified&quot;</span> <span class="k">if</span> <span class="n">obj</span><span class="o">.</span><span class="n">attributes</span><span class="o">.</span><span class="n">has</span><span class="p">(</span><span class="n">attr</span><span class="p">)</span> <span class="k">else</span> <span class="s2">&quot;Created&quot;</span>
<span class="k">try</span><span class="p">:</span>
<span class="k">if</span> <span class="ow">not</span> <span class="n">done</span><span class="p">:</span>
<span class="n">obj</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="n">attr</span><span class="p">,</span> <span class="n">value</span><span class="p">)</span>
<span class="k">return</span> <span class="s2">&quot;</span><span class="se">\n</span><span class="si">%s</span><span class="s2"> attribute </span><span class="si">%s</span><span class="s2">/</span><span class="si">%s</span><span class="s2"> = </span><span class="si">%s</span><span class="s2">&quot;</span> <span class="o">%</span> <span class="p">(</span><span class="n">verb</span><span class="p">,</span> <span class="n">obj</span><span class="o">.</span><span class="n">name</span><span class="p">,</span> <span class="n">attr</span><span class="p">,</span> <span class="nb">repr</span><span class="p">(</span><span class="n">value</span><span class="p">))</span>
<span class="k">except</span> <span class="ne">SyntaxError</span><span class="p">:</span>
<span class="c1"># this means literal_eval tried to parse a faulty string</span>
<span class="k">return</span> <span class="p">(</span>
<span class="s2">&quot;</span><span class="se">\n</span><span class="s2">|RCritical Python syntax error in your value. Only &quot;</span>
<span class="s2">&quot;primitive Python structures are allowed.</span><span class="se">\n</span><span class="s2">You also &quot;</span>
<span class="s2">&quot;need to use correct Python syntax. Remember especially &quot;</span>
<span class="s2">&quot;to put quotes around all strings inside lists and &quot;</span>
<span class="s2">&quot;dicts.|n&quot;</span>
<span class="p">)</span></div>
<div class="viewcode-block" id="CmdSetAttribute.edit_handler"><a class="viewcode-back" href="../../../../api/evennia.commands.default.building.html#evennia.commands.default.building.CmdSetAttribute.edit_handler">[docs]</a> <span class="k">def</span> <span class="nf">edit_handler</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">obj</span><span class="p">,</span> <span class="n">attr</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;Activate the line editor&quot;&quot;&quot;</span>
<span class="k">def</span> <span class="nf">load</span><span class="p">(</span><span class="n">caller</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;Called for the editor to load the buffer&quot;&quot;&quot;</span>
<span class="n">old_value</span> <span class="o">=</span> <span class="n">obj</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="n">attr</span><span class="p">)</span>
<span class="k">if</span> <span class="n">old_value</span> <span class="ow">is</span> <span class="ow">not</span> <span class="kc">None</span> <span class="ow">and</span> <span class="ow">not</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">old_value</span><span class="p">,</span> <span class="nb">str</span><span class="p">):</span>
<span class="n">typ</span> <span class="o">=</span> <span class="nb">type</span><span class="p">(</span><span class="n">old_value</span><span class="p">)</span><span class="o">.</span><span class="vm">__name__</span>
<span class="bp">self</span><span class="o">.</span><span class="n">caller</span><span class="o">.</span><span class="n">msg</span><span class="p">(</span>
<span class="s2">&quot;|RWARNING! Saving this buffer will overwrite the &quot;</span>
<span class="s2">&quot;current attribute (of type </span><span class="si">%s</span><span class="s2">) with a string!|n&quot;</span> <span class="o">%</span> <span class="n">typ</span>
<span class="p">)</span>
<span class="k">return</span> <span class="nb">str</span><span class="p">(</span><span class="n">old_value</span><span class="p">)</span>
<span class="k">return</span> <span class="n">old_value</span>
<span class="k">def</span> <span class="nf">save</span><span class="p">(</span><span class="n">caller</span><span class="p">,</span> <span class="n">buf</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;Called when editor saves its buffer.&quot;&quot;&quot;</span>
<span class="n">obj</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="n">attr</span><span class="p">,</span> <span class="n">buf</span><span class="p">)</span>
<span class="n">caller</span><span class="o">.</span><span class="n">msg</span><span class="p">(</span><span class="s2">&quot;Saved Attribute </span><span class="si">%s</span><span class="s2">.&quot;</span> <span class="o">%</span> <span class="n">attr</span><span class="p">)</span>
<span class="c1"># start the editor</span>
<span class="n">EvEditor</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">caller</span><span class="p">,</span> <span class="n">load</span><span class="p">,</span> <span class="n">save</span><span class="p">,</span> <span class="n">key</span><span class="o">=</span><span class="s2">&quot;</span><span class="si">%s</span><span class="s2">/</span><span class="si">%s</span><span class="s2">&quot;</span> <span class="o">%</span> <span class="p">(</span><span class="n">obj</span><span class="p">,</span> <span class="n">attr</span><span class="p">))</span></div>
<div class="viewcode-block" id="CmdSetAttribute.search_for_obj"><a class="viewcode-back" href="../../../../api/evennia.commands.default.building.html#evennia.commands.default.building.CmdSetAttribute.search_for_obj">[docs]</a> <span class="k">def</span> <span class="nf">search_for_obj</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">objname</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> Searches for an object matching objname. The object may be of different typeclasses.</span>
<span class="sd"> Args:</span>
<span class="sd"> objname: Name of the object we&#39;re looking for</span>
<span class="sd"> Returns:</span>
<span class="sd"> A typeclassed object, or None if nothing is found.</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="kn">from</span> <span class="nn">evennia.utils.utils</span> <span class="k">import</span> <span class="n">variable_from_module</span>
<span class="n">_AT_SEARCH_RESULT</span> <span class="o">=</span> <span class="n">variable_from_module</span><span class="p">(</span><span class="o">*</span><span class="n">settings</span><span class="o">.</span><span class="n">SEARCH_AT_RESULT</span><span class="o">.</span><span class="n">rsplit</span><span class="p">(</span><span class="s2">&quot;.&quot;</span><span class="p">,</span> <span class="mi">1</span><span class="p">))</span>
<span class="n">caller</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">caller</span>
<span class="k">if</span> <span class="n">objname</span><span class="o">.</span><span class="n">startswith</span><span class="p">(</span><span class="s2">&quot;*&quot;</span><span class="p">)</span> <span class="ow">or</span> <span class="s2">&quot;account&quot;</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">switches</span><span class="p">:</span>
<span class="n">found_obj</span> <span class="o">=</span> <span class="n">caller</span><span class="o">.</span><span class="n">search_account</span><span class="p">(</span><span class="n">objname</span><span class="o">.</span><span class="n">lstrip</span><span class="p">(</span><span class="s2">&quot;*&quot;</span><span class="p">))</span>
<span class="k">elif</span> <span class="s2">&quot;script&quot;</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">switches</span><span class="p">:</span>
<span class="n">found_obj</span> <span class="o">=</span> <span class="n">_AT_SEARCH_RESULT</span><span class="p">(</span><span class="n">search</span><span class="o">.</span><span class="n">search_script</span><span class="p">(</span><span class="n">objname</span><span class="p">),</span> <span class="n">caller</span><span class="p">)</span>
<span class="k">elif</span> <span class="s2">&quot;channel&quot;</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">switches</span><span class="p">:</span>
<span class="n">found_obj</span> <span class="o">=</span> <span class="n">_AT_SEARCH_RESULT</span><span class="p">(</span><span class="n">search</span><span class="o">.</span><span class="n">search_channel</span><span class="p">(</span><span class="n">objname</span><span class="p">),</span> <span class="n">caller</span><span class="p">)</span>
<span class="k">else</span><span class="p">:</span>
<span class="n">global_search</span> <span class="o">=</span> <span class="kc">True</span>
<span class="k">if</span> <span class="s2">&quot;char&quot;</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">switches</span> <span class="ow">or</span> <span class="s2">&quot;character&quot;</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">switches</span><span class="p">:</span>
<span class="n">typeclass</span> <span class="o">=</span> <span class="n">settings</span><span class="o">.</span><span class="n">BASE_CHARACTER_TYPECLASS</span>
<span class="k">elif</span> <span class="s2">&quot;room&quot;</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">switches</span><span class="p">:</span>
<span class="n">typeclass</span> <span class="o">=</span> <span class="n">settings</span><span class="o">.</span><span class="n">BASE_ROOM_TYPECLASS</span>
<span class="k">elif</span> <span class="s2">&quot;exit&quot;</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">switches</span><span class="p">:</span>
<span class="n">typeclass</span> <span class="o">=</span> <span class="n">settings</span><span class="o">.</span><span class="n">BASE_EXIT_TYPECLASS</span>
<span class="k">else</span><span class="p">:</span>
<span class="n">global_search</span> <span class="o">=</span> <span class="kc">False</span>
<span class="n">typeclass</span> <span class="o">=</span> <span class="kc">None</span>
<span class="n">found_obj</span> <span class="o">=</span> <span class="n">caller</span><span class="o">.</span><span class="n">search</span><span class="p">(</span><span class="n">objname</span><span class="p">,</span> <span class="n">global_search</span><span class="o">=</span><span class="n">global_search</span><span class="p">,</span> <span class="n">typeclass</span><span class="o">=</span><span class="n">typeclass</span><span class="p">)</span>
<span class="k">return</span> <span class="n">found_obj</span></div>
<div class="viewcode-block" id="CmdSetAttribute.func"><a class="viewcode-back" href="../../../../api/evennia.commands.default.building.html#evennia.commands.default.building.CmdSetAttribute.func">[docs]</a> <span class="k">def</span> <span class="nf">func</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;Implement the set attribute - a limited form of py.&quot;&quot;&quot;</span>
<span class="n">caller</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">caller</span>
<span class="k">if</span> <span class="ow">not</span> <span class="bp">self</span><span class="o">.</span><span class="n">args</span><span class="p">:</span>
<span class="n">caller</span><span class="o">.</span><span class="n">msg</span><span class="p">(</span><span class="s2">&quot;Usage: set obj/attr = value. Use empty value to clear.&quot;</span><span class="p">)</span>
<span class="k">return</span>
<span class="c1"># get values prepared by the parser</span>
<span class="n">value</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">rhs</span>
<span class="n">objname</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">lhs_objattr</span><span class="p">[</span><span class="mi">0</span><span class="p">][</span><span class="s2">&quot;name&quot;</span><span class="p">]</span>
<span class="n">attrs</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">lhs_objattr</span><span class="p">[</span><span class="mi">0</span><span class="p">][</span><span class="s2">&quot;attrs&quot;</span><span class="p">]</span>
<span class="n">obj</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">search_for_obj</span><span class="p">(</span><span class="n">objname</span><span class="p">)</span>
<span class="k">if</span> <span class="ow">not</span> <span class="n">obj</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">check_obj</span><span class="p">(</span><span class="n">obj</span><span class="p">):</span>
<span class="k">return</span>
<span class="n">result</span> <span class="o">=</span> <span class="p">[]</span>
<span class="k">if</span> <span class="s2">&quot;edit&quot;</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">switches</span><span class="p">:</span>
<span class="c1"># edit in the line editor</span>
<span class="k">if</span> <span class="ow">not</span> <span class="p">(</span><span class="n">obj</span><span class="o">.</span><span class="n">access</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">caller</span><span class="p">,</span> <span class="s2">&quot;control&quot;</span><span class="p">)</span> <span class="ow">or</span> <span class="n">obj</span><span class="o">.</span><span class="n">access</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">caller</span><span class="p">,</span> <span class="s2">&quot;edit&quot;</span><span class="p">)):</span>
<span class="n">caller</span><span class="o">.</span><span class="n">msg</span><span class="p">(</span><span class="s2">&quot;You don&#39;t have permission to edit </span><span class="si">%s</span><span class="s2">.&quot;</span> <span class="o">%</span> <span class="n">obj</span><span class="o">.</span><span class="n">key</span><span class="p">)</span>
<span class="k">return</span>
<span class="k">if</span> <span class="nb">len</span><span class="p">(</span><span class="n">attrs</span><span class="p">)</span> <span class="o">&gt;</span> <span class="mi">1</span><span class="p">:</span>
<span class="n">caller</span><span class="o">.</span><span class="n">msg</span><span class="p">(</span><span class="s2">&quot;The Line editor can only be applied &quot;</span> <span class="s2">&quot;to one attribute at a time.&quot;</span><span class="p">)</span>
<span class="k">return</span>
<span class="bp">self</span><span class="o">.</span><span class="n">edit_handler</span><span class="p">(</span><span class="n">obj</span><span class="p">,</span> <span class="n">attrs</span><span class="p">[</span><span class="mi">0</span><span class="p">])</span>
<span class="k">return</span>
<span class="k">if</span> <span class="ow">not</span> <span class="n">value</span><span class="p">:</span>
<span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">rhs</span> <span class="ow">is</span> <span class="kc">None</span><span class="p">:</span>
<span class="c1"># no = means we inspect the attribute(s)</span>
<span class="k">if</span> <span class="ow">not</span> <span class="n">attrs</span><span class="p">:</span>
<span class="n">attrs</span> <span class="o">=</span> <span class="p">[</span><span class="n">attr</span><span class="o">.</span><span class="n">key</span> <span class="k">for</span> <span class="n">attr</span> <span class="ow">in</span> <span class="n">obj</span><span class="o">.</span><span class="n">attributes</span><span class="o">.</span><span class="n">all</span><span class="p">()]</span>
<span class="k">for</span> <span class="n">attr</span> <span class="ow">in</span> <span class="n">attrs</span><span class="p">:</span>
<span class="k">if</span> <span class="ow">not</span> <span class="bp">self</span><span class="o">.</span><span class="n">check_attr</span><span class="p">(</span><span class="n">obj</span><span class="p">,</span> <span class="n">attr</span><span class="p">):</span>
<span class="k">continue</span>
<span class="n">result</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">view_attr</span><span class="p">(</span><span class="n">obj</span><span class="p">,</span> <span class="n">attr</span><span class="p">))</span>
<span class="c1"># we view it without parsing markup.</span>
<span class="bp">self</span><span class="o">.</span><span class="n">caller</span><span class="o">.</span><span class="n">msg</span><span class="p">(</span><span class="s2">&quot;&quot;</span><span class="o">.</span><span class="n">join</span><span class="p">(</span><span class="n">result</span><span class="p">)</span><span class="o">.</span><span class="n">strip</span><span class="p">(),</span> <span class="n">options</span><span class="o">=</span><span class="p">{</span><span class="s2">&quot;raw&quot;</span><span class="p">:</span> <span class="kc">True</span><span class="p">})</span>
<span class="k">return</span>
<span class="k">else</span><span class="p">:</span>
<span class="c1"># deleting the attribute(s)</span>
<span class="k">if</span> <span class="ow">not</span> <span class="p">(</span><span class="n">obj</span><span class="o">.</span><span class="n">access</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">caller</span><span class="p">,</span> <span class="s2">&quot;control&quot;</span><span class="p">)</span> <span class="ow">or</span> <span class="n">obj</span><span class="o">.</span><span class="n">access</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">caller</span><span class="p">,</span> <span class="s2">&quot;edit&quot;</span><span class="p">)):</span>
<span class="n">caller</span><span class="o">.</span><span class="n">msg</span><span class="p">(</span><span class="s2">&quot;You don&#39;t have permission to edit </span><span class="si">%s</span><span class="s2">.&quot;</span> <span class="o">%</span> <span class="n">obj</span><span class="o">.</span><span class="n">key</span><span class="p">)</span>
<span class="k">return</span>
<span class="k">for</span> <span class="n">attr</span> <span class="ow">in</span> <span class="n">attrs</span><span class="p">:</span>
<span class="k">if</span> <span class="ow">not</span> <span class="bp">self</span><span class="o">.</span><span class="n">check_attr</span><span class="p">(</span><span class="n">obj</span><span class="p">,</span> <span class="n">attr</span><span class="p">):</span>
<span class="k">continue</span>
<span class="n">result</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">rm_attr</span><span class="p">(</span><span class="n">obj</span><span class="p">,</span> <span class="n">attr</span><span class="p">))</span>
<span class="k">else</span><span class="p">:</span>
<span class="c1"># setting attribute(s). Make sure to convert to real Python type before saving.</span>
<span class="k">if</span> <span class="ow">not</span> <span class="p">(</span><span class="n">obj</span><span class="o">.</span><span class="n">access</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">caller</span><span class="p">,</span> <span class="s2">&quot;control&quot;</span><span class="p">)</span> <span class="ow">or</span> <span class="n">obj</span><span class="o">.</span><span class="n">access</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">caller</span><span class="p">,</span> <span class="s2">&quot;edit&quot;</span><span class="p">)):</span>
<span class="n">caller</span><span class="o">.</span><span class="n">msg</span><span class="p">(</span><span class="s2">&quot;You don&#39;t have permission to edit </span><span class="si">%s</span><span class="s2">.&quot;</span> <span class="o">%</span> <span class="n">obj</span><span class="o">.</span><span class="n">key</span><span class="p">)</span>
<span class="k">return</span>
<span class="k">for</span> <span class="n">attr</span> <span class="ow">in</span> <span class="n">attrs</span><span class="p">:</span>
<span class="k">if</span> <span class="ow">not</span> <span class="bp">self</span><span class="o">.</span><span class="n">check_attr</span><span class="p">(</span><span class="n">obj</span><span class="p">,</span> <span class="n">attr</span><span class="p">):</span>
<span class="k">continue</span>
<span class="n">value</span> <span class="o">=</span> <span class="n">_convert_from_string</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">value</span><span class="p">)</span>
<span class="n">result</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">set_attr</span><span class="p">(</span><span class="n">obj</span><span class="p">,</span> <span class="n">attr</span><span class="p">,</span> <span class="n">value</span><span class="p">))</span>
<span class="c1"># send feedback</span>
<span class="n">caller</span><span class="o">.</span><span class="n">msg</span><span class="p">(</span><span class="s2">&quot;&quot;</span><span class="o">.</span><span class="n">join</span><span class="p">(</span><span class="n">result</span><span class="p">)</span><span class="o">.</span><span class="n">strip</span><span class="p">(</span><span class="s2">&quot;</span><span class="se">\n</span><span class="s2">&quot;</span><span class="p">))</span></div></div>
<div class="viewcode-block" id="CmdTypeclass"><a class="viewcode-back" href="../../../../api/evennia.commands.default.building.html#evennia.commands.default.building.CmdTypeclass">[docs]</a><span class="k">class</span> <span class="nc">CmdTypeclass</span><span class="p">(</span><span class="n">COMMAND_DEFAULT_CLASS</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> set or change an object&#39;s typeclass</span>
<span class="sd"> Usage:</span>
<span class="sd"> typeclass[/switch] &lt;object&gt; [= typeclass.path]</span>
<span class="sd"> typeclass/prototype &lt;object&gt; = prototype_key</span>
<span class="sd"> typeclass/list/show [typeclass.path]</span>
<span class="sd"> swap - this is a shorthand for using /force/reset flags.</span>
<span class="sd"> update - this is a shorthand for using the /force/reload flag.</span>
<span class="sd"> Switch:</span>
<span class="sd"> show, examine - display the current typeclass of object (default) or, if</span>
<span class="sd"> given a typeclass path, show the docstring of that typeclass.</span>
<span class="sd"> update - *only* re-run at_object_creation on this object</span>
<span class="sd"> meaning locks or other properties set later may remain.</span>
<span class="sd"> reset - clean out *all* the attributes and properties on the</span>
<span class="sd"> object - basically making this a new clean object.</span>
<span class="sd"> force - change to the typeclass also if the object</span>
<span class="sd"> already has a typeclass of the same name.</span>
<span class="sd"> list - show available typeclasses. Only typeclasses in modules actually</span>
<span class="sd"> imported or used from somewhere in the code will show up here</span>
<span class="sd"> (those typeclasses are still available if you know the path)</span>
<span class="sd"> prototype - clean and overwrite the object with the specified</span>
<span class="sd"> prototype key - effectively making a whole new object.</span>
<span class="sd"> Example:</span>
<span class="sd"> type button = examples.red_button.RedButton</span>
<span class="sd"> type/prototype button=a red button</span>
<span class="sd"> If the typeclass_path is not given, the current object&#39;s typeclass is</span>
<span class="sd"> assumed.</span>
<span class="sd"> View or set an object&#39;s typeclass. If setting, the creation hooks of the</span>
<span class="sd"> new typeclass will be run on the object. If you have clashing properties on</span>
<span class="sd"> the old class, use /reset. By default you are protected from changing to a</span>
<span class="sd"> typeclass of the same name as the one you already have - use /force to</span>
<span class="sd"> override this protection.</span>
<span class="sd"> The given typeclass must be identified by its location using python</span>
<span class="sd"> dot-notation pointing to the correct module and class. If no typeclass is</span>
<span class="sd"> given (or a wrong typeclass is given). Errors in the path or new typeclass</span>
<span class="sd"> will lead to the old typeclass being kept. The location of the typeclass</span>
<span class="sd"> module is searched from the default typeclass directory, as defined in the</span>
<span class="sd"> server settings.</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="n">key</span> <span class="o">=</span> <span class="s2">&quot;typeclass&quot;</span>
<span class="n">aliases</span> <span class="o">=</span> <span class="p">[</span><span class="s2">&quot;type&quot;</span><span class="p">,</span> <span class="s2">&quot;parent&quot;</span><span class="p">,</span> <span class="s2">&quot;swap&quot;</span><span class="p">,</span> <span class="s2">&quot;update&quot;</span><span class="p">]</span>
<span class="n">switch_options</span> <span class="o">=</span> <span class="p">(</span><span class="s2">&quot;show&quot;</span><span class="p">,</span> <span class="s2">&quot;examine&quot;</span><span class="p">,</span> <span class="s2">&quot;update&quot;</span><span class="p">,</span> <span class="s2">&quot;reset&quot;</span><span class="p">,</span> <span class="s2">&quot;force&quot;</span><span class="p">,</span> <span class="s2">&quot;list&quot;</span><span class="p">,</span> <span class="s2">&quot;prototype&quot;</span><span class="p">)</span>
<span class="n">locks</span> <span class="o">=</span> <span class="s2">&quot;cmd:perm(typeclass) or perm(Builder)&quot;</span>
<span class="n">help_category</span> <span class="o">=</span> <span class="s2">&quot;Building&quot;</span>
<div class="viewcode-block" id="CmdTypeclass.func"><a class="viewcode-back" href="../../../../api/evennia.commands.default.building.html#evennia.commands.default.building.CmdTypeclass.func">[docs]</a> <span class="k">def</span> <span class="nf">func</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;Implements command&quot;&quot;&quot;</span>
<span class="n">caller</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">caller</span>
<span class="k">if</span> <span class="s2">&quot;list&quot;</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">switches</span><span class="p">:</span>
<span class="n">tclasses</span> <span class="o">=</span> <span class="n">get_all_typeclasses</span><span class="p">()</span>
<span class="n">contribs</span> <span class="o">=</span> <span class="p">[</span><span class="n">key</span> <span class="k">for</span> <span class="n">key</span> <span class="ow">in</span> <span class="nb">sorted</span><span class="p">(</span><span class="n">tclasses</span><span class="p">)</span> <span class="k">if</span> <span class="n">key</span><span class="o">.</span><span class="n">startswith</span><span class="p">(</span><span class="s2">&quot;evennia.contrib&quot;</span><span class="p">)]</span> <span class="ow">or</span> <span class="p">[</span>
<span class="s2">&quot;&lt;None loaded&gt;&quot;</span>
<span class="p">]</span>
<span class="n">core</span> <span class="o">=</span> <span class="p">[</span>
<span class="n">key</span> <span class="k">for</span> <span class="n">key</span> <span class="ow">in</span> <span class="nb">sorted</span><span class="p">(</span><span class="n">tclasses</span><span class="p">)</span> <span class="k">if</span> <span class="n">key</span><span class="o">.</span><span class="n">startswith</span><span class="p">(</span><span class="s2">&quot;evennia&quot;</span><span class="p">)</span> <span class="ow">and</span> <span class="n">key</span> <span class="ow">not</span> <span class="ow">in</span> <span class="n">contribs</span>
<span class="p">]</span> <span class="ow">or</span> <span class="p">[</span><span class="s2">&quot;&lt;None loaded&gt;&quot;</span><span class="p">]</span>
<span class="n">game</span> <span class="o">=</span> <span class="p">[</span><span class="n">key</span> <span class="k">for</span> <span class="n">key</span> <span class="ow">in</span> <span class="nb">sorted</span><span class="p">(</span><span class="n">tclasses</span><span class="p">)</span> <span class="k">if</span> <span class="ow">not</span> <span class="n">key</span><span class="o">.</span><span class="n">startswith</span><span class="p">(</span><span class="s2">&quot;evennia&quot;</span><span class="p">)]</span> <span class="ow">or</span> <span class="p">[</span>
<span class="s2">&quot;&lt;None loaded&gt;&quot;</span>
<span class="p">]</span>
<span class="n">string</span> <span class="o">=</span> <span class="p">(</span>
<span class="s2">&quot;|wCore typeclasses|n</span><span class="se">\n</span><span class="s2">&quot;</span>
<span class="s2">&quot; </span><span class="si">{core}</span><span class="se">\n</span><span class="s2">&quot;</span>
<span class="s2">&quot;|wLoaded Contrib typeclasses|n</span><span class="se">\n</span><span class="s2">&quot;</span>
<span class="s2">&quot; </span><span class="si">{contrib}</span><span class="se">\n</span><span class="s2">&quot;</span>
<span class="s2">&quot;|wGame-dir typeclasses|n</span><span class="se">\n</span><span class="s2">&quot;</span>
<span class="s2">&quot; </span><span class="si">{game}</span><span class="s2">&quot;</span>
<span class="p">)</span><span class="o">.</span><span class="n">format</span><span class="p">(</span>
<span class="n">core</span><span class="o">=</span><span class="s2">&quot;</span><span class="se">\n</span><span class="s2"> &quot;</span><span class="o">.</span><span class="n">join</span><span class="p">(</span><span class="n">core</span><span class="p">),</span> <span class="n">contrib</span><span class="o">=</span><span class="s2">&quot;</span><span class="se">\n</span><span class="s2"> &quot;</span><span class="o">.</span><span class="n">join</span><span class="p">(</span><span class="n">contribs</span><span class="p">),</span> <span class="n">game</span><span class="o">=</span><span class="s2">&quot;</span><span class="se">\n</span><span class="s2"> &quot;</span><span class="o">.</span><span class="n">join</span><span class="p">(</span><span class="n">game</span><span class="p">)</span>
<span class="p">)</span>
<span class="n">EvMore</span><span class="p">(</span><span class="n">caller</span><span class="p">,</span> <span class="n">string</span><span class="p">,</span> <span class="n">exit_on_lastpage</span><span class="o">=</span><span class="kc">True</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">args</span><span class="p">:</span>
<span class="n">caller</span><span class="o">.</span><span class="n">msg</span><span class="p">(</span><span class="s2">&quot;Usage: </span><span class="si">%s</span><span class="s2"> &lt;object&gt; [= typeclass]&quot;</span> <span class="o">%</span> <span class="bp">self</span><span class="o">.</span><span class="n">cmdstring</span><span class="p">)</span>
<span class="k">return</span>
<span class="k">if</span> <span class="s2">&quot;show&quot;</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">switches</span> <span class="ow">or</span> <span class="s2">&quot;examine&quot;</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">switches</span><span class="p">:</span>
<span class="n">oquery</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">lhs</span>
<span class="n">obj</span> <span class="o">=</span> <span class="n">caller</span><span class="o">.</span><span class="n">search</span><span class="p">(</span><span class="n">oquery</span><span class="p">,</span> <span class="n">quiet</span><span class="o">=</span><span class="kc">True</span><span class="p">)</span>
<span class="k">if</span> <span class="ow">not</span> <span class="n">obj</span><span class="p">:</span>
<span class="c1"># no object found to examine, see if it&#39;s a typeclass-path instead</span>
<span class="n">tclasses</span> <span class="o">=</span> <span class="n">get_all_typeclasses</span><span class="p">()</span>
<span class="n">matches</span> <span class="o">=</span> <span class="p">[</span>
<span class="p">(</span><span class="n">key</span><span class="p">,</span> <span class="n">tclass</span><span class="p">)</span> <span class="k">for</span> <span class="n">key</span><span class="p">,</span> <span class="n">tclass</span> <span class="ow">in</span> <span class="n">tclasses</span><span class="o">.</span><span class="n">items</span><span class="p">()</span> <span class="k">if</span> <span class="n">key</span><span class="o">.</span><span class="n">endswith</span><span class="p">(</span><span class="n">oquery</span><span class="p">)</span>
<span class="p">]</span>
<span class="n">nmatches</span> <span class="o">=</span> <span class="nb">len</span><span class="p">(</span><span class="n">matches</span><span class="p">)</span>
<span class="k">if</span> <span class="n">nmatches</span> <span class="o">&gt;</span> <span class="mi">1</span><span class="p">:</span>
<span class="n">caller</span><span class="o">.</span><span class="n">msg</span><span class="p">(</span>
<span class="s2">&quot;Multiple typeclasses found matching </span><span class="si">{}</span><span class="s2">:</span><span class="se">\n</span><span class="s2"> </span><span class="si">{}</span><span class="s2">&quot;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span>
<span class="n">oquery</span><span class="p">,</span> <span class="s2">&quot;</span><span class="se">\n</span><span class="s2"> &quot;</span><span class="o">.</span><span class="n">join</span><span class="p">(</span><span class="n">tup</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span> <span class="k">for</span> <span class="n">tup</span> <span class="ow">in</span> <span class="n">matches</span><span class="p">)</span>
<span class="p">)</span>
<span class="p">)</span>
<span class="k">elif</span> <span class="ow">not</span> <span class="n">matches</span><span class="p">:</span>
<span class="n">caller</span><span class="o">.</span><span class="n">msg</span><span class="p">(</span><span class="s2">&quot;No object or typeclass path found to match &#39;</span><span class="si">{}</span><span class="s2">&#39;&quot;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">oquery</span><span class="p">))</span>
<span class="k">else</span><span class="p">:</span>
<span class="c1"># one match found</span>
<span class="n">caller</span><span class="o">.</span><span class="n">msg</span><span class="p">(</span>
<span class="s2">&quot;Docstring for typeclass &#39;</span><span class="si">{}</span><span class="s2">&#39;:</span><span class="se">\n</span><span class="si">{}</span><span class="s2">&quot;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">oquery</span><span class="p">,</span> <span class="n">matches</span><span class="p">[</span><span class="mi">0</span><span class="p">][</span><span class="mi">1</span><span class="p">]</span><span class="o">.</span><span class="vm">__doc__</span><span class="p">)</span>
<span class="p">)</span>
<span class="k">else</span><span class="p">:</span>
<span class="c1"># do the search again to get the error handling in case of multi-match</span>
<span class="n">obj</span> <span class="o">=</span> <span class="n">caller</span><span class="o">.</span><span class="n">search</span><span class="p">(</span><span class="n">oquery</span><span class="p">)</span>
<span class="k">if</span> <span class="ow">not</span> <span class="n">obj</span><span class="p">:</span>
<span class="k">return</span>
<span class="n">caller</span><span class="o">.</span><span class="n">msg</span><span class="p">(</span>
<span class="s2">&quot;</span><span class="si">{}</span><span class="s2">&#39;s current typeclass is &#39;</span><span class="si">{}</span><span class="s2">.</span><span class="si">{}</span><span class="s2">&#39;&quot;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span>
<span class="n">obj</span><span class="o">.</span><span class="n">name</span><span class="p">,</span> <span class="n">obj</span><span class="o">.</span><span class="vm">__class__</span><span class="o">.</span><span class="vm">__module__</span><span class="p">,</span> <span class="n">obj</span><span class="o">.</span><span class="vm">__class__</span><span class="o">.</span><span class="vm">__name__</span>
<span class="p">)</span>
<span class="p">)</span>
<span class="k">return</span>
<span class="c1"># get object to swap on</span>
<span class="n">obj</span> <span class="o">=</span> <span class="n">caller</span><span class="o">.</span><span class="n">search</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">lhs</span><span class="p">)</span>
<span class="k">if</span> <span class="ow">not</span> <span class="n">obj</span><span class="p">:</span>
<span class="k">return</span>
<span class="k">if</span> <span class="ow">not</span> <span class="nb">hasattr</span><span class="p">(</span><span class="n">obj</span><span class="p">,</span> <span class="s2">&quot;__dbclass__&quot;</span><span class="p">):</span>
<span class="n">string</span> <span class="o">=</span> <span class="s2">&quot;</span><span class="si">%s</span><span class="s2"> is not a typed object.&quot;</span> <span class="o">%</span> <span class="n">obj</span><span class="o">.</span><span class="n">name</span>
<span class="n">caller</span><span class="o">.</span><span class="n">msg</span><span class="p">(</span><span class="n">string</span><span class="p">)</span>
<span class="k">return</span>
<span class="n">new_typeclass</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">rhs</span> <span class="ow">or</span> <span class="n">obj</span><span class="o">.</span><span class="n">path</span>
<span class="n">prototype</span> <span class="o">=</span> <span class="kc">None</span>
<span class="k">if</span> <span class="s2">&quot;prototype&quot;</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">switches</span><span class="p">:</span>
<span class="n">key</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">rhs</span>
<span class="n">prototype</span> <span class="o">=</span> <span class="n">protlib</span><span class="o">.</span><span class="n">search_prototype</span><span class="p">(</span><span class="n">key</span><span class="o">=</span><span class="n">key</span><span class="p">)</span>
<span class="k">if</span> <span class="nb">len</span><span class="p">(</span><span class="n">prototype</span><span class="p">)</span> <span class="o">&gt;</span> <span class="mi">1</span><span class="p">:</span>
<span class="n">caller</span><span class="o">.</span><span class="n">msg</span><span class="p">(</span>
<span class="s2">&quot;More than one match for </span><span class="si">{}</span><span class="s2">:</span><span class="se">\n</span><span class="si">{}</span><span class="s2">&quot;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span>
<span class="n">key</span><span class="p">,</span> <span class="s2">&quot;</span><span class="se">\n</span><span class="s2">&quot;</span><span class="o">.</span><span class="n">join</span><span class="p">(</span><span class="n">proto</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s2">&quot;prototype_key&quot;</span><span class="p">,</span> <span class="s2">&quot;&quot;</span><span class="p">)</span> <span class="k">for</span> <span class="n">proto</span> <span class="ow">in</span> <span class="n">prototype</span><span class="p">)</span>
<span class="p">)</span>
<span class="p">)</span>
<span class="k">return</span>
<span class="k">elif</span> <span class="n">prototype</span><span class="p">:</span>
<span class="c1"># one match</span>
<span class="n">prototype</span> <span class="o">=</span> <span class="n">prototype</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span>
<span class="k">else</span><span class="p">:</span>
<span class="c1"># no match</span>
<span class="n">caller</span><span class="o">.</span><span class="n">msg</span><span class="p">(</span><span class="s2">&quot;No prototype &#39;</span><span class="si">{}</span><span class="s2">&#39; was found.&quot;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">key</span><span class="p">))</span>
<span class="k">return</span>
<span class="n">new_typeclass</span> <span class="o">=</span> <span class="n">prototype</span><span class="p">[</span><span class="s2">&quot;typeclass&quot;</span><span class="p">]</span>
<span class="bp">self</span><span class="o">.</span><span class="n">switches</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="s2">&quot;force&quot;</span><span class="p">)</span>
<span class="k">if</span> <span class="s2">&quot;show&quot;</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">switches</span> <span class="ow">or</span> <span class="s2">&quot;examine&quot;</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">switches</span><span class="p">:</span>
<span class="n">string</span> <span class="o">=</span> <span class="s2">&quot;</span><span class="si">%s</span><span class="s2">&#39;s current typeclass is </span><span class="si">%s</span><span class="s2">.&quot;</span> <span class="o">%</span> <span class="p">(</span><span class="n">obj</span><span class="o">.</span><span class="n">name</span><span class="p">,</span> <span class="n">obj</span><span class="o">.</span><span class="vm">__class__</span><span class="p">)</span>
<span class="n">caller</span><span class="o">.</span><span class="n">msg</span><span class="p">(</span><span class="n">string</span><span class="p">)</span>
<span class="k">return</span>
<span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">cmdstring</span> <span class="o">==</span> <span class="s2">&quot;swap&quot;</span><span class="p">:</span>
<span class="bp">self</span><span class="o">.</span><span class="n">switches</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="s2">&quot;force&quot;</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">switches</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="s2">&quot;reset&quot;</span><span class="p">)</span>
<span class="k">elif</span> <span class="bp">self</span><span class="o">.</span><span class="n">cmdstring</span> <span class="o">==</span> <span class="s2">&quot;update&quot;</span><span class="p">:</span>
<span class="bp">self</span><span class="o">.</span><span class="n">switches</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="s2">&quot;force&quot;</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">switches</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="s2">&quot;update&quot;</span><span class="p">)</span>
<span class="k">if</span> <span class="ow">not</span> <span class="p">(</span><span class="n">obj</span><span class="o">.</span><span class="n">access</span><span class="p">(</span><span class="n">caller</span><span class="p">,</span> <span class="s2">&quot;control&quot;</span><span class="p">)</span> <span class="ow">or</span> <span class="n">obj</span><span class="o">.</span><span class="n">access</span><span class="p">(</span><span class="n">caller</span><span class="p">,</span> <span class="s2">&quot;edit&quot;</span><span class="p">)):</span>
<span class="n">caller</span><span class="o">.</span><span class="n">msg</span><span class="p">(</span><span class="s2">&quot;You are not allowed to do that.&quot;</span><span class="p">)</span>
<span class="k">return</span>
<span class="k">if</span> <span class="ow">not</span> <span class="nb">hasattr</span><span class="p">(</span><span class="n">obj</span><span class="p">,</span> <span class="s2">&quot;swap_typeclass&quot;</span><span class="p">):</span>
<span class="n">caller</span><span class="o">.</span><span class="n">msg</span><span class="p">(</span><span class="s2">&quot;This object cannot have a type at all!&quot;</span><span class="p">)</span>
<span class="k">return</span>
<span class="n">is_same</span> <span class="o">=</span> <span class="n">obj</span><span class="o">.</span><span class="n">is_typeclass</span><span class="p">(</span><span class="n">new_typeclass</span><span class="p">,</span> <span class="n">exact</span><span class="o">=</span><span class="kc">True</span><span class="p">)</span>
<span class="k">if</span> <span class="n">is_same</span> <span class="ow">and</span> <span class="s2">&quot;force&quot;</span> <span class="ow">not</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">switches</span><span class="p">:</span>
<span class="n">string</span> <span class="o">=</span> <span class="s2">&quot;</span><span class="si">%s</span><span class="s2"> already has the typeclass &#39;</span><span class="si">%s</span><span class="s2">&#39;. Use /force to override.&quot;</span> <span class="o">%</span> <span class="p">(</span>
<span class="n">obj</span><span class="o">.</span><span class="n">name</span><span class="p">,</span>
<span class="n">new_typeclass</span><span class="p">,</span>
<span class="p">)</span>
<span class="k">else</span><span class="p">:</span>
<span class="n">update</span> <span class="o">=</span> <span class="s2">&quot;update&quot;</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">switches</span>
<span class="n">reset</span> <span class="o">=</span> <span class="s2">&quot;reset&quot;</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">switches</span>
<span class="n">hooks</span> <span class="o">=</span> <span class="s2">&quot;at_object_creation&quot;</span> <span class="k">if</span> <span class="n">update</span> <span class="k">else</span> <span class="s2">&quot;all&quot;</span>
<span class="n">old_typeclass_path</span> <span class="o">=</span> <span class="n">obj</span><span class="o">.</span><span class="n">typeclass_path</span>
<span class="c1"># special prompt for the user in cases where we want</span>
<span class="c1"># to confirm changes.</span>
<span class="k">if</span> <span class="s2">&quot;prototype&quot;</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">switches</span><span class="p">:</span>
<span class="n">diff</span><span class="p">,</span> <span class="n">_</span> <span class="o">=</span> <span class="n">spawner</span><span class="o">.</span><span class="n">prototype_diff_from_object</span><span class="p">(</span><span class="n">prototype</span><span class="p">,</span> <span class="n">obj</span><span class="p">)</span>
<span class="n">txt</span> <span class="o">=</span> <span class="n">spawner</span><span class="o">.</span><span class="n">format_diff</span><span class="p">(</span><span class="n">diff</span><span class="p">)</span>
<span class="n">prompt</span> <span class="o">=</span> <span class="p">(</span>
<span class="s2">&quot;Applying prototype &#39;</span><span class="si">%s</span><span class="s2">&#39; over &#39;</span><span class="si">%s</span><span class="s2">&#39; will cause the follow changes:</span><span class="se">\n</span><span class="si">%s</span><span class="se">\n</span><span class="s2">&quot;</span>
<span class="o">%</span> <span class="p">(</span><span class="n">prototype</span><span class="p">[</span><span class="s2">&quot;key&quot;</span><span class="p">],</span> <span class="n">obj</span><span class="o">.</span><span class="n">name</span><span class="p">,</span> <span class="n">txt</span><span class="p">)</span>
<span class="p">)</span>
<span class="k">if</span> <span class="ow">not</span> <span class="n">reset</span><span class="p">:</span>
<span class="n">prompt</span> <span class="o">+=</span> <span class="s2">&quot;</span><span class="se">\n</span><span class="s2">|yWARNING:|n Use the /reset switch to apply the prototype over a blank state.&quot;</span>
<span class="n">prompt</span> <span class="o">+=</span> <span class="s2">&quot;</span><span class="se">\n</span><span class="s2">Are you sure you want to apply these changes [yes]/no?&quot;</span>
<span class="n">answer</span> <span class="o">=</span> <span class="k">yield</span> <span class="p">(</span><span class="n">prompt</span><span class="p">)</span>
<span class="k">if</span> <span class="n">answer</span> <span class="ow">and</span> <span class="n">answer</span> <span class="ow">in</span> <span class="p">(</span><span class="s2">&quot;no&quot;</span><span class="p">,</span> <span class="s2">&quot;n&quot;</span><span class="p">):</span>
<span class="n">caller</span><span class="o">.</span><span class="n">msg</span><span class="p">(</span><span class="s2">&quot;Canceled: No changes were applied.&quot;</span><span class="p">)</span>
<span class="k">return</span>
<span class="c1"># we let this raise exception if needed</span>
<span class="n">obj</span><span class="o">.</span><span class="n">swap_typeclass</span><span class="p">(</span>
<span class="n">new_typeclass</span><span class="p">,</span> <span class="n">clean_attributes</span><span class="o">=</span><span class="n">reset</span><span class="p">,</span> <span class="n">clean_cmdsets</span><span class="o">=</span><span class="n">reset</span><span class="p">,</span> <span class="n">run_start_hooks</span><span class="o">=</span><span class="n">hooks</span>
<span class="p">)</span>
<span class="k">if</span> <span class="s2">&quot;prototype&quot;</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">switches</span><span class="p">:</span>
<span class="n">modified</span> <span class="o">=</span> <span class="n">spawner</span><span class="o">.</span><span class="n">batch_update_objects_with_prototype</span><span class="p">(</span><span class="n">prototype</span><span class="p">,</span> <span class="n">objects</span><span class="o">=</span><span class="p">[</span><span class="n">obj</span><span class="p">])</span>
<span class="n">prototype_success</span> <span class="o">=</span> <span class="n">modified</span> <span class="o">&gt;</span> <span class="mi">0</span>
<span class="k">if</span> <span class="ow">not</span> <span class="n">prototype_success</span><span class="p">:</span>
<span class="n">caller</span><span class="o">.</span><span class="n">msg</span><span class="p">(</span><span class="s2">&quot;Prototype </span><span class="si">%s</span><span class="s2"> failed to apply.&quot;</span> <span class="o">%</span> <span class="n">prototype</span><span class="p">[</span><span class="s2">&quot;key&quot;</span><span class="p">])</span>
<span class="k">if</span> <span class="n">is_same</span><span class="p">:</span>
<span class="n">string</span> <span class="o">=</span> <span class="s2">&quot;</span><span class="si">%s</span><span class="s2"> updated its existing typeclass (</span><span class="si">%s</span><span class="s2">).</span><span class="se">\n</span><span class="s2">&quot;</span> <span class="o">%</span> <span class="p">(</span><span class="n">obj</span><span class="o">.</span><span class="n">name</span><span class="p">,</span> <span class="n">obj</span><span class="o">.</span><span class="n">path</span><span class="p">)</span>
<span class="k">else</span><span class="p">:</span>
<span class="n">string</span> <span class="o">=</span> <span class="s2">&quot;</span><span class="si">%s</span><span class="s2"> changed typeclass from </span><span class="si">%s</span><span class="s2"> to </span><span class="si">%s</span><span class="s2">.</span><span class="se">\n</span><span class="s2">&quot;</span> <span class="o">%</span> <span class="p">(</span>
<span class="n">obj</span><span class="o">.</span><span class="n">name</span><span class="p">,</span>
<span class="n">old_typeclass_path</span><span class="p">,</span>
<span class="n">obj</span><span class="o">.</span><span class="n">typeclass_path</span><span class="p">,</span>
<span class="p">)</span>
<span class="k">if</span> <span class="n">update</span><span class="p">:</span>
<span class="n">string</span> <span class="o">+=</span> <span class="s2">&quot;Only the at_object_creation hook was run (update mode).&quot;</span>
<span class="k">else</span><span class="p">:</span>
<span class="n">string</span> <span class="o">+=</span> <span class="s2">&quot;All object creation hooks were run.&quot;</span>
<span class="k">if</span> <span class="n">reset</span><span class="p">:</span>
<span class="n">string</span> <span class="o">+=</span> <span class="s2">&quot; All old attributes where deleted before the swap.&quot;</span>
<span class="k">else</span><span class="p">:</span>
<span class="n">string</span> <span class="o">+=</span> <span class="s2">&quot; Attributes set before swap were not removed.&quot;</span>
<span class="k">if</span> <span class="s2">&quot;prototype&quot;</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">switches</span> <span class="ow">and</span> <span class="n">prototype_success</span><span class="p">:</span>
<span class="n">string</span> <span class="o">+=</span> <span class="p">(</span>
<span class="s2">&quot; Prototype &#39;</span><span class="si">%s</span><span class="s2">&#39; was successfully applied over the object type.&quot;</span>
<span class="o">%</span> <span class="n">prototype</span><span class="p">[</span><span class="s2">&quot;key&quot;</span><span class="p">]</span>
<span class="p">)</span>
<span class="n">caller</span><span class="o">.</span><span class="n">msg</span><span class="p">(</span><span class="n">string</span><span class="p">)</span></div></div>
<div class="viewcode-block" id="CmdWipe"><a class="viewcode-back" href="../../../../api/evennia.commands.default.building.html#evennia.commands.default.building.CmdWipe">[docs]</a><span class="k">class</span> <span class="nc">CmdWipe</span><span class="p">(</span><span class="n">ObjManipCommand</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> clear all attributes from an object</span>
<span class="sd"> Usage:</span>
<span class="sd"> wipe &lt;object&gt;[/&lt;attr&gt;[/&lt;attr&gt;...]]</span>
<span class="sd"> Example:</span>
<span class="sd"> wipe box</span>
<span class="sd"> wipe box/colour</span>
<span class="sd"> Wipes all of an object&#39;s attributes, or optionally only those</span>
<span class="sd"> matching the given attribute-wildcard search string.</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="n">key</span> <span class="o">=</span> <span class="s2">&quot;wipe&quot;</span>
<span class="n">locks</span> <span class="o">=</span> <span class="s2">&quot;cmd:perm(wipe) or perm(Builder)&quot;</span>
<span class="n">help_category</span> <span class="o">=</span> <span class="s2">&quot;Building&quot;</span>
<div class="viewcode-block" id="CmdWipe.func"><a class="viewcode-back" href="../../../../api/evennia.commands.default.building.html#evennia.commands.default.building.CmdWipe.func">[docs]</a> <span class="k">def</span> <span class="nf">func</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> inp is the dict produced in ObjManipCommand.parse()</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="n">caller</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">caller</span>
<span class="k">if</span> <span class="ow">not</span> <span class="bp">self</span><span class="o">.</span><span class="n">args</span><span class="p">:</span>
<span class="n">caller</span><span class="o">.</span><span class="n">msg</span><span class="p">(</span><span class="s2">&quot;Usage: wipe &lt;object&gt;[/&lt;attr&gt;/&lt;attr&gt;...]&quot;</span><span class="p">)</span>
<span class="k">return</span>
<span class="c1"># get the attributes set by our custom parser</span>
<span class="n">objname</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">lhs_objattr</span><span class="p">[</span><span class="mi">0</span><span class="p">][</span><span class="s2">&quot;name&quot;</span><span class="p">]</span>
<span class="n">attrs</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">lhs_objattr</span><span class="p">[</span><span class="mi">0</span><span class="p">][</span><span class="s2">&quot;attrs&quot;</span><span class="p">]</span>
<span class="n">obj</span> <span class="o">=</span> <span class="n">caller</span><span class="o">.</span><span class="n">search</span><span class="p">(</span><span class="n">objname</span><span class="p">)</span>
<span class="k">if</span> <span class="ow">not</span> <span class="n">obj</span><span class="p">:</span>
<span class="k">return</span>
<span class="k">if</span> <span class="ow">not</span> <span class="p">(</span><span class="n">obj</span><span class="o">.</span><span class="n">access</span><span class="p">(</span><span class="n">caller</span><span class="p">,</span> <span class="s2">&quot;control&quot;</span><span class="p">)</span> <span class="ow">or</span> <span class="n">obj</span><span class="o">.</span><span class="n">access</span><span class="p">(</span><span class="n">caller</span><span class="p">,</span> <span class="s2">&quot;edit&quot;</span><span class="p">)):</span>
<span class="n">caller</span><span class="o">.</span><span class="n">msg</span><span class="p">(</span><span class="s2">&quot;You are not allowed to do that.&quot;</span><span class="p">)</span>
<span class="k">return</span>
<span class="k">if</span> <span class="ow">not</span> <span class="n">attrs</span><span class="p">:</span>
<span class="c1"># wipe everything</span>
<span class="n">obj</span><span class="o">.</span><span class="n">attributes</span><span class="o">.</span><span class="n">clear</span><span class="p">()</span>
<span class="n">string</span> <span class="o">=</span> <span class="s2">&quot;Wiped all attributes on </span><span class="si">%s</span><span class="s2">.&quot;</span> <span class="o">%</span> <span class="n">obj</span><span class="o">.</span><span class="n">name</span>
<span class="k">else</span><span class="p">:</span>
<span class="k">for</span> <span class="n">attrname</span> <span class="ow">in</span> <span class="n">attrs</span><span class="p">:</span>
<span class="n">obj</span><span class="o">.</span><span class="n">attributes</span><span class="o">.</span><span class="n">remove</span><span class="p">(</span><span class="n">attrname</span><span class="p">)</span>
<span class="n">string</span> <span class="o">=</span> <span class="s2">&quot;Wiped attributes </span><span class="si">%s</span><span class="s2"> on </span><span class="si">%s</span><span class="s2">.&quot;</span>
<span class="n">string</span> <span class="o">=</span> <span class="n">string</span> <span class="o">%</span> <span class="p">(</span><span class="s2">&quot;,&quot;</span><span class="o">.</span><span class="n">join</span><span class="p">(</span><span class="n">attrs</span><span class="p">),</span> <span class="n">obj</span><span class="o">.</span><span class="n">name</span><span class="p">)</span>
<span class="n">caller</span><span class="o">.</span><span class="n">msg</span><span class="p">(</span><span class="n">string</span><span class="p">)</span></div></div>
<div class="viewcode-block" id="CmdLock"><a class="viewcode-back" href="../../../../api/evennia.commands.default.building.html#evennia.commands.default.building.CmdLock">[docs]</a><span class="k">class</span> <span class="nc">CmdLock</span><span class="p">(</span><span class="n">ObjManipCommand</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> assign a lock definition to an object</span>
<span class="sd"> Usage:</span>
<span class="sd"> lock &lt;object or *account&gt;[ = &lt;lockstring&gt;]</span>
<span class="sd"> or</span>
<span class="sd"> lock[/switch] &lt;object or *account&gt;/&lt;access_type&gt;</span>
<span class="sd"> Switch:</span>
<span class="sd"> del - delete given access type</span>
<span class="sd"> view - view lock associated with given access type (default)</span>
<span class="sd"> If no lockstring is given, shows all locks on</span>
<span class="sd"> object.</span>
<span class="sd"> Lockstring is of the form</span>
<span class="sd"> access_type:[NOT] func1(args)[ AND|OR][ NOT] func2(args) ...]</span>
<span class="sd"> Where func1, func2 ... valid lockfuncs with or without arguments.</span>
<span class="sd"> Separator expressions need not be capitalized.</span>
<span class="sd"> For example:</span>
<span class="sd"> &#39;get: id(25) or perm(Admin)&#39;</span>
<span class="sd"> The &#39;get&#39; lock access_type is checked e.g. by the &#39;get&#39; command.</span>
<span class="sd"> An object locked with this example lock will only be possible to pick up</span>
<span class="sd"> by Admins or by an object with id=25.</span>
<span class="sd"> You can add several access_types after one another by separating</span>
<span class="sd"> them by &#39;;&#39;, i.e:</span>
<span class="sd"> &#39;get:id(25); delete:perm(Builder)&#39;</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="n">key</span> <span class="o">=</span> <span class="s2">&quot;lock&quot;</span>
<span class="n">aliases</span> <span class="o">=</span> <span class="p">[</span><span class="s2">&quot;locks&quot;</span><span class="p">]</span>
<span class="n">locks</span> <span class="o">=</span> <span class="s2">&quot;cmd: perm(locks) or perm(Builder)&quot;</span>
<span class="n">help_category</span> <span class="o">=</span> <span class="s2">&quot;Building&quot;</span>
<div class="viewcode-block" id="CmdLock.func"><a class="viewcode-back" href="../../../../api/evennia.commands.default.building.html#evennia.commands.default.building.CmdLock.func">[docs]</a> <span class="k">def</span> <span class="nf">func</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;Sets up the command&quot;&quot;&quot;</span>
<span class="n">caller</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">caller</span>
<span class="k">if</span> <span class="ow">not</span> <span class="bp">self</span><span class="o">.</span><span class="n">args</span><span class="p">:</span>
<span class="n">string</span> <span class="o">=</span> <span class="p">(</span>
<span class="s2">&quot;Usage: lock &lt;object&gt;[ = &lt;lockstring&gt;] or lock[/switch] &quot;</span> <span class="s2">&quot;&lt;object&gt;/&lt;access_type&gt;&quot;</span>
<span class="p">)</span>
<span class="n">caller</span><span class="o">.</span><span class="n">msg</span><span class="p">(</span><span class="n">string</span><span class="p">)</span>
<span class="k">return</span>
<span class="k">if</span> <span class="s2">&quot;/&quot;</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">lhs</span><span class="p">:</span>
<span class="c1"># call of the form lock obj/access_type</span>
<span class="n">objname</span><span class="p">,</span> <span class="n">access_type</span> <span class="o">=</span> <span class="p">[</span><span class="n">p</span><span class="o">.</span><span class="n">strip</span><span class="p">()</span> <span class="k">for</span> <span class="n">p</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">lhs</span><span class="o">.</span><span class="n">split</span><span class="p">(</span><span class="s2">&quot;/&quot;</span><span class="p">,</span> <span class="mi">1</span><span class="p">)]</span>
<span class="n">obj</span> <span class="o">=</span> <span class="kc">None</span>
<span class="k">if</span> <span class="n">objname</span><span class="o">.</span><span class="n">startswith</span><span class="p">(</span><span class="s2">&quot;*&quot;</span><span class="p">):</span>
<span class="n">obj</span> <span class="o">=</span> <span class="n">caller</span><span class="o">.</span><span class="n">search_account</span><span class="p">(</span><span class="n">objname</span><span class="o">.</span><span class="n">lstrip</span><span class="p">(</span><span class="s2">&quot;*&quot;</span><span class="p">))</span>
<span class="k">if</span> <span class="ow">not</span> <span class="n">obj</span><span class="p">:</span>
<span class="n">obj</span> <span class="o">=</span> <span class="n">caller</span><span class="o">.</span><span class="n">search</span><span class="p">(</span><span class="n">objname</span><span class="p">)</span>
<span class="k">if</span> <span class="ow">not</span> <span class="n">obj</span><span class="p">:</span>
<span class="k">return</span>
<span class="n">has_control_access</span> <span class="o">=</span> <span class="n">obj</span><span class="o">.</span><span class="n">access</span><span class="p">(</span><span class="n">caller</span><span class="p">,</span> <span class="s2">&quot;control&quot;</span><span class="p">)</span>
<span class="k">if</span> <span class="n">access_type</span> <span class="o">==</span> <span class="s2">&quot;control&quot;</span> <span class="ow">and</span> <span class="ow">not</span> <span class="n">has_control_access</span><span class="p">:</span>
<span class="c1"># only allow to change &#39;control&#39; access if you have &#39;control&#39; access already</span>
<span class="n">caller</span><span class="o">.</span><span class="n">msg</span><span class="p">(</span><span class="s2">&quot;You need &#39;control&#39; access to change this type of lock.&quot;</span><span class="p">)</span>
<span class="k">return</span>
<span class="k">if</span> <span class="ow">not</span> <span class="p">(</span><span class="n">has_control_access</span> <span class="ow">or</span> <span class="n">obj</span><span class="o">.</span><span class="n">access</span><span class="p">(</span><span class="n">caller</span><span class="p">,</span> <span class="s2">&quot;edit&quot;</span><span class="p">)):</span>
<span class="n">caller</span><span class="o">.</span><span class="n">msg</span><span class="p">(</span><span class="s2">&quot;You are not allowed to do that.&quot;</span><span class="p">)</span>
<span class="k">return</span>
<span class="n">lockdef</span> <span class="o">=</span> <span class="n">obj</span><span class="o">.</span><span class="n">locks</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="n">access_type</span><span class="p">)</span>
<span class="k">if</span> <span class="n">lockdef</span><span class="p">:</span>
<span class="k">if</span> <span class="s2">&quot;del&quot;</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">switches</span><span class="p">:</span>
<span class="n">obj</span><span class="o">.</span><span class="n">locks</span><span class="o">.</span><span class="n">delete</span><span class="p">(</span><span class="n">access_type</span><span class="p">)</span>
<span class="n">string</span> <span class="o">=</span> <span class="s2">&quot;deleted lock </span><span class="si">%s</span><span class="s2">&quot;</span> <span class="o">%</span> <span class="n">lockdef</span>
<span class="k">else</span><span class="p">:</span>
<span class="n">string</span> <span class="o">=</span> <span class="n">lockdef</span>
<span class="k">else</span><span class="p">:</span>
<span class="n">string</span> <span class="o">=</span> <span class="s2">&quot;</span><span class="si">%s</span><span class="s2"> has no lock of access type &#39;</span><span class="si">%s</span><span class="s2">&#39;.&quot;</span> <span class="o">%</span> <span class="p">(</span><span class="n">obj</span><span class="p">,</span> <span class="n">access_type</span><span class="p">)</span>
<span class="n">caller</span><span class="o">.</span><span class="n">msg</span><span class="p">(</span><span class="n">string</span><span class="p">)</span>
<span class="k">return</span>
<span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">rhs</span><span class="p">:</span>
<span class="c1"># we have a = separator, so we are assigning a new lock</span>
<span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">switches</span><span class="p">:</span>
<span class="n">swi</span> <span class="o">=</span> <span class="s2">&quot;, &quot;</span><span class="o">.</span><span class="n">join</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">switches</span><span class="p">)</span>
<span class="n">caller</span><span class="o">.</span><span class="n">msg</span><span class="p">(</span>
<span class="s2">&quot;Switch(es) |w</span><span class="si">%s</span><span class="s2">|n can not be used with a &quot;</span>
<span class="s2">&quot;lock assignment. Use e.g. &quot;</span>
<span class="s2">&quot;|wlock/del objname/locktype|n instead.&quot;</span> <span class="o">%</span> <span class="n">swi</span>
<span class="p">)</span>
<span class="k">return</span>
<span class="n">objname</span><span class="p">,</span> <span class="n">lockdef</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">lhs</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">rhs</span>
<span class="n">obj</span> <span class="o">=</span> <span class="kc">None</span>
<span class="k">if</span> <span class="n">objname</span><span class="o">.</span><span class="n">startswith</span><span class="p">(</span><span class="s2">&quot;*&quot;</span><span class="p">):</span>
<span class="n">obj</span> <span class="o">=</span> <span class="n">caller</span><span class="o">.</span><span class="n">search_account</span><span class="p">(</span><span class="n">objname</span><span class="o">.</span><span class="n">lstrip</span><span class="p">(</span><span class="s2">&quot;*&quot;</span><span class="p">))</span>
<span class="k">if</span> <span class="ow">not</span> <span class="n">obj</span><span class="p">:</span>
<span class="n">obj</span> <span class="o">=</span> <span class="n">caller</span><span class="o">.</span><span class="n">search</span><span class="p">(</span><span class="n">objname</span><span class="p">)</span>
<span class="k">if</span> <span class="ow">not</span> <span class="n">obj</span><span class="p">:</span>
<span class="k">return</span>
<span class="k">if</span> <span class="ow">not</span> <span class="p">(</span><span class="n">obj</span><span class="o">.</span><span class="n">access</span><span class="p">(</span><span class="n">caller</span><span class="p">,</span> <span class="s2">&quot;control&quot;</span><span class="p">)</span> <span class="ow">or</span> <span class="n">obj</span><span class="o">.</span><span class="n">access</span><span class="p">(</span><span class="n">caller</span><span class="p">,</span> <span class="s2">&quot;edit&quot;</span><span class="p">)):</span>
<span class="n">caller</span><span class="o">.</span><span class="n">msg</span><span class="p">(</span><span class="s2">&quot;You are not allowed to do that.&quot;</span><span class="p">)</span>
<span class="k">return</span>
<span class="n">ok</span> <span class="o">=</span> <span class="kc">False</span>
<span class="n">lockdef</span> <span class="o">=</span> <span class="n">re</span><span class="o">.</span><span class="n">sub</span><span class="p">(</span><span class="sa">r</span><span class="s2">&quot;\&#39;|</span><span class="se">\&quot;</span><span class="s2">&quot;</span><span class="p">,</span> <span class="s2">&quot;&quot;</span><span class="p">,</span> <span class="n">lockdef</span><span class="p">)</span>
<span class="k">try</span><span class="p">:</span>
<span class="n">ok</span> <span class="o">=</span> <span class="n">obj</span><span class="o">.</span><span class="n">locks</span><span class="o">.</span><span class="n">add</span><span class="p">(</span><span class="n">lockdef</span><span class="p">)</span>
<span class="k">except</span> <span class="n">LockException</span> <span class="k">as</span> <span class="n">e</span><span class="p">:</span>
<span class="n">caller</span><span class="o">.</span><span class="n">msg</span><span class="p">(</span><span class="nb">str</span><span class="p">(</span><span class="n">e</span><span class="p">))</span>
<span class="k">if</span> <span class="s2">&quot;cmd&quot;</span> <span class="ow">in</span> <span class="n">lockdef</span><span class="o">.</span><span class="n">lower</span><span class="p">()</span> <span class="ow">and</span> <span class="n">inherits_from</span><span class="p">(</span>
<span class="n">obj</span><span class="p">,</span> <span class="s2">&quot;evennia.objects.objects.DefaultExit&quot;</span>
<span class="p">):</span>
<span class="c1"># special fix to update Exits since &quot;cmd&quot;-type locks won&#39;t</span>
<span class="c1"># update on them unless their cmdsets are rebuilt.</span>
<span class="n">obj</span><span class="o">.</span><span class="n">at_init</span><span class="p">()</span>
<span class="k">if</span> <span class="n">ok</span><span class="p">:</span>
<span class="n">caller</span><span class="o">.</span><span class="n">msg</span><span class="p">(</span><span class="s2">&quot;Added lock &#39;</span><span class="si">%s</span><span class="s2">&#39; to </span><span class="si">%s</span><span class="s2">.&quot;</span> <span class="o">%</span> <span class="p">(</span><span class="n">lockdef</span><span class="p">,</span> <span class="n">obj</span><span class="p">))</span>
<span class="k">return</span>
<span class="c1"># if we get here, we are just viewing all locks on obj</span>
<span class="n">obj</span> <span class="o">=</span> <span class="kc">None</span>
<span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">lhs</span><span class="o">.</span><span class="n">startswith</span><span class="p">(</span><span class="s2">&quot;*&quot;</span><span class="p">):</span>
<span class="n">obj</span> <span class="o">=</span> <span class="n">caller</span><span class="o">.</span><span class="n">search_account</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">lhs</span><span class="o">.</span><span class="n">lstrip</span><span class="p">(</span><span class="s2">&quot;*&quot;</span><span class="p">))</span>
<span class="k">if</span> <span class="ow">not</span> <span class="n">obj</span><span class="p">:</span>
<span class="n">obj</span> <span class="o">=</span> <span class="n">caller</span><span class="o">.</span><span class="n">search</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">lhs</span><span class="p">)</span>
<span class="k">if</span> <span class="ow">not</span> <span class="n">obj</span><span class="p">:</span>
<span class="k">return</span>
<span class="k">if</span> <span class="ow">not</span> <span class="p">(</span><span class="n">obj</span><span class="o">.</span><span class="n">access</span><span class="p">(</span><span class="n">caller</span><span class="p">,</span> <span class="s2">&quot;control&quot;</span><span class="p">)</span> <span class="ow">or</span> <span class="n">obj</span><span class="o">.</span><span class="n">access</span><span class="p">(</span><span class="n">caller</span><span class="p">,</span> <span class="s2">&quot;edit&quot;</span><span class="p">)):</span>
<span class="n">caller</span><span class="o">.</span><span class="n">msg</span><span class="p">(</span><span class="s2">&quot;You are not allowed to do that.&quot;</span><span class="p">)</span>
<span class="k">return</span>
<span class="n">caller</span><span class="o">.</span><span class="n">msg</span><span class="p">(</span><span class="s2">&quot;</span><span class="se">\n</span><span class="s2">&quot;</span><span class="o">.</span><span class="n">join</span><span class="p">(</span><span class="n">obj</span><span class="o">.</span><span class="n">locks</span><span class="o">.</span><span class="n">all</span><span class="p">()))</span></div></div>
<div class="viewcode-block" id="CmdExamine"><a class="viewcode-back" href="../../../../api/evennia.commands.default.building.html#evennia.commands.default.building.CmdExamine">[docs]</a><span class="k">class</span> <span class="nc">CmdExamine</span><span class="p">(</span><span class="n">ObjManipCommand</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> get detailed information about an object</span>
<span class="sd"> Usage:</span>
<span class="sd"> examine [&lt;object&gt;[/attrname]]</span>
<span class="sd"> examine [*&lt;account&gt;[/attrname]]</span>
<span class="sd"> Switch:</span>
<span class="sd"> account - examine an Account (same as adding *)</span>
<span class="sd"> object - examine an Object (useful when OOC)</span>
<span class="sd"> The examine command shows detailed game info about an</span>
<span class="sd"> object and optionally a specific attribute on it.</span>
<span class="sd"> If object is not specified, the current location is examined.</span>
<span class="sd"> Append a * before the search string to examine an account.</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="n">key</span> <span class="o">=</span> <span class="s2">&quot;examine&quot;</span>
<span class="n">aliases</span> <span class="o">=</span> <span class="p">[</span><span class="s2">&quot;ex&quot;</span><span class="p">,</span> <span class="s2">&quot;exam&quot;</span><span class="p">]</span>
<span class="n">locks</span> <span class="o">=</span> <span class="s2">&quot;cmd:perm(examine) or perm(Builder)&quot;</span>
<span class="n">help_category</span> <span class="o">=</span> <span class="s2">&quot;Building&quot;</span>
<span class="n">arg_regex</span> <span class="o">=</span> <span class="sa">r</span><span class="s2">&quot;(/\w+?(\s|$))|\s|$&quot;</span>
<span class="n">account_mode</span> <span class="o">=</span> <span class="kc">False</span>
<span class="n">detail_color</span> <span class="o">=</span> <span class="s2">&quot;|c&quot;</span>
<span class="n">header_color</span> <span class="o">=</span> <span class="s2">&quot;|w&quot;</span>
<span class="n">quell_color</span> <span class="o">=</span> <span class="s2">&quot;|r&quot;</span>
<span class="n">separator</span> <span class="o">=</span> <span class="s2">&quot;-&quot;</span>
<div class="viewcode-block" id="CmdExamine.list_attribute"><a class="viewcode-back" href="../../../../api/evennia.commands.default.building.html#evennia.commands.default.building.CmdExamine.list_attribute">[docs]</a> <span class="k">def</span> <span class="nf">list_attribute</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">crop</span><span class="p">,</span> <span class="n">attr</span><span class="p">,</span> <span class="n">category</span><span class="p">,</span> <span class="n">value</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> Formats a single attribute line.</span>
<span class="sd"> Args:</span>
<span class="sd"> crop (bool): If output should be cropped if too long.</span>
<span class="sd"> attr (str): Attribute key.</span>
<span class="sd"> category (str): Attribute category.</span>
<span class="sd"> value (any): Attribute value.</span>
<span class="sd"> Returns:</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="k">if</span> <span class="n">attr</span> <span class="ow">is</span> <span class="kc">None</span><span class="p">:</span>
<span class="k">return</span> <span class="s2">&quot;No such attribute was found.&quot;</span>
<span class="n">value</span> <span class="o">=</span> <span class="n">utils</span><span class="o">.</span><span class="n">to_str</span><span class="p">(</span><span class="n">value</span><span class="p">)</span>
<span class="k">if</span> <span class="n">crop</span><span class="p">:</span>
<span class="n">value</span> <span class="o">=</span> <span class="n">utils</span><span class="o">.</span><span class="n">crop</span><span class="p">(</span><span class="n">value</span><span class="p">)</span>
<span class="n">value</span> <span class="o">=</span> <span class="n">inlinefunc_raw</span><span class="p">(</span><span class="n">ansi_raw</span><span class="p">(</span><span class="n">value</span><span class="p">))</span>
<span class="k">if</span> <span class="n">category</span><span class="p">:</span>
<span class="k">return</span> <span class="n">f</span><span class="s2">&quot;</span><span class="si">{attr}</span><span class="s2">[</span><span class="si">{category}</span><span class="s2">] = </span><span class="si">{value}</span><span class="s2">&quot;</span>
<span class="k">else</span><span class="p">:</span>
<span class="k">return</span> <span class="n">f</span><span class="s2">&quot;</span><span class="si">{attr}</span><span class="s2"> = </span><span class="si">{value}</span><span class="s2">&quot;</span></div>
<div class="viewcode-block" id="CmdExamine.format_attributes"><a class="viewcode-back" href="../../../../api/evennia.commands.default.building.html#evennia.commands.default.building.CmdExamine.format_attributes">[docs]</a> <span class="k">def</span> <span class="nf">format_attributes</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">obj</span><span class="p">,</span> <span class="n">attrname</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span> <span class="n">crop</span><span class="o">=</span><span class="kc">True</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> Helper function that returns info about attributes and/or</span>
<span class="sd"> non-persistent data stored on object</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="k">if</span> <span class="n">attrname</span><span class="p">:</span>
<span class="k">if</span> <span class="n">obj</span><span class="o">.</span><span class="n">attributes</span><span class="o">.</span><span class="n">has</span><span class="p">(</span><span class="n">attrname</span><span class="p">):</span>
<span class="n">db_attr</span> <span class="o">=</span> <span class="p">[(</span><span class="n">attrname</span><span class="p">,</span> <span class="n">obj</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="n">attrname</span><span class="p">),</span> <span class="kc">None</span><span class="p">)]</span>
<span class="k">else</span><span class="p">:</span>
<span class="n">db_attr</span> <span class="o">=</span> <span class="kc">None</span>
<span class="k">try</span><span class="p">:</span>
<span class="n">ndb_attr</span> <span class="o">=</span> <span class="p">[(</span><span class="n">attrname</span><span class="p">,</span> <span class="nb">object</span><span class="o">.</span><span class="fm">__getattribute__</span><span class="p">(</span><span class="n">obj</span><span class="o">.</span><span class="n">ndb</span><span class="p">,</span> <span class="n">attrname</span><span class="p">))]</span>
<span class="k">except</span> <span class="ne">Exception</span><span class="p">:</span>
<span class="n">ndb_attr</span> <span class="o">=</span> <span class="kc">None</span>
<span class="k">if</span> <span class="ow">not</span> <span class="p">(</span><span class="n">db_attr</span> <span class="ow">or</span> <span class="n">ndb_attr</span><span class="p">):</span>
<span class="k">return</span> <span class="p">{</span><span class="s2">&quot;Attribue(s)&quot;</span><span class="p">:</span> <span class="n">f</span><span class="s2">&quot;</span><span class="se">\n</span><span class="s2"> No Attribute &#39;</span><span class="si">{attrname}</span><span class="s2">&#39; found on </span><span class="si">{obj.name}</span><span class="s2">&quot;</span><span class="p">}</span>
<span class="k">else</span><span class="p">:</span>
<span class="n">db_attr</span> <span class="o">=</span> <span class="p">[(</span><span class="n">attr</span><span class="o">.</span><span class="n">key</span><span class="p">,</span> <span class="n">attr</span><span class="o">.</span><span class="n">value</span><span class="p">,</span> <span class="n">attr</span><span class="o">.</span><span class="n">category</span><span class="p">)</span> <span class="k">for</span> <span class="n">attr</span> <span class="ow">in</span> <span class="n">obj</span><span class="o">.</span><span class="n">db_attributes</span><span class="o">.</span><span class="n">all</span><span class="p">()]</span>
<span class="k">try</span><span class="p">:</span>
<span class="n">ndb_attr</span> <span class="o">=</span> <span class="n">obj</span><span class="o">.</span><span class="n">nattributes</span><span class="o">.</span><span class="n">all</span><span class="p">(</span><span class="n">return_tuples</span><span class="o">=</span><span class="kc">True</span><span class="p">)</span>
<span class="k">except</span> <span class="ne">Exception</span><span class="p">:</span>
<span class="n">ndb_attr</span> <span class="o">=</span> <span class="p">(</span><span class="kc">None</span><span class="p">,</span> <span class="kc">None</span><span class="p">,</span> <span class="kc">None</span><span class="p">)</span>
<span class="n">output</span> <span class="o">=</span> <span class="p">{}</span>
<span class="k">if</span> <span class="n">db_attr</span> <span class="ow">and</span> <span class="n">db_attr</span><span class="p">[</span><span class="mi">0</span><span class="p">]:</span>
<span class="n">output</span><span class="p">[</span><span class="s2">&quot;Persistent attribute(s)&quot;</span><span class="p">]</span> <span class="o">=</span> <span class="s2">&quot;</span><span class="se">\n</span><span class="s2"> &quot;</span> <span class="o">+</span> <span class="s2">&quot;</span><span class="se">\n</span><span class="s2"> &quot;</span><span class="o">.</span><span class="n">join</span><span class="p">(</span>
<span class="nb">sorted</span><span class="p">(</span>
<span class="bp">self</span><span class="o">.</span><span class="n">list_attribute</span><span class="p">(</span><span class="n">crop</span><span class="p">,</span> <span class="n">attr</span><span class="p">,</span> <span class="n">category</span><span class="p">,</span> <span class="n">value</span><span class="p">)</span>
<span class="k">for</span> <span class="n">attr</span><span class="p">,</span> <span class="n">value</span><span class="p">,</span> <span class="n">category</span> <span class="ow">in</span> <span class="n">db_attr</span>
<span class="p">)</span>
<span class="p">)</span>
<span class="k">if</span> <span class="n">ndb_attr</span> <span class="ow">and</span> <span class="n">ndb_attr</span><span class="p">[</span><span class="mi">0</span><span class="p">]:</span>
<span class="n">output</span><span class="p">[</span><span class="s2">&quot;Non-Persistent attribute(s)&quot;</span><span class="p">]</span> <span class="o">=</span> <span class="s2">&quot; </span><span class="se">\n</span><span class="s2">&quot;</span> <span class="o">+</span> <span class="s2">&quot; </span><span class="se">\n</span><span class="s2">&quot;</span><span class="o">.</span><span class="n">join</span><span class="p">(</span>
<span class="nb">sorted</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">list_attribute</span><span class="p">(</span><span class="n">crop</span><span class="p">,</span> <span class="n">attr</span><span class="p">,</span> <span class="kc">None</span><span class="p">,</span> <span class="n">value</span><span class="p">)</span> <span class="k">for</span> <span class="n">attr</span><span class="p">,</span> <span class="n">value</span> <span class="ow">in</span> <span class="n">ndb_attr</span><span class="p">)</span>
<span class="p">)</span>
<span class="k">return</span> <span class="n">output</span></div>
<div class="viewcode-block" id="CmdExamine.format_output"><a class="viewcode-back" href="../../../../api/evennia.commands.default.building.html#evennia.commands.default.building.CmdExamine.format_output">[docs]</a> <span class="k">def</span> <span class="nf">format_output</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">obj</span><span class="p">,</span> <span class="n">current_cmdset</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> Helper function that creates a nice report about an object.</span>
<span class="sd"> Args:</span>
<span class="sd"> obj (any): Object to analyze.</span>
<span class="sd"> current_cmdset (CmdSet): Current cmdset for object.</span>
<span class="sd"> Returns:</span>
<span class="sd"> str: The formatted string.</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="n">hclr</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">header_color</span>
<span class="n">dclr</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">detail_color</span>
<span class="n">qclr</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">quell_color</span>
<span class="n">output</span> <span class="o">=</span> <span class="p">{}</span>
<span class="c1"># main key</span>
<span class="n">output</span><span class="p">[</span><span class="s2">&quot;Name/key&quot;</span><span class="p">]</span> <span class="o">=</span> <span class="n">f</span><span class="s2">&quot;</span><span class="si">{dclr}{obj.name}</span><span class="s2">|n (</span><span class="si">{obj.dbref}</span><span class="s2">)&quot;</span>
<span class="c1"># aliases</span>
<span class="k">if</span> <span class="nb">hasattr</span><span class="p">(</span><span class="n">obj</span><span class="p">,</span> <span class="s2">&quot;aliases&quot;</span><span class="p">)</span> <span class="ow">and</span> <span class="n">obj</span><span class="o">.</span><span class="n">aliases</span><span class="o">.</span><span class="n">all</span><span class="p">():</span>
<span class="n">output</span><span class="p">[</span><span class="s2">&quot;Aliases&quot;</span><span class="p">]</span> <span class="o">=</span> <span class="s2">&quot;, &quot;</span><span class="o">.</span><span class="n">join</span><span class="p">(</span><span class="n">utils</span><span class="o">.</span><span class="n">make_iter</span><span class="p">(</span><span class="nb">str</span><span class="p">(</span><span class="n">obj</span><span class="o">.</span><span class="n">aliases</span><span class="p">)))</span>
<span class="c1"># typeclass</span>
<span class="n">output</span><span class="p">[</span><span class="s2">&quot;Typeclass&quot;</span><span class="p">]</span> <span class="o">=</span> <span class="n">f</span><span class="s2">&quot;</span><span class="si">{obj.typename}</span><span class="s2"> (</span><span class="si">{obj.typeclass_path}</span><span class="s2">)&quot;</span>
<span class="c1"># sessions</span>
<span class="k">if</span> <span class="nb">hasattr</span><span class="p">(</span><span class="n">obj</span><span class="p">,</span> <span class="s2">&quot;sessions&quot;</span><span class="p">)</span> <span class="ow">and</span> <span class="n">obj</span><span class="o">.</span><span class="n">sessions</span><span class="o">.</span><span class="n">all</span><span class="p">():</span>
<span class="n">output</span><span class="p">[</span><span class="s2">&quot;Session id(s)&quot;</span><span class="p">]</span> <span class="o">=</span> <span class="s2">&quot;, &quot;</span><span class="o">.</span><span class="n">join</span><span class="p">(</span><span class="n">f</span><span class="s2">&quot;#</span><span class="si">{sess.sessid}</span><span class="s2">&quot;</span> <span class="k">for</span> <span class="n">sess</span> <span class="ow">in</span> <span class="n">obj</span><span class="o">.</span><span class="n">sessions</span><span class="o">.</span><span class="n">all</span><span class="p">())</span>
<span class="c1"># email, if any</span>
<span class="k">if</span> <span class="nb">hasattr</span><span class="p">(</span><span class="n">obj</span><span class="p">,</span> <span class="s2">&quot;email&quot;</span><span class="p">)</span> <span class="ow">and</span> <span class="n">obj</span><span class="o">.</span><span class="n">email</span><span class="p">:</span>
<span class="n">output</span><span class="p">[</span><span class="s2">&quot;Email&quot;</span><span class="p">]</span> <span class="o">=</span> <span class="n">f</span><span class="s2">&quot;</span><span class="si">{dclr}{obj.email}</span><span class="s2">|n&quot;</span>
<span class="c1"># account, for puppeted objects</span>
<span class="k">if</span> <span class="nb">hasattr</span><span class="p">(</span><span class="n">obj</span><span class="p">,</span> <span class="s2">&quot;has_account&quot;</span><span class="p">)</span> <span class="ow">and</span> <span class="n">obj</span><span class="o">.</span><span class="n">has_account</span><span class="p">:</span>
<span class="n">output</span><span class="p">[</span><span class="s2">&quot;Account&quot;</span><span class="p">]</span> <span class="o">=</span> <span class="n">f</span><span class="s2">&quot;</span><span class="si">{dclr}{obj.account.name}</span><span class="s2">|n (</span><span class="si">{obj.account.dbref}</span><span class="s2">)&quot;</span>
<span class="c1"># account typeclass</span>
<span class="n">output</span><span class="p">[</span><span class="s2">&quot; Account Typeclass&quot;</span><span class="p">]</span> <span class="o">=</span> <span class="n">f</span><span class="s2">&quot;</span><span class="si">{obj.account.typename}</span><span class="s2"> (</span><span class="si">{obj.account.typeclass_path}</span><span class="s2">)&quot;</span>
<span class="c1"># account permissions</span>
<span class="n">perms</span> <span class="o">=</span> <span class="n">obj</span><span class="o">.</span><span class="n">account</span><span class="o">.</span><span class="n">permissions</span><span class="o">.</span><span class="n">all</span><span class="p">()</span>
<span class="k">if</span> <span class="n">obj</span><span class="o">.</span><span class="n">account</span><span class="o">.</span><span class="n">is_superuser</span><span class="p">:</span>
<span class="n">perms</span> <span class="o">=</span> <span class="p">[</span><span class="s2">&quot;&lt;Superuser&gt;&quot;</span><span class="p">]</span>
<span class="k">elif</span> <span class="ow">not</span> <span class="n">perms</span><span class="p">:</span>
<span class="n">perms</span> <span class="o">=</span> <span class="p">[</span><span class="s2">&quot;&lt;None&gt;&quot;</span><span class="p">]</span>
<span class="n">perms</span> <span class="o">=</span> <span class="s2">&quot;, &quot;</span><span class="o">.</span><span class="n">join</span><span class="p">(</span><span class="n">perms</span><span class="p">)</span>
<span class="k">if</span> <span class="n">obj</span><span class="o">.</span><span class="n">account</span><span class="o">.</span><span class="n">attributes</span><span class="o">.</span><span class="n">has</span><span class="p">(</span><span class="s2">&quot;_quell&quot;</span><span class="p">):</span>
<span class="n">perms</span> <span class="o">+=</span> <span class="n">f</span><span class="s2">&quot; </span><span class="si">{qclr}</span><span class="s2">(quelled)|n&quot;</span>
<span class="n">output</span><span class="p">[</span><span class="s2">&quot; Account Permissions&quot;</span><span class="p">]</span> <span class="o">=</span> <span class="n">perms</span>
<span class="c1"># location</span>
<span class="k">if</span> <span class="nb">hasattr</span><span class="p">(</span><span class="n">obj</span><span class="p">,</span> <span class="s2">&quot;location&quot;</span><span class="p">):</span>
<span class="n">loc</span> <span class="o">=</span> <span class="nb">str</span><span class="p">(</span><span class="n">obj</span><span class="o">.</span><span class="n">location</span><span class="p">)</span>
<span class="k">if</span> <span class="n">obj</span><span class="o">.</span><span class="n">location</span><span class="p">:</span>
<span class="n">loc</span> <span class="o">+=</span> <span class="n">f</span><span class="s2">&quot; (#</span><span class="si">{obj.location.id}</span><span class="s2">)&quot;</span>
<span class="n">output</span><span class="p">[</span><span class="s2">&quot;Location&quot;</span><span class="p">]</span> <span class="o">=</span> <span class="n">loc</span>
<span class="c1"># home</span>
<span class="k">if</span> <span class="nb">hasattr</span><span class="p">(</span><span class="n">obj</span><span class="p">,</span> <span class="s2">&quot;home&quot;</span><span class="p">):</span>
<span class="n">home</span> <span class="o">=</span> <span class="nb">str</span><span class="p">(</span><span class="n">obj</span><span class="o">.</span><span class="n">home</span><span class="p">)</span>
<span class="k">if</span> <span class="n">obj</span><span class="o">.</span><span class="n">home</span><span class="p">:</span>
<span class="n">home</span> <span class="o">+=</span> <span class="n">f</span><span class="s2">&quot; (#</span><span class="si">{obj.home.id}</span><span class="s2">)&quot;</span>
<span class="n">output</span><span class="p">[</span><span class="s2">&quot;Home&quot;</span><span class="p">]</span> <span class="o">=</span> <span class="n">home</span>
<span class="c1"># destination, for exits</span>
<span class="k">if</span> <span class="nb">hasattr</span><span class="p">(</span><span class="n">obj</span><span class="p">,</span> <span class="s2">&quot;destination&quot;</span><span class="p">)</span> <span class="ow">and</span> <span class="n">obj</span><span class="o">.</span><span class="n">destination</span><span class="p">:</span>
<span class="n">dest</span> <span class="o">=</span> <span class="nb">str</span><span class="p">(</span><span class="n">obj</span><span class="o">.</span><span class="n">destination</span><span class="p">)</span>
<span class="k">if</span> <span class="n">obj</span><span class="o">.</span><span class="n">destination</span><span class="p">:</span>
<span class="n">dest</span> <span class="o">+=</span> <span class="n">f</span><span class="s2">&quot; (#</span><span class="si">{obj.destination.id}</span><span class="s2">)&quot;</span>
<span class="n">output</span><span class="p">[</span><span class="s2">&quot;Destination&quot;</span><span class="p">]</span> <span class="o">=</span> <span class="n">dest</span>
<span class="c1"># main permissions</span>
<span class="n">perms</span> <span class="o">=</span> <span class="n">obj</span><span class="o">.</span><span class="n">permissions</span><span class="o">.</span><span class="n">all</span><span class="p">()</span>
<span class="n">perms_string</span> <span class="o">=</span> <span class="s2">&quot;&quot;</span>
<span class="k">if</span> <span class="n">perms</span><span class="p">:</span>
<span class="n">perms_string</span> <span class="o">=</span> <span class="s2">&quot;, &quot;</span><span class="o">.</span><span class="n">join</span><span class="p">(</span><span class="n">perms</span><span class="p">)</span>
<span class="k">if</span> <span class="n">obj</span><span class="o">.</span><span class="n">is_superuser</span><span class="p">:</span>
<span class="n">perms_string</span> <span class="o">+=</span> <span class="s2">&quot; &lt;Superuser&gt;&quot;</span>
<span class="k">if</span> <span class="n">perms_string</span><span class="p">:</span>
<span class="n">output</span><span class="p">[</span><span class="s2">&quot;Permissions&quot;</span><span class="p">]</span> <span class="o">=</span> <span class="n">perms_string</span>
<span class="c1"># locks</span>
<span class="n">locks</span> <span class="o">=</span> <span class="nb">str</span><span class="p">(</span><span class="n">obj</span><span class="o">.</span><span class="n">locks</span><span class="p">)</span>
<span class="k">if</span> <span class="n">locks</span><span class="p">:</span>
<span class="n">locks_string</span> <span class="o">=</span> <span class="s2">&quot;</span><span class="se">\n</span><span class="s2">&quot;</span> <span class="o">+</span> <span class="n">utils</span><span class="o">.</span><span class="n">fill</span><span class="p">(</span>
<span class="s2">&quot;; &quot;</span><span class="o">.</span><span class="n">join</span><span class="p">([</span><span class="n">lock</span> <span class="k">for</span> <span class="n">lock</span> <span class="ow">in</span> <span class="n">locks</span><span class="o">.</span><span class="n">split</span><span class="p">(</span><span class="s2">&quot;;&quot;</span><span class="p">)]),</span> <span class="n">indent</span><span class="o">=</span><span class="mi">2</span>
<span class="p">)</span>
<span class="k">else</span><span class="p">:</span>
<span class="n">locks_string</span> <span class="o">=</span> <span class="s2">&quot; Default&quot;</span>
<span class="n">output</span><span class="p">[</span><span class="s2">&quot;Locks&quot;</span><span class="p">]</span> <span class="o">=</span> <span class="n">locks_string</span>
<span class="c1"># cmdsets</span>
<span class="k">if</span> <span class="ow">not</span> <span class="p">(</span><span class="nb">len</span><span class="p">(</span><span class="n">obj</span><span class="o">.</span><span class="n">cmdset</span><span class="o">.</span><span class="n">all</span><span class="p">())</span> <span class="o">==</span> <span class="mi">1</span> <span class="ow">and</span> <span class="n">obj</span><span class="o">.</span><span class="n">cmdset</span><span class="o">.</span><span class="n">current</span><span class="o">.</span><span class="n">key</span> <span class="o">==</span> <span class="s2">&quot;_EMPTY_CMDSET&quot;</span><span class="p">):</span>
<span class="c1"># all() returns a &#39;stack&#39;, so make a copy to sort.</span>
<span class="k">def</span> <span class="nf">_format_options</span><span class="p">(</span><span class="n">cmdset</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;helper for cmdset-option display&quot;&quot;&quot;</span>
<span class="k">def</span> <span class="nf">_truefalse</span><span class="p">(</span><span class="n">string</span><span class="p">,</span> <span class="n">value</span><span class="p">):</span>
<span class="k">if</span> <span class="n">value</span> <span class="ow">is</span> <span class="kc">None</span><span class="p">:</span>
<span class="k">return</span> <span class="s2">&quot;&quot;</span>
<span class="k">if</span> <span class="n">value</span><span class="p">:</span>
<span class="k">return</span> <span class="n">f</span><span class="s2">&quot;</span><span class="si">{string}</span><span class="s2">: T&quot;</span>
<span class="k">return</span> <span class="n">f</span><span class="s2">&quot;</span><span class="si">{string}</span><span class="s2">: F&quot;</span>
<span class="n">options</span> <span class="o">=</span> <span class="s2">&quot;, &quot;</span><span class="o">.</span><span class="n">join</span><span class="p">(</span>
<span class="n">_truefalse</span><span class="p">(</span><span class="n">opt</span><span class="p">,</span> <span class="nb">getattr</span><span class="p">(</span><span class="n">cmdset</span><span class="p">,</span> <span class="n">opt</span><span class="p">))</span>
<span class="k">for</span> <span class="n">opt</span> <span class="ow">in</span> <span class="p">(</span><span class="s2">&quot;no_exits&quot;</span><span class="p">,</span> <span class="s2">&quot;no_objs&quot;</span><span class="p">,</span> <span class="s2">&quot;no_channels&quot;</span><span class="p">,</span> <span class="s2">&quot;duplicates&quot;</span><span class="p">)</span>
<span class="k">if</span> <span class="nb">getattr</span><span class="p">(</span><span class="n">cmdset</span><span class="p">,</span> <span class="n">opt</span><span class="p">)</span> <span class="ow">is</span> <span class="ow">not</span> <span class="kc">None</span>
<span class="p">)</span>
<span class="n">options</span> <span class="o">=</span> <span class="s2">&quot;, &quot;</span> <span class="o">+</span> <span class="n">options</span> <span class="k">if</span> <span class="n">options</span> <span class="k">else</span> <span class="s2">&quot;&quot;</span>
<span class="k">return</span> <span class="n">options</span>
<span class="c1"># cmdset stored on us</span>
<span class="n">stored_cmdsets</span> <span class="o">=</span> <span class="nb">sorted</span><span class="p">(</span><span class="n">obj</span><span class="o">.</span><span class="n">cmdset</span><span class="o">.</span><span class="n">all</span><span class="p">(),</span> <span class="n">key</span><span class="o">=</span><span class="k">lambda</span> <span class="n">x</span><span class="p">:</span> <span class="n">x</span><span class="o">.</span><span class="n">priority</span><span class="p">,</span> <span class="n">reverse</span><span class="o">=</span><span class="kc">True</span><span class="p">)</span>
<span class="n">stored</span> <span class="o">=</span> <span class="p">[]</span>
<span class="k">for</span> <span class="n">cmdset</span> <span class="ow">in</span> <span class="n">stored_cmdsets</span><span class="p">:</span>
<span class="k">if</span> <span class="n">cmdset</span><span class="o">.</span><span class="n">key</span> <span class="o">==</span> <span class="s2">&quot;_EMPTY_CMDSET&quot;</span><span class="p">:</span>
<span class="k">continue</span>
<span class="n">options</span> <span class="o">=</span> <span class="n">_format_options</span><span class="p">(</span><span class="n">cmdset</span><span class="p">)</span>
<span class="n">stored</span><span class="o">.</span><span class="n">append</span><span class="p">(</span>
<span class="n">f</span><span class="s2">&quot;</span><span class="si">{cmdset.path}</span><span class="s2"> [</span><span class="si">{cmdset.key}</span><span class="s2">] (</span><span class="si">{cmdset.mergetype}</span><span class="s2">, prio </span><span class="si">{cmdset.priority}{options}</span><span class="s2">)&quot;</span><span class="p">)</span>
<span class="n">output</span><span class="p">[</span><span class="s2">&quot;Stored Cmdset(s)&quot;</span><span class="p">]</span> <span class="o">=</span> <span class="s2">&quot;</span><span class="se">\n</span><span class="s2"> &quot;</span> <span class="o">+</span> <span class="s2">&quot;</span><span class="se">\n</span><span class="s2"> &quot;</span><span class="o">.</span><span class="n">join</span><span class="p">(</span><span class="n">stored</span><span class="p">)</span>
<span class="c1"># this gets all components of the currently merged set</span>
<span class="n">all_cmdsets</span> <span class="o">=</span> <span class="p">[(</span><span class="n">cmdset</span><span class="o">.</span><span class="n">key</span><span class="p">,</span> <span class="n">cmdset</span><span class="p">)</span> <span class="k">for</span> <span class="n">cmdset</span> <span class="ow">in</span> <span class="n">current_cmdset</span><span class="o">.</span><span class="n">merged_from</span><span class="p">]</span>
<span class="c1"># we always at least try to add account- and session sets since these are ignored</span>
<span class="c1"># if we merge on the object level.</span>
<span class="k">if</span> <span class="nb">hasattr</span><span class="p">(</span><span class="n">obj</span><span class="p">,</span> <span class="s2">&quot;account&quot;</span><span class="p">)</span> <span class="ow">and</span> <span class="n">obj</span><span class="o">.</span><span class="n">account</span><span class="p">:</span>
<span class="n">all_cmdsets</span><span class="o">.</span><span class="n">extend</span><span class="p">([(</span><span class="n">cmdset</span><span class="o">.</span><span class="n">key</span><span class="p">,</span> <span class="n">cmdset</span><span class="p">)</span> <span class="k">for</span> <span class="n">cmdset</span> <span class="ow">in</span> <span class="n">obj</span><span class="o">.</span><span class="n">account</span><span class="o">.</span><span class="n">cmdset</span><span class="o">.</span><span class="n">all</span><span class="p">()])</span>
<span class="k">if</span> <span class="n">obj</span><span class="o">.</span><span class="n">sessions</span><span class="o">.</span><span class="n">count</span><span class="p">():</span>
<span class="c1"># if there are more sessions than one on objects it&#39;s because of multisession mode 3.</span>
<span class="c1"># we only show the first session&#39;s cmdset here (it is -in principle- possible that</span>
<span class="c1"># different sessions have different cmdsets but for admins who want such madness</span>
<span class="c1"># it is better that they overload with their own CmdExamine to handle it).</span>
<span class="n">all_cmdsets</span><span class="o">.</span><span class="n">extend</span><span class="p">(</span>
<span class="p">[</span>
<span class="p">(</span><span class="n">cmdset</span><span class="o">.</span><span class="n">key</span><span class="p">,</span> <span class="n">cmdset</span><span class="p">)</span>
<span class="k">for</span> <span class="n">cmdset</span> <span class="ow">in</span> <span class="n">obj</span><span class="o">.</span><span class="n">account</span><span class="o">.</span><span class="n">sessions</span><span class="o">.</span><span class="n">all</span><span class="p">()[</span><span class="mi">0</span><span class="p">]</span><span class="o">.</span><span class="n">cmdset</span><span class="o">.</span><span class="n">all</span><span class="p">()</span>
<span class="p">]</span>
<span class="p">)</span>
<span class="k">else</span><span class="p">:</span>
<span class="k">try</span><span class="p">:</span>
<span class="c1"># we have to protect this since many objects don&#39;t have sessions.</span>
<span class="n">all_cmdsets</span><span class="o">.</span><span class="n">extend</span><span class="p">(</span>
<span class="p">[</span>
<span class="p">(</span><span class="n">cmdset</span><span class="o">.</span><span class="n">key</span><span class="p">,</span> <span class="n">cmdset</span><span class="p">)</span>
<span class="k">for</span> <span class="n">cmdset</span> <span class="ow">in</span> <span class="n">obj</span><span class="o">.</span><span class="n">get_session</span><span class="p">(</span><span class="n">obj</span><span class="o">.</span><span class="n">sessions</span><span class="o">.</span><span class="n">get</span><span class="p">())</span><span class="o">.</span><span class="n">cmdset</span><span class="o">.</span><span class="n">all</span><span class="p">()</span>
<span class="p">]</span>
<span class="p">)</span>
<span class="k">except</span> <span class="p">(</span><span class="ne">TypeError</span><span class="p">,</span> <span class="ne">AttributeError</span><span class="p">):</span>
<span class="c1"># an error means we are merging an object without a session</span>
<span class="k">pass</span>
<span class="n">all_cmdsets</span> <span class="o">=</span> <span class="p">[</span><span class="n">cmdset</span> <span class="k">for</span> <span class="n">cmdset</span> <span class="ow">in</span> <span class="nb">dict</span><span class="p">(</span><span class="n">all_cmdsets</span><span class="p">)</span><span class="o">.</span><span class="n">values</span><span class="p">()]</span>
<span class="n">all_cmdsets</span><span class="o">.</span><span class="n">sort</span><span class="p">(</span><span class="n">key</span><span class="o">=</span><span class="k">lambda</span> <span class="n">x</span><span class="p">:</span> <span class="n">x</span><span class="o">.</span><span class="n">priority</span><span class="p">,</span> <span class="n">reverse</span><span class="o">=</span><span class="kc">True</span><span class="p">)</span>
<span class="c1"># the resulting merged cmdset</span>
<span class="n">options</span> <span class="o">=</span> <span class="n">_format_options</span><span class="p">(</span><span class="n">current_cmdset</span><span class="p">)</span>
<span class="n">merged</span> <span class="o">=</span> <span class="p">[</span>
<span class="n">f</span><span class="s2">&quot;&lt;Current merged cmdset&gt; (</span><span class="si">{current_cmdset.mergetype}</span><span class="s2"> prio </span><span class="si">{current_cmdset.priority}{options}</span><span class="s2">)&quot;</span><span class="p">]</span>
<span class="c1"># the merge stack</span>
<span class="k">for</span> <span class="n">cmdset</span> <span class="ow">in</span> <span class="n">all_cmdsets</span><span class="p">:</span>
<span class="n">options</span> <span class="o">=</span> <span class="n">_format_options</span><span class="p">(</span><span class="n">cmdset</span><span class="p">)</span>
<span class="n">merged</span><span class="o">.</span><span class="n">append</span><span class="p">(</span>
<span class="n">f</span><span class="s2">&quot;</span><span class="si">{cmdset.path}</span><span class="s2"> [</span><span class="si">{cmdset.key}</span><span class="s2">] (</span><span class="si">{cmdset.mergetype}</span><span class="s2"> prio </span><span class="si">{cmdset.priority}{options}</span><span class="s2">)&quot;</span><span class="p">)</span>
<span class="n">output</span><span class="p">[</span><span class="s2">&quot;Merged Cmdset(s)&quot;</span><span class="p">]</span> <span class="o">=</span> <span class="s2">&quot;</span><span class="se">\n</span><span class="s2"> &quot;</span> <span class="o">+</span> <span class="s2">&quot;</span><span class="se">\n</span><span class="s2"> &quot;</span><span class="o">.</span><span class="n">join</span><span class="p">(</span><span class="n">merged</span><span class="p">)</span>
<span class="c1"># list the commands available to this object</span>
<span class="n">current_commands</span> <span class="o">=</span> <span class="nb">sorted</span><span class="p">([</span><span class="n">cmd</span><span class="o">.</span><span class="n">key</span> <span class="k">for</span> <span class="n">cmd</span> <span class="ow">in</span> <span class="n">current_cmdset</span> <span class="k">if</span> <span class="n">cmd</span><span class="o">.</span><span class="n">access</span><span class="p">(</span><span class="n">obj</span><span class="p">,</span> <span class="s2">&quot;cmd&quot;</span><span class="p">)])</span>
<span class="n">cmdsetstr</span> <span class="o">=</span> <span class="s2">&quot;</span><span class="se">\n</span><span class="s2">&quot;</span> <span class="o">+</span> <span class="n">utils</span><span class="o">.</span><span class="n">fill</span><span class="p">(</span><span class="s2">&quot;, &quot;</span><span class="o">.</span><span class="n">join</span><span class="p">(</span><span class="n">current_commands</span><span class="p">),</span> <span class="n">indent</span><span class="o">=</span><span class="mi">2</span><span class="p">)</span>
<span class="n">output</span><span class="p">[</span><span class="n">f</span><span class="s2">&quot;Commands available to </span><span class="si">{obj.key}</span><span class="s2"> (result of Merged CmdSets)&quot;</span><span class="p">]</span> <span class="o">=</span> <span class="nb">str</span><span class="p">(</span><span class="n">cmdsetstr</span><span class="p">)</span>
<span class="c1"># scripts</span>
<span class="k">if</span> <span class="nb">hasattr</span><span class="p">(</span><span class="n">obj</span><span class="p">,</span> <span class="s2">&quot;scripts&quot;</span><span class="p">)</span> <span class="ow">and</span> <span class="nb">hasattr</span><span class="p">(</span><span class="n">obj</span><span class="o">.</span><span class="n">scripts</span><span class="p">,</span> <span class="s2">&quot;all&quot;</span><span class="p">)</span> <span class="ow">and</span> <span class="n">obj</span><span class="o">.</span><span class="n">scripts</span><span class="o">.</span><span class="n">all</span><span class="p">():</span>
<span class="n">output</span><span class="p">[</span><span class="s2">&quot;Scripts&quot;</span><span class="p">]</span> <span class="o">=</span> <span class="s2">&quot;</span><span class="se">\n</span><span class="s2"> &quot;</span> <span class="o">+</span> <span class="n">f</span><span class="s2">&quot;</span><span class="si">{obj.scripts}</span><span class="s2">&quot;</span>
<span class="c1"># add the attributes</span>
<span class="n">output</span><span class="o">.</span><span class="n">update</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">format_attributes</span><span class="p">(</span><span class="n">obj</span><span class="p">))</span>
<span class="c1"># Tags</span>
<span class="n">tags</span> <span class="o">=</span> <span class="n">obj</span><span class="o">.</span><span class="n">tags</span><span class="o">.</span><span class="n">all</span><span class="p">(</span><span class="n">return_key_and_category</span><span class="o">=</span><span class="kc">True</span><span class="p">)</span>
<span class="n">tags_string</span> <span class="o">=</span> <span class="s2">&quot;</span><span class="se">\n</span><span class="s2">&quot;</span> <span class="o">+</span> <span class="n">utils</span><span class="o">.</span><span class="n">fill</span><span class="p">(</span>
<span class="s2">&quot;, &quot;</span><span class="o">.</span><span class="n">join</span><span class="p">(</span><span class="nb">sorted</span><span class="p">(</span><span class="n">f</span><span class="s2">&quot;</span><span class="si">{tag}</span><span class="s2">[</span><span class="si">{category}</span><span class="s2">]&quot;</span> <span class="k">for</span> <span class="n">tag</span><span class="p">,</span> <span class="n">category</span> <span class="ow">in</span> <span class="n">tags</span><span class="p">)),</span> <span class="n">indent</span><span class="o">=</span><span class="mi">2</span><span class="p">,</span>
<span class="p">)</span>
<span class="k">if</span> <span class="n">tags</span><span class="p">:</span>
<span class="n">output</span><span class="p">[</span><span class="s2">&quot;Tags[category]&quot;</span><span class="p">]</span> <span class="o">=</span> <span class="n">tags_string</span>
<span class="c1"># Contents of object</span>
<span class="n">exits</span> <span class="o">=</span> <span class="p">[]</span>
<span class="n">pobjs</span> <span class="o">=</span> <span class="p">[]</span>
<span class="n">things</span> <span class="o">=</span> <span class="p">[]</span>
<span class="k">if</span> <span class="nb">hasattr</span><span class="p">(</span><span class="n">obj</span><span class="p">,</span> <span class="s2">&quot;contents&quot;</span><span class="p">):</span>
<span class="k">for</span> <span class="n">content</span> <span class="ow">in</span> <span class="n">obj</span><span class="o">.</span><span class="n">contents</span><span class="p">:</span>
<span class="k">if</span> <span class="n">content</span><span class="o">.</span><span class="n">destination</span><span class="p">:</span>
<span class="n">exits</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">content</span><span class="p">)</span>
<span class="k">elif</span> <span class="n">content</span><span class="o">.</span><span class="n">account</span><span class="p">:</span>
<span class="n">pobjs</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">content</span><span class="p">)</span>
<span class="k">else</span><span class="p">:</span>
<span class="n">things</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">content</span><span class="p">)</span>
<span class="k">if</span> <span class="n">exits</span><span class="p">:</span>
<span class="n">output</span><span class="p">[</span><span class="s2">&quot;Exits (has .destination)&quot;</span><span class="p">]</span> <span class="o">=</span> <span class="s2">&quot;, &quot;</span><span class="o">.</span><span class="n">join</span><span class="p">(</span>
<span class="n">f</span><span class="s2">&quot;</span><span class="si">{exit.name}</span><span class="s2">(</span><span class="si">{exit.dbref}</span><span class="s2">)&quot;</span> <span class="k">for</span> <span class="n">exit</span> <span class="ow">in</span> <span class="n">exits</span>
<span class="p">)</span>
<span class="k">if</span> <span class="n">pobjs</span><span class="p">:</span>
<span class="n">output</span><span class="p">[</span><span class="s2">&quot;Characters&quot;</span><span class="p">]</span> <span class="o">=</span> <span class="s2">&quot;, &quot;</span><span class="o">.</span><span class="n">join</span><span class="p">(</span>
<span class="n">f</span><span class="s2">&quot;</span><span class="si">{dclr}{pobj.name}</span><span class="s2">|n(</span><span class="si">{pobj.dbref}</span><span class="s2">)&quot;</span> <span class="k">for</span> <span class="n">pobj</span> <span class="ow">in</span> <span class="n">pobjs</span>
<span class="p">)</span>
<span class="k">if</span> <span class="n">things</span><span class="p">:</span>
<span class="n">output</span><span class="p">[</span><span class="s2">&quot;Contents&quot;</span><span class="p">]</span> <span class="o">=</span> <span class="s2">&quot;, &quot;</span><span class="o">.</span><span class="n">join</span><span class="p">(</span>
<span class="n">f</span><span class="s2">&quot;</span><span class="si">{cont.name}</span><span class="s2">(</span><span class="si">{cont.dbref}</span><span class="s2">)&quot;</span>
<span class="k">for</span> <span class="n">cont</span> <span class="ow">in</span> <span class="n">obj</span><span class="o">.</span><span class="n">contents</span>
<span class="k">if</span> <span class="n">cont</span> <span class="ow">not</span> <span class="ow">in</span> <span class="n">exits</span> <span class="ow">and</span> <span class="n">cont</span> <span class="ow">not</span> <span class="ow">in</span> <span class="n">pobjs</span>
<span class="p">)</span>
<span class="c1"># format output</span>
<span class="n">max_width</span> <span class="o">=</span> <span class="o">-</span><span class="mi">1</span>
<span class="k">for</span> <span class="n">block</span> <span class="ow">in</span> <span class="n">output</span><span class="o">.</span><span class="n">values</span><span class="p">():</span>
<span class="n">max_width</span> <span class="o">=</span> <span class="nb">max</span><span class="p">(</span><span class="n">max_width</span><span class="p">,</span> <span class="nb">max</span><span class="p">(</span><span class="n">display_len</span><span class="p">(</span><span class="n">line</span><span class="p">)</span> <span class="k">for</span> <span class="n">line</span> <span class="ow">in</span> <span class="n">block</span><span class="o">.</span><span class="n">split</span><span class="p">(</span><span class="s2">&quot;</span><span class="se">\n</span><span class="s2">&quot;</span><span class="p">)))</span>
<span class="n">max_width</span> <span class="o">=</span> <span class="nb">max</span><span class="p">(</span><span class="mi">0</span><span class="p">,</span> <span class="nb">min</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">client_width</span><span class="p">(),</span> <span class="n">max_width</span><span class="p">))</span>
<span class="n">sep</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">separator</span> <span class="o">*</span> <span class="n">max_width</span>
<span class="n">mainstr</span> <span class="o">=</span> <span class="s2">&quot;</span><span class="se">\n</span><span class="s2">&quot;</span><span class="o">.</span><span class="n">join</span><span class="p">(</span><span class="n">f</span><span class="s2">&quot;</span><span class="si">{hclr}{header}</span><span class="s2">|n: </span><span class="si">{block}</span><span class="s2">&quot;</span> <span class="k">for</span> <span class="p">(</span><span class="n">header</span><span class="p">,</span> <span class="n">block</span><span class="p">)</span> <span class="ow">in</span> <span class="n">output</span><span class="o">.</span><span class="n">items</span><span class="p">())</span>
<span class="k">return</span> <span class="n">f</span><span class="s2">&quot;</span><span class="si">{sep}</span><span class="se">\n</span><span class="si">{mainstr}</span><span class="se">\n</span><span class="si">{sep}</span><span class="s2">&quot;</span></div>
<div class="viewcode-block" id="CmdExamine.func"><a class="viewcode-back" href="../../../../api/evennia.commands.default.building.html#evennia.commands.default.building.CmdExamine.func">[docs]</a> <span class="k">def</span> <span class="nf">func</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;Process command&quot;&quot;&quot;</span>
<span class="n">caller</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">caller</span>
<span class="k">def</span> <span class="nf">get_cmdset_callback</span><span class="p">(</span><span class="n">cmdset</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> We make use of the cmdhandeler.get_and_merge_cmdsets below. This</span>
<span class="sd"> is an asynchronous function, returning a Twisted deferred.</span>
<span class="sd"> So in order to properly use this we need use this callback;</span>
<span class="sd"> it is called with the result of get_and_merge_cmdsets, whenever</span>
<span class="sd"> that function finishes. Taking the resulting cmdset, we continue</span>
<span class="sd"> to format and output the result.</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="bp">self</span><span class="o">.</span><span class="n">msg</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">format_output</span><span class="p">(</span><span class="n">obj</span><span class="p">,</span> <span class="n">cmdset</span><span class="p">)</span><span class="o">.</span><span class="n">strip</span><span class="p">())</span>
<span class="k">if</span> <span class="ow">not</span> <span class="bp">self</span><span class="o">.</span><span class="n">args</span><span class="p">:</span>
<span class="c1"># If no arguments are provided, examine the invoker&#39;s location.</span>
<span class="k">if</span> <span class="nb">hasattr</span><span class="p">(</span><span class="n">caller</span><span class="p">,</span> <span class="s2">&quot;location&quot;</span><span class="p">):</span>
<span class="n">obj</span> <span class="o">=</span> <span class="n">caller</span><span class="o">.</span><span class="n">location</span>
<span class="k">if</span> <span class="ow">not</span> <span class="n">obj</span><span class="o">.</span><span class="n">access</span><span class="p">(</span><span class="n">caller</span><span class="p">,</span> <span class="s2">&quot;examine&quot;</span><span class="p">):</span>
<span class="c1"># If we don&#39;t have special info access, just look at the object instead.</span>
<span class="bp">self</span><span class="o">.</span><span class="n">msg</span><span class="p">(</span><span class="n">caller</span><span class="o">.</span><span class="n">at_look</span><span class="p">(</span><span class="n">obj</span><span class="p">))</span>
<span class="k">return</span>
<span class="n">obj_session</span> <span class="o">=</span> <span class="n">obj</span><span class="o">.</span><span class="n">sessions</span><span class="o">.</span><span class="n">get</span><span class="p">()[</span><span class="mi">0</span><span class="p">]</span> <span class="k">if</span> <span class="n">obj</span><span class="o">.</span><span class="n">sessions</span><span class="o">.</span><span class="n">count</span><span class="p">()</span> <span class="k">else</span> <span class="kc">None</span>
<span class="c1"># using callback for printing result whenever function returns.</span>
<span class="n">get_and_merge_cmdsets</span><span class="p">(</span>
<span class="n">obj</span><span class="p">,</span> <span class="n">obj_session</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">account</span><span class="p">,</span> <span class="n">obj</span><span class="p">,</span> <span class="s2">&quot;object&quot;</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">raw_string</span>
<span class="p">)</span><span class="o">.</span><span class="n">addCallback</span><span class="p">(</span><span class="n">get_cmdset_callback</span><span class="p">)</span>
<span class="k">else</span><span class="p">:</span>
<span class="bp">self</span><span class="o">.</span><span class="n">msg</span><span class="p">(</span><span class="s2">&quot;You need to supply a target to examine.&quot;</span><span class="p">)</span>
<span class="k">return</span>
<span class="c1"># we have given a specific target object</span>
<span class="k">for</span> <span class="n">objdef</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">lhs_objattr</span><span class="p">:</span>
<span class="n">obj</span> <span class="o">=</span> <span class="kc">None</span>
<span class="n">obj_name</span> <span class="o">=</span> <span class="n">objdef</span><span class="p">[</span><span class="s2">&quot;name&quot;</span><span class="p">]</span>
<span class="n">obj_attrs</span> <span class="o">=</span> <span class="n">objdef</span><span class="p">[</span><span class="s2">&quot;attrs&quot;</span><span class="p">]</span>
<span class="bp">self</span><span class="o">.</span><span class="n">account_mode</span> <span class="o">=</span> <span class="p">(</span>
<span class="n">utils</span><span class="o">.</span><span class="n">inherits_from</span><span class="p">(</span><span class="n">caller</span><span class="p">,</span> <span class="s2">&quot;evennia.accounts.accounts.DefaultAccount&quot;</span><span class="p">)</span>
<span class="ow">or</span> <span class="s2">&quot;account&quot;</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">switches</span>
<span class="ow">or</span> <span class="n">obj_name</span><span class="o">.</span><span class="n">startswith</span><span class="p">(</span><span class="s2">&quot;*&quot;</span><span class="p">)</span>
<span class="p">)</span>
<span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">account_mode</span><span class="p">:</span>
<span class="k">try</span><span class="p">:</span>
<span class="n">obj</span> <span class="o">=</span> <span class="n">caller</span><span class="o">.</span><span class="n">search_account</span><span class="p">(</span><span class="n">obj_name</span><span class="o">.</span><span class="n">lstrip</span><span class="p">(</span><span class="s2">&quot;*&quot;</span><span class="p">))</span>
<span class="k">except</span> <span class="ne">AttributeError</span><span class="p">:</span>
<span class="c1"># this means we are calling examine from an account object</span>
<span class="n">obj</span> <span class="o">=</span> <span class="n">caller</span><span class="o">.</span><span class="n">search</span><span class="p">(</span>
<span class="n">obj_name</span><span class="o">.</span><span class="n">lstrip</span><span class="p">(</span><span class="s2">&quot;*&quot;</span><span class="p">),</span> <span class="n">search_object</span><span class="o">=</span><span class="s2">&quot;object&quot;</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">switches</span>
<span class="p">)</span>
<span class="k">else</span><span class="p">:</span>
<span class="n">obj</span> <span class="o">=</span> <span class="n">caller</span><span class="o">.</span><span class="n">search</span><span class="p">(</span><span class="n">obj_name</span><span class="p">)</span>
<span class="k">if</span> <span class="ow">not</span> <span class="n">obj</span><span class="p">:</span>
<span class="k">continue</span>
<span class="k">if</span> <span class="ow">not</span> <span class="n">obj</span><span class="o">.</span><span class="n">access</span><span class="p">(</span><span class="n">caller</span><span class="p">,</span> <span class="s2">&quot;examine&quot;</span><span class="p">):</span>
<span class="c1"># If we don&#39;t have special info access, just look</span>
<span class="c1"># at the object instead.</span>
<span class="bp">self</span><span class="o">.</span><span class="n">msg</span><span class="p">(</span><span class="n">caller</span><span class="o">.</span><span class="n">at_look</span><span class="p">(</span><span class="n">obj</span><span class="p">))</span>
<span class="k">continue</span>
<span class="k">if</span> <span class="n">obj_attrs</span><span class="p">:</span>
<span class="k">for</span> <span class="n">attrname</span> <span class="ow">in</span> <span class="n">obj_attrs</span><span class="p">:</span>
<span class="c1"># we are only interested in specific attributes</span>
<span class="n">ret</span> <span class="o">=</span> <span class="s2">&quot;</span><span class="se">\n</span><span class="s2">&quot;</span><span class="o">.</span><span class="n">join</span><span class="p">(</span>
<span class="n">f</span><span class="s2">&quot;</span><span class="si">{self.header_color}{header}</span><span class="s2">|n:</span><span class="si">{value}</span><span class="s2">&quot;</span>
<span class="k">for</span> <span class="n">header</span><span class="p">,</span> <span class="n">value</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">format_attributes</span><span class="p">(</span>
<span class="n">obj</span><span class="p">,</span> <span class="n">attrname</span><span class="p">,</span> <span class="n">crop</span><span class="o">=</span><span class="kc">False</span>
<span class="p">)</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">caller</span><span class="o">.</span><span class="n">msg</span><span class="p">(</span><span class="n">ret</span><span class="p">)</span>
<span class="k">else</span><span class="p">:</span>
<span class="n">session</span> <span class="o">=</span> <span class="kc">None</span>
<span class="k">if</span> <span class="n">obj</span><span class="o">.</span><span class="n">sessions</span><span class="o">.</span><span class="n">count</span><span class="p">():</span>
<span class="n">mergemode</span> <span class="o">=</span> <span class="s2">&quot;session&quot;</span>
<span class="n">session</span> <span class="o">=</span> <span class="n">obj</span><span class="o">.</span><span class="n">sessions</span><span class="o">.</span><span class="n">get</span><span class="p">()[</span><span class="mi">0</span><span class="p">]</span>
<span class="k">elif</span> <span class="bp">self</span><span class="o">.</span><span class="n">account_mode</span><span class="p">:</span>
<span class="n">mergemode</span> <span class="o">=</span> <span class="s2">&quot;account&quot;</span>
<span class="k">else</span><span class="p">:</span>
<span class="n">mergemode</span> <span class="o">=</span> <span class="s2">&quot;object&quot;</span>
<span class="n">account</span> <span class="o">=</span> <span class="kc">None</span>
<span class="n">objct</span> <span class="o">=</span> <span class="kc">None</span>
<span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">account_mode</span><span class="p">:</span>
<span class="n">account</span> <span class="o">=</span> <span class="n">obj</span>
<span class="k">else</span><span class="p">:</span>
<span class="n">account</span> <span class="o">=</span> <span class="n">obj</span><span class="o">.</span><span class="n">account</span>
<span class="n">objct</span> <span class="o">=</span> <span class="n">obj</span>
<span class="c1"># using callback to print results whenever function returns.</span>
<span class="n">get_and_merge_cmdsets</span><span class="p">(</span>
<span class="n">obj</span><span class="p">,</span> <span class="n">session</span><span class="p">,</span> <span class="n">account</span><span class="p">,</span> <span class="n">objct</span><span class="p">,</span> <span class="n">mergemode</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">raw_string</span>
<span class="p">)</span><span class="o">.</span><span class="n">addCallback</span><span class="p">(</span><span class="n">get_cmdset_callback</span><span class="p">)</span></div></div>
<div class="viewcode-block" id="CmdFind"><a class="viewcode-back" href="../../../../api/evennia.commands.default.building.html#evennia.commands.default.building.CmdFind">[docs]</a><span class="k">class</span> <span class="nc">CmdFind</span><span class="p">(</span><span class="n">COMMAND_DEFAULT_CLASS</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> search the database for objects</span>
<span class="sd"> Usage:</span>
<span class="sd"> find[/switches] &lt;name or dbref or *account&gt; [= dbrefmin[-dbrefmax]]</span>
<span class="sd"> locate - this is a shorthand for using the /loc switch.</span>
<span class="sd"> Switches:</span>
<span class="sd"> room - only look for rooms (location=None)</span>
<span class="sd"> exit - only look for exits (destination!=None)</span>
<span class="sd"> char - only look for characters (BASE_CHARACTER_TYPECLASS)</span>
<span class="sd"> exact - only exact matches are returned.</span>
<span class="sd"> loc - display object location if exists and match has one result</span>
<span class="sd"> startswith - search for names starting with the string, rather than containing</span>
<span class="sd"> Searches the database for an object of a particular name or exact #dbref.</span>
<span class="sd"> Use *accountname to search for an account. The switches allows for</span>
<span class="sd"> limiting object matches to certain game entities. Dbrefmin and dbrefmax</span>
<span class="sd"> limits matches to within the given dbrefs range, or above/below if only</span>
<span class="sd"> one is given.</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="n">key</span> <span class="o">=</span> <span class="s2">&quot;find&quot;</span>
<span class="n">aliases</span> <span class="o">=</span> <span class="s2">&quot;search, locate&quot;</span>
<span class="n">switch_options</span> <span class="o">=</span> <span class="p">(</span><span class="s2">&quot;room&quot;</span><span class="p">,</span> <span class="s2">&quot;exit&quot;</span><span class="p">,</span> <span class="s2">&quot;char&quot;</span><span class="p">,</span> <span class="s2">&quot;exact&quot;</span><span class="p">,</span> <span class="s2">&quot;loc&quot;</span><span class="p">,</span> <span class="s2">&quot;startswith&quot;</span><span class="p">)</span>
<span class="n">locks</span> <span class="o">=</span> <span class="s2">&quot;cmd:perm(find) or perm(Builder)&quot;</span>
<span class="n">help_category</span> <span class="o">=</span> <span class="s2">&quot;Building&quot;</span>
<div class="viewcode-block" id="CmdFind.func"><a class="viewcode-back" href="../../../../api/evennia.commands.default.building.html#evennia.commands.default.building.CmdFind.func">[docs]</a> <span class="k">def</span> <span class="nf">func</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;Search functionality&quot;&quot;&quot;</span>
<span class="n">caller</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">caller</span>
<span class="n">switches</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">switches</span>
<span class="k">if</span> <span class="ow">not</span> <span class="bp">self</span><span class="o">.</span><span class="n">args</span> <span class="ow">or</span> <span class="p">(</span><span class="ow">not</span> <span class="bp">self</span><span class="o">.</span><span class="n">lhs</span> <span class="ow">and</span> <span class="ow">not</span> <span class="bp">self</span><span class="o">.</span><span class="n">rhs</span><span class="p">):</span>
<span class="n">caller</span><span class="o">.</span><span class="n">msg</span><span class="p">(</span><span class="s2">&quot;Usage: find &lt;string&gt; [= low [-high]]&quot;</span><span class="p">)</span>
<span class="k">return</span>
<span class="k">if</span> <span class="s2">&quot;locate&quot;</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">cmdstring</span><span class="p">:</span> <span class="c1"># Use option /loc as a default for locate command alias</span>
<span class="n">switches</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="s2">&quot;loc&quot;</span><span class="p">)</span>
<span class="n">searchstring</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">lhs</span>
<span class="k">try</span><span class="p">:</span>
<span class="c1"># Try grabbing the actual min/max id values by database aggregation</span>
<span class="n">qs</span> <span class="o">=</span> <span class="n">ObjectDB</span><span class="o">.</span><span class="n">objects</span><span class="o">.</span><span class="n">values</span><span class="p">(</span><span class="s2">&quot;id&quot;</span><span class="p">)</span><span class="o">.</span><span class="n">aggregate</span><span class="p">(</span><span class="n">low</span><span class="o">=</span><span class="n">Min</span><span class="p">(</span><span class="s2">&quot;id&quot;</span><span class="p">),</span> <span class="n">high</span><span class="o">=</span><span class="n">Max</span><span class="p">(</span><span class="s2">&quot;id&quot;</span><span class="p">))</span>
<span class="n">low</span><span class="p">,</span> <span class="n">high</span> <span class="o">=</span> <span class="nb">sorted</span><span class="p">(</span><span class="n">qs</span><span class="o">.</span><span class="n">values</span><span class="p">())</span>
<span class="k">if</span> <span class="ow">not</span> <span class="p">(</span><span class="n">low</span> <span class="ow">and</span> <span class="n">high</span><span class="p">):</span>
<span class="k">raise</span> <span class="ne">ValueError</span><span class="p">(</span>
<span class="n">f</span><span class="s2">&quot;</span><span class="si">{self.__class__.__name__}</span><span class="s2">: Min and max ID not returned by aggregation; falling back to queryset slicing.&quot;</span>
<span class="p">)</span>
<span class="k">except</span> <span class="ne">Exception</span> <span class="k">as</span> <span class="n">e</span><span class="p">:</span>
<span class="n">logger</span><span class="o">.</span><span class="n">log_trace</span><span class="p">(</span><span class="n">e</span><span class="p">)</span>
<span class="c1"># If that doesn&#39;t work for some reason (empty DB?), guess the lower</span>
<span class="c1"># bound and do a less-efficient query to find the upper.</span>
<span class="n">low</span><span class="p">,</span> <span class="n">high</span> <span class="o">=</span> <span class="mi">1</span><span class="p">,</span> <span class="n">ObjectDB</span><span class="o">.</span><span class="n">objects</span><span class="o">.</span><span class="n">all</span><span class="p">()</span><span class="o">.</span><span class="n">order_by</span><span class="p">(</span><span class="s2">&quot;-id&quot;</span><span class="p">)</span><span class="o">.</span><span class="n">first</span><span class="p">()</span><span class="o">.</span><span class="n">id</span>
<span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">rhs</span><span class="p">:</span>
<span class="k">try</span><span class="p">:</span>
<span class="c1"># Check that rhs is either a valid dbref or dbref range</span>
<span class="n">bounds</span> <span class="o">=</span> <span class="nb">tuple</span><span class="p">(</span>
<span class="nb">sorted</span><span class="p">(</span><span class="n">dbref</span><span class="p">(</span><span class="n">x</span><span class="p">,</span> <span class="kc">False</span><span class="p">)</span> <span class="k">for</span> <span class="n">x</span> <span class="ow">in</span> <span class="n">re</span><span class="o">.</span><span class="n">split</span><span class="p">(</span><span class="s2">&quot;[-\s]+&quot;</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">rhs</span><span class="o">.</span><span class="n">strip</span><span class="p">()))</span>
<span class="p">)</span>
<span class="c1"># dbref() will return either a valid int or None</span>
<span class="k">assert</span> <span class="n">bounds</span>
<span class="c1"># None should not exist in the bounds list</span>
<span class="k">assert</span> <span class="kc">None</span> <span class="ow">not</span> <span class="ow">in</span> <span class="n">bounds</span>
<span class="n">low</span> <span class="o">=</span> <span class="n">bounds</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span>
<span class="k">if</span> <span class="nb">len</span><span class="p">(</span><span class="n">bounds</span><span class="p">)</span> <span class="o">&gt;</span> <span class="mi">1</span><span class="p">:</span>
<span class="n">high</span> <span class="o">=</span> <span class="n">bounds</span><span class="p">[</span><span class="o">-</span><span class="mi">1</span><span class="p">]</span>
<span class="k">except</span> <span class="ne">AssertionError</span><span class="p">:</span>
<span class="n">caller</span><span class="o">.</span><span class="n">msg</span><span class="p">(</span><span class="s2">&quot;Invalid dbref range provided (not a number).&quot;</span><span class="p">)</span>
<span class="k">return</span>
<span class="k">except</span> <span class="ne">IndexError</span> <span class="k">as</span> <span class="n">e</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="n">f</span><span class="s2">&quot;</span><span class="si">{self.__class__.__name__}</span><span class="s2">: Error parsing upper and lower bounds of query.&quot;</span>
<span class="p">)</span>
<span class="n">logger</span><span class="o">.</span><span class="n">log_trace</span><span class="p">(</span><span class="n">e</span><span class="p">)</span>
<span class="n">low</span> <span class="o">=</span> <span class="nb">min</span><span class="p">(</span><span class="n">low</span><span class="p">,</span> <span class="n">high</span><span class="p">)</span>
<span class="n">high</span> <span class="o">=</span> <span class="nb">max</span><span class="p">(</span><span class="n">low</span><span class="p">,</span> <span class="n">high</span><span class="p">)</span>
<span class="n">is_dbref</span> <span class="o">=</span> <span class="n">utils</span><span class="o">.</span><span class="n">dbref</span><span class="p">(</span><span class="n">searchstring</span><span class="p">)</span>
<span class="n">is_account</span> <span class="o">=</span> <span class="n">searchstring</span><span class="o">.</span><span class="n">startswith</span><span class="p">(</span><span class="s2">&quot;*&quot;</span><span class="p">)</span>
<span class="n">restrictions</span> <span class="o">=</span> <span class="s2">&quot;&quot;</span>
<span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">switches</span><span class="p">:</span>
<span class="n">restrictions</span> <span class="o">=</span> <span class="s2">&quot;, </span><span class="si">%s</span><span class="s2">&quot;</span> <span class="o">%</span> <span class="p">(</span><span class="s2">&quot;, &quot;</span><span class="o">.</span><span class="n">join</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">switches</span><span class="p">))</span>
<span class="k">if</span> <span class="n">is_dbref</span> <span class="ow">or</span> <span class="n">is_account</span><span class="p">:</span>
<span class="k">if</span> <span class="n">is_dbref</span><span class="p">:</span>
<span class="c1"># a dbref search</span>
<span class="n">result</span> <span class="o">=</span> <span class="n">caller</span><span class="o">.</span><span class="n">search</span><span class="p">(</span><span class="n">searchstring</span><span class="p">,</span> <span class="n">global_search</span><span class="o">=</span><span class="kc">True</span><span class="p">,</span> <span class="n">quiet</span><span class="o">=</span><span class="kc">True</span><span class="p">)</span>
<span class="n">string</span> <span class="o">=</span> <span class="s2">&quot;|wExact dbref match|n(#</span><span class="si">%i</span><span class="s2">-#</span><span class="si">%i%s</span><span class="s2">):&quot;</span> <span class="o">%</span> <span class="p">(</span><span class="n">low</span><span class="p">,</span> <span class="n">high</span><span class="p">,</span> <span class="n">restrictions</span><span class="p">)</span>
<span class="k">else</span><span class="p">:</span>
<span class="c1"># an account search</span>
<span class="n">searchstring</span> <span class="o">=</span> <span class="n">searchstring</span><span class="o">.</span><span class="n">lstrip</span><span class="p">(</span><span class="s2">&quot;*&quot;</span><span class="p">)</span>
<span class="n">result</span> <span class="o">=</span> <span class="n">caller</span><span class="o">.</span><span class="n">search_account</span><span class="p">(</span><span class="n">searchstring</span><span class="p">,</span> <span class="n">quiet</span><span class="o">=</span><span class="kc">True</span><span class="p">)</span>
<span class="n">string</span> <span class="o">=</span> <span class="s2">&quot;|wMatch|n(#</span><span class="si">%i</span><span class="s2">-#</span><span class="si">%i%s</span><span class="s2">):&quot;</span> <span class="o">%</span> <span class="p">(</span><span class="n">low</span><span class="p">,</span> <span class="n">high</span><span class="p">,</span> <span class="n">restrictions</span><span class="p">)</span>
<span class="k">if</span> <span class="s2">&quot;room&quot;</span> <span class="ow">in</span> <span class="n">switches</span><span class="p">:</span>
<span class="n">result</span> <span class="o">=</span> <span class="n">result</span> <span class="k">if</span> <span class="n">inherits_from</span><span class="p">(</span><span class="n">result</span><span class="p">,</span> <span class="n">ROOM_TYPECLASS</span><span class="p">)</span> <span class="k">else</span> <span class="kc">None</span>
<span class="k">if</span> <span class="s2">&quot;exit&quot;</span> <span class="ow">in</span> <span class="n">switches</span><span class="p">:</span>
<span class="n">result</span> <span class="o">=</span> <span class="n">result</span> <span class="k">if</span> <span class="n">inherits_from</span><span class="p">(</span><span class="n">result</span><span class="p">,</span> <span class="n">EXIT_TYPECLASS</span><span class="p">)</span> <span class="k">else</span> <span class="kc">None</span>
<span class="k">if</span> <span class="s2">&quot;char&quot;</span> <span class="ow">in</span> <span class="n">switches</span><span class="p">:</span>
<span class="n">result</span> <span class="o">=</span> <span class="n">result</span> <span class="k">if</span> <span class="n">inherits_from</span><span class="p">(</span><span class="n">result</span><span class="p">,</span> <span class="n">CHAR_TYPECLASS</span><span class="p">)</span> <span class="k">else</span> <span class="kc">None</span>
<span class="k">if</span> <span class="ow">not</span> <span class="n">result</span><span class="p">:</span>
<span class="n">string</span> <span class="o">+=</span> <span class="s2">&quot;</span><span class="se">\n</span><span class="s2"> |RNo match found.|n&quot;</span>
<span class="k">elif</span> <span class="ow">not</span> <span class="n">low</span> <span class="o">&lt;=</span> <span class="nb">int</span><span class="p">(</span><span class="n">result</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span><span class="o">.</span><span class="n">id</span><span class="p">)</span> <span class="o">&lt;=</span> <span class="n">high</span><span class="p">:</span>
<span class="n">string</span> <span class="o">+=</span> <span class="s2">&quot;</span><span class="se">\n</span><span class="s2"> |RNo match found for &#39;</span><span class="si">%s</span><span class="s2">&#39; in #dbref interval.|n&quot;</span> <span class="o">%</span> <span class="n">searchstring</span>
<span class="k">else</span><span class="p">:</span>
<span class="n">result</span> <span class="o">=</span> <span class="n">result</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span>
<span class="n">string</span> <span class="o">+=</span> <span class="s2">&quot;</span><span class="se">\n</span><span class="s2">|g </span><span class="si">%s</span><span class="s2"> - </span><span class="si">%s</span><span class="s2">|n&quot;</span> <span class="o">%</span> <span class="p">(</span><span class="n">result</span><span class="o">.</span><span class="n">get_display_name</span><span class="p">(</span><span class="n">caller</span><span class="p">),</span> <span class="n">result</span><span class="o">.</span><span class="n">path</span><span class="p">)</span>
<span class="k">if</span> <span class="s2">&quot;loc&quot;</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">switches</span> <span class="ow">and</span> <span class="ow">not</span> <span class="n">is_account</span> <span class="ow">and</span> <span class="n">result</span><span class="o">.</span><span class="n">location</span><span class="p">:</span>
<span class="n">string</span> <span class="o">+=</span> <span class="s2">&quot; (|wlocation|n: |g</span><span class="si">{}</span><span class="s2">|n)&quot;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span>
<span class="n">result</span><span class="o">.</span><span class="n">location</span><span class="o">.</span><span class="n">get_display_name</span><span class="p">(</span><span class="n">caller</span><span class="p">)</span>
<span class="p">)</span>
<span class="k">else</span><span class="p">:</span>
<span class="c1"># Not an account/dbref search but a wider search; build a queryset.</span>
<span class="c1"># Searches for key and aliases</span>
<span class="k">if</span> <span class="s2">&quot;exact&quot;</span> <span class="ow">in</span> <span class="n">switches</span><span class="p">:</span>
<span class="n">keyquery</span> <span class="o">=</span> <span class="n">Q</span><span class="p">(</span><span class="n">db_key__iexact</span><span class="o">=</span><span class="n">searchstring</span><span class="p">,</span> <span class="n">id__gte</span><span class="o">=</span><span class="n">low</span><span class="p">,</span> <span class="n">id__lte</span><span class="o">=</span><span class="n">high</span><span class="p">)</span>
<span class="n">aliasquery</span> <span class="o">=</span> <span class="n">Q</span><span class="p">(</span>
<span class="n">db_tags__db_key__iexact</span><span class="o">=</span><span class="n">searchstring</span><span class="p">,</span>
<span class="n">db_tags__db_tagtype__iexact</span><span class="o">=</span><span class="s2">&quot;alias&quot;</span><span class="p">,</span>
<span class="n">id__gte</span><span class="o">=</span><span class="n">low</span><span class="p">,</span>
<span class="n">id__lte</span><span class="o">=</span><span class="n">high</span><span class="p">,</span>
<span class="p">)</span>
<span class="k">elif</span> <span class="s2">&quot;startswith&quot;</span> <span class="ow">in</span> <span class="n">switches</span><span class="p">:</span>
<span class="n">keyquery</span> <span class="o">=</span> <span class="n">Q</span><span class="p">(</span><span class="n">db_key__istartswith</span><span class="o">=</span><span class="n">searchstring</span><span class="p">,</span> <span class="n">id__gte</span><span class="o">=</span><span class="n">low</span><span class="p">,</span> <span class="n">id__lte</span><span class="o">=</span><span class="n">high</span><span class="p">)</span>
<span class="n">aliasquery</span> <span class="o">=</span> <span class="n">Q</span><span class="p">(</span>
<span class="n">db_tags__db_key__istartswith</span><span class="o">=</span><span class="n">searchstring</span><span class="p">,</span>
<span class="n">db_tags__db_tagtype__iexact</span><span class="o">=</span><span class="s2">&quot;alias&quot;</span><span class="p">,</span>
<span class="n">id__gte</span><span class="o">=</span><span class="n">low</span><span class="p">,</span>
<span class="n">id__lte</span><span class="o">=</span><span class="n">high</span><span class="p">,</span>
<span class="p">)</span>
<span class="k">else</span><span class="p">:</span>
<span class="n">keyquery</span> <span class="o">=</span> <span class="n">Q</span><span class="p">(</span><span class="n">db_key__icontains</span><span class="o">=</span><span class="n">searchstring</span><span class="p">,</span> <span class="n">id__gte</span><span class="o">=</span><span class="n">low</span><span class="p">,</span> <span class="n">id__lte</span><span class="o">=</span><span class="n">high</span><span class="p">)</span>
<span class="n">aliasquery</span> <span class="o">=</span> <span class="n">Q</span><span class="p">(</span>
<span class="n">db_tags__db_key__icontains</span><span class="o">=</span><span class="n">searchstring</span><span class="p">,</span>
<span class="n">db_tags__db_tagtype__iexact</span><span class="o">=</span><span class="s2">&quot;alias&quot;</span><span class="p">,</span>
<span class="n">id__gte</span><span class="o">=</span><span class="n">low</span><span class="p">,</span>
<span class="n">id__lte</span><span class="o">=</span><span class="n">high</span><span class="p">,</span>
<span class="p">)</span>
<span class="c1"># Keep the initial queryset handy for later reuse</span>
<span class="n">result_qs</span> <span class="o">=</span> <span class="n">ObjectDB</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">keyquery</span> <span class="o">|</span> <span class="n">aliasquery</span><span class="p">)</span><span class="o">.</span><span class="n">distinct</span><span class="p">()</span>
<span class="n">nresults</span> <span class="o">=</span> <span class="n">result_qs</span><span class="o">.</span><span class="n">count</span><span class="p">()</span>
<span class="c1"># Use iterator to minimize memory ballooning on large result sets</span>
<span class="n">results</span> <span class="o">=</span> <span class="n">result_qs</span><span class="o">.</span><span class="n">iterator</span><span class="p">()</span>
<span class="c1"># Check and see if type filtering was requested; skip it if not</span>
<span class="k">if</span> <span class="nb">any</span><span class="p">(</span><span class="n">x</span> <span class="ow">in</span> <span class="n">switches</span> <span class="k">for</span> <span class="n">x</span> <span class="ow">in</span> <span class="p">(</span><span class="s2">&quot;room&quot;</span><span class="p">,</span> <span class="s2">&quot;exit&quot;</span><span class="p">,</span> <span class="s2">&quot;char&quot;</span><span class="p">)):</span>
<span class="n">obj_ids</span> <span class="o">=</span> <span class="nb">set</span><span class="p">()</span>
<span class="k">for</span> <span class="n">obj</span> <span class="ow">in</span> <span class="n">results</span><span class="p">:</span>
<span class="k">if</span> <span class="p">(</span>
<span class="p">(</span><span class="s2">&quot;room&quot;</span> <span class="ow">in</span> <span class="n">switches</span> <span class="ow">and</span> <span class="n">inherits_from</span><span class="p">(</span><span class="n">obj</span><span class="p">,</span> <span class="n">ROOM_TYPECLASS</span><span class="p">))</span>
<span class="ow">or</span> <span class="p">(</span><span class="s2">&quot;exit&quot;</span> <span class="ow">in</span> <span class="n">switches</span> <span class="ow">and</span> <span class="n">inherits_from</span><span class="p">(</span><span class="n">obj</span><span class="p">,</span> <span class="n">EXIT_TYPECLASS</span><span class="p">))</span>
<span class="ow">or</span> <span class="p">(</span><span class="s2">&quot;char&quot;</span> <span class="ow">in</span> <span class="n">switches</span> <span class="ow">and</span> <span class="n">inherits_from</span><span class="p">(</span><span class="n">obj</span><span class="p">,</span> <span class="n">CHAR_TYPECLASS</span><span class="p">))</span>
<span class="p">):</span>
<span class="n">obj_ids</span><span class="o">.</span><span class="n">add</span><span class="p">(</span><span class="n">obj</span><span class="o">.</span><span class="n">id</span><span class="p">)</span>
<span class="c1"># Filter previous queryset instead of requesting another</span>
<span class="n">filtered_qs</span> <span class="o">=</span> <span class="n">result_qs</span><span class="o">.</span><span class="n">filter</span><span class="p">(</span><span class="n">id__in</span><span class="o">=</span><span class="n">obj_ids</span><span class="p">)</span><span class="o">.</span><span class="n">distinct</span><span class="p">()</span>
<span class="n">nresults</span> <span class="o">=</span> <span class="n">filtered_qs</span><span class="o">.</span><span class="n">count</span><span class="p">()</span>
<span class="c1"># Use iterator again to minimize memory ballooning</span>
<span class="n">results</span> <span class="o">=</span> <span class="n">filtered_qs</span><span class="o">.</span><span class="n">iterator</span><span class="p">()</span>
<span class="c1"># still results after type filtering?</span>
<span class="k">if</span> <span class="n">nresults</span><span class="p">:</span>
<span class="k">if</span> <span class="n">nresults</span> <span class="o">&gt;</span> <span class="mi">1</span><span class="p">:</span>
<span class="n">header</span> <span class="o">=</span> <span class="n">f</span><span class="s2">&quot;</span><span class="si">{nresults}</span><span class="s2"> Matches&quot;</span>
<span class="k">else</span><span class="p">:</span>
<span class="n">header</span> <span class="o">=</span> <span class="s2">&quot;One Match&quot;</span>
<span class="n">string</span> <span class="o">=</span> <span class="n">f</span><span class="s2">&quot;|w</span><span class="si">{header}</span><span class="s2">|n(#</span><span class="si">{low}</span><span class="s2">-#</span><span class="si">{high}{restrictions}</span><span class="s2">):&quot;</span>
<span class="n">res</span> <span class="o">=</span> <span class="kc">None</span>
<span class="k">for</span> <span class="n">res</span> <span class="ow">in</span> <span class="n">results</span><span class="p">:</span>
<span class="n">string</span> <span class="o">+=</span> <span class="n">f</span><span class="s2">&quot;</span><span class="se">\n</span><span class="s2"> |g{res.get_display_name(caller)} - </span><span class="si">{res.path}</span><span class="s2">|n&quot;</span>
<span class="k">if</span> <span class="p">(</span>
<span class="s2">&quot;loc&quot;</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">switches</span>
<span class="ow">and</span> <span class="n">nresults</span> <span class="o">==</span> <span class="mi">1</span>
<span class="ow">and</span> <span class="n">res</span>
<span class="ow">and</span> <span class="nb">getattr</span><span class="p">(</span><span class="n">res</span><span class="p">,</span> <span class="s2">&quot;location&quot;</span><span class="p">,</span> <span class="kc">None</span><span class="p">)</span>
<span class="p">):</span>
<span class="n">string</span> <span class="o">+=</span> <span class="n">f</span><span class="s2">&quot; (|wlocation|n: |g{res.location.get_display_name(caller)}|n)&quot;</span>
<span class="k">else</span><span class="p">:</span>
<span class="n">string</span> <span class="o">=</span> <span class="n">f</span><span class="s2">&quot;|wNo Matches|n(#</span><span class="si">{low}</span><span class="s2">-#</span><span class="si">{high}{restrictions}</span><span class="s2">):&quot;</span>
<span class="n">string</span> <span class="o">+=</span> <span class="n">f</span><span class="s2">&quot;</span><span class="se">\n</span><span class="s2"> |RNo matches found for &#39;</span><span class="si">{searchstring}</span><span class="s2">&#39;|n&quot;</span>
<span class="c1"># send result</span>
<span class="n">caller</span><span class="o">.</span><span class="n">msg</span><span class="p">(</span><span class="n">string</span><span class="o">.</span><span class="n">strip</span><span class="p">())</span></div></div>
<div class="viewcode-block" id="CmdTeleport"><a class="viewcode-back" href="../../../../api/evennia.commands.default.building.html#evennia.commands.default.building.CmdTeleport">[docs]</a><span class="k">class</span> <span class="nc">CmdTeleport</span><span class="p">(</span><span class="n">COMMAND_DEFAULT_CLASS</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> teleport object to another location</span>
<span class="sd"> Usage:</span>
<span class="sd"> tel/switch [&lt;object&gt; to||=] &lt;target location&gt;</span>
<span class="sd"> Examples:</span>
<span class="sd"> tel Limbo</span>
<span class="sd"> tel/quiet box = Limbo</span>
<span class="sd"> tel/tonone box</span>
<span class="sd"> Switches:</span>
<span class="sd"> quiet - don&#39;t echo leave/arrive messages to the source/target</span>
<span class="sd"> locations for the move.</span>
<span class="sd"> intoexit - if target is an exit, teleport INTO</span>
<span class="sd"> the exit object instead of to its destination</span>
<span class="sd"> tonone - if set, teleport the object to a None-location. If this</span>
<span class="sd"> switch is set, &lt;target location&gt; is ignored.</span>
<span class="sd"> Note that the only way to retrieve</span>
<span class="sd"> an object from a None location is by direct #dbref</span>
<span class="sd"> reference. A puppeted object cannot be moved to None.</span>
<span class="sd"> loc - teleport object to the target&#39;s location instead of its contents</span>
<span class="sd"> Teleports an object somewhere. If no object is given, you yourself are</span>
<span class="sd"> teleported to the target location.</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="n">key</span> <span class="o">=</span> <span class="s2">&quot;tel&quot;</span>
<span class="n">aliases</span> <span class="o">=</span> <span class="s2">&quot;teleport&quot;</span>
<span class="n">switch_options</span> <span class="o">=</span> <span class="p">(</span><span class="s2">&quot;quiet&quot;</span><span class="p">,</span> <span class="s2">&quot;intoexit&quot;</span><span class="p">,</span> <span class="s2">&quot;tonone&quot;</span><span class="p">,</span> <span class="s2">&quot;loc&quot;</span><span class="p">)</span>
<span class="n">rhs_split</span> <span class="o">=</span> <span class="p">(</span><span class="s2">&quot;=&quot;</span><span class="p">,</span> <span class="s2">&quot; to &quot;</span><span class="p">)</span> <span class="c1"># Prefer = delimiter, but allow &quot; to &quot; usage.</span>
<span class="n">locks</span> <span class="o">=</span> <span class="s2">&quot;cmd:perm(teleport) or perm(Builder)&quot;</span>
<span class="n">help_category</span> <span class="o">=</span> <span class="s2">&quot;Building&quot;</span>
<div class="viewcode-block" id="CmdTeleport.func"><a class="viewcode-back" href="../../../../api/evennia.commands.default.building.html#evennia.commands.default.building.CmdTeleport.func">[docs]</a> <span class="k">def</span> <span class="nf">func</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;Performs the teleport&quot;&quot;&quot;</span>
<span class="n">caller</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">caller</span>
<span class="n">args</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">args</span>
<span class="n">lhs</span><span class="p">,</span> <span class="n">rhs</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">lhs</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">rhs</span>
<span class="n">switches</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">switches</span>
<span class="c1"># setting switches</span>
<span class="n">tel_quietly</span> <span class="o">=</span> <span class="s2">&quot;quiet&quot;</span> <span class="ow">in</span> <span class="n">switches</span>
<span class="n">to_none</span> <span class="o">=</span> <span class="s2">&quot;tonone&quot;</span> <span class="ow">in</span> <span class="n">switches</span>
<span class="n">to_loc</span> <span class="o">=</span> <span class="s2">&quot;loc&quot;</span> <span class="ow">in</span> <span class="n">switches</span>
<span class="k">if</span> <span class="n">to_none</span><span class="p">:</span>
<span class="c1"># teleporting to None</span>
<span class="k">if</span> <span class="ow">not</span> <span class="n">args</span><span class="p">:</span>
<span class="n">obj_to_teleport</span> <span class="o">=</span> <span class="n">caller</span>
<span class="k">else</span><span class="p">:</span>
<span class="n">obj_to_teleport</span> <span class="o">=</span> <span class="n">caller</span><span class="o">.</span><span class="n">search</span><span class="p">(</span><span class="n">lhs</span><span class="p">,</span> <span class="n">global_search</span><span class="o">=</span><span class="kc">True</span><span class="p">)</span>
<span class="k">if</span> <span class="ow">not</span> <span class="n">obj_to_teleport</span><span class="p">:</span>
<span class="n">caller</span><span class="o">.</span><span class="n">msg</span><span class="p">(</span><span class="s2">&quot;Did not find object to teleport.&quot;</span><span class="p">)</span>
<span class="k">return</span>
<span class="k">if</span> <span class="n">obj_to_teleport</span><span class="o">.</span><span class="n">has_account</span><span class="p">:</span>
<span class="n">caller</span><span class="o">.</span><span class="n">msg</span><span class="p">(</span>
<span class="s2">&quot;Cannot teleport a puppeted object &quot;</span>
<span class="s2">&quot;(</span><span class="si">%s</span><span class="s2">, puppeted by </span><span class="si">%s</span><span class="s2">) to a None-location.&quot;</span>
<span class="o">%</span> <span class="p">(</span><span class="n">obj_to_teleport</span><span class="o">.</span><span class="n">key</span><span class="p">,</span> <span class="n">obj_to_teleport</span><span class="o">.</span><span class="n">account</span><span class="p">)</span>
<span class="p">)</span>
<span class="k">return</span>
<span class="n">caller</span><span class="o">.</span><span class="n">msg</span><span class="p">(</span><span class="s2">&quot;Teleported </span><span class="si">%s</span><span class="s2"> -&gt; None-location.&quot;</span> <span class="o">%</span> <span class="n">obj_to_teleport</span><span class="p">)</span>
<span class="k">if</span> <span class="n">obj_to_teleport</span><span class="o">.</span><span class="n">location</span> <span class="ow">and</span> <span class="ow">not</span> <span class="n">tel_quietly</span><span class="p">:</span>
<span class="n">obj_to_teleport</span><span class="o">.</span><span class="n">location</span><span class="o">.</span><span class="n">msg_contents</span><span class="p">(</span>
<span class="s2">&quot;</span><span class="si">%s</span><span class="s2"> teleported </span><span class="si">%s</span><span class="s2"> into nothingness.&quot;</span> <span class="o">%</span> <span class="p">(</span><span class="n">caller</span><span class="p">,</span> <span class="n">obj_to_teleport</span><span class="p">),</span> <span class="n">exclude</span><span class="o">=</span><span class="n">caller</span>
<span class="p">)</span>
<span class="n">obj_to_teleport</span><span class="o">.</span><span class="n">location</span> <span class="o">=</span> <span class="kc">None</span>
<span class="k">return</span>
<span class="c1"># not teleporting to None location</span>
<span class="k">if</span> <span class="ow">not</span> <span class="n">args</span> <span class="ow">and</span> <span class="ow">not</span> <span class="n">to_none</span><span class="p">:</span>
<span class="n">caller</span><span class="o">.</span><span class="n">msg</span><span class="p">(</span><span class="s2">&quot;Usage: teleport[/switches] [&lt;obj&gt; =] &lt;target_loc&gt;||home&quot;</span><span class="p">)</span>
<span class="k">return</span>
<span class="k">if</span> <span class="n">rhs</span><span class="p">:</span>
<span class="n">obj_to_teleport</span> <span class="o">=</span> <span class="n">caller</span><span class="o">.</span><span class="n">search</span><span class="p">(</span><span class="n">lhs</span><span class="p">,</span> <span class="n">global_search</span><span class="o">=</span><span class="kc">True</span><span class="p">)</span>
<span class="n">destination</span> <span class="o">=</span> <span class="n">caller</span><span class="o">.</span><span class="n">search</span><span class="p">(</span><span class="n">rhs</span><span class="p">,</span> <span class="n">global_search</span><span class="o">=</span><span class="kc">True</span><span class="p">)</span>
<span class="k">else</span><span class="p">:</span>
<span class="n">obj_to_teleport</span> <span class="o">=</span> <span class="n">caller</span>
<span class="n">destination</span> <span class="o">=</span> <span class="n">caller</span><span class="o">.</span><span class="n">search</span><span class="p">(</span><span class="n">lhs</span><span class="p">,</span> <span class="n">global_search</span><span class="o">=</span><span class="kc">True</span><span class="p">)</span>
<span class="k">if</span> <span class="ow">not</span> <span class="n">obj_to_teleport</span><span class="p">:</span>
<span class="n">caller</span><span class="o">.</span><span class="n">msg</span><span class="p">(</span><span class="s2">&quot;Did not find object to teleport.&quot;</span><span class="p">)</span>
<span class="k">return</span>
<span class="k">if</span> <span class="ow">not</span> <span class="n">destination</span><span class="p">:</span>
<span class="n">caller</span><span class="o">.</span><span class="n">msg</span><span class="p">(</span><span class="s2">&quot;Destination not found.&quot;</span><span class="p">)</span>
<span class="k">return</span>
<span class="k">if</span> <span class="n">to_loc</span><span class="p">:</span>
<span class="n">destination</span> <span class="o">=</span> <span class="n">destination</span><span class="o">.</span><span class="n">location</span>
<span class="k">if</span> <span class="ow">not</span> <span class="n">destination</span><span class="p">:</span>
<span class="n">caller</span><span class="o">.</span><span class="n">msg</span><span class="p">(</span><span class="s2">&quot;Destination has no location.&quot;</span><span class="p">)</span>
<span class="k">return</span>
<span class="k">if</span> <span class="n">obj_to_teleport</span> <span class="o">==</span> <span class="n">destination</span><span class="p">:</span>
<span class="n">caller</span><span class="o">.</span><span class="n">msg</span><span class="p">(</span><span class="s2">&quot;You can&#39;t teleport an object inside of itself!&quot;</span><span class="p">)</span>
<span class="k">return</span>
<span class="k">if</span> <span class="n">obj_to_teleport</span> <span class="o">==</span> <span class="n">destination</span><span class="o">.</span><span class="n">location</span><span class="p">:</span>
<span class="n">caller</span><span class="o">.</span><span class="n">msg</span><span class="p">(</span><span class="s2">&quot;You can&#39;t teleport an object inside something it holds!&quot;</span><span class="p">)</span>
<span class="k">return</span>
<span class="k">if</span> <span class="n">obj_to_teleport</span><span class="o">.</span><span class="n">location</span> <span class="ow">and</span> <span class="n">obj_to_teleport</span><span class="o">.</span><span class="n">location</span> <span class="o">==</span> <span class="n">destination</span><span class="p">:</span>
<span class="n">caller</span><span class="o">.</span><span class="n">msg</span><span class="p">(</span><span class="s2">&quot;</span><span class="si">%s</span><span class="s2"> is already at </span><span class="si">%s</span><span class="s2">.&quot;</span> <span class="o">%</span> <span class="p">(</span><span class="n">obj_to_teleport</span><span class="p">,</span> <span class="n">destination</span><span class="p">))</span>
<span class="k">return</span>
<span class="n">use_destination</span> <span class="o">=</span> <span class="kc">True</span>
<span class="k">if</span> <span class="s2">&quot;intoexit&quot;</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">switches</span><span class="p">:</span>
<span class="n">use_destination</span> <span class="o">=</span> <span class="kc">False</span>
<span class="c1"># try the teleport</span>
<span class="k">if</span> <span class="n">obj_to_teleport</span><span class="o">.</span><span class="n">move_to</span><span class="p">(</span>
<span class="n">destination</span><span class="p">,</span> <span class="n">quiet</span><span class="o">=</span><span class="n">tel_quietly</span><span class="p">,</span> <span class="n">emit_to_obj</span><span class="o">=</span><span class="n">caller</span><span class="p">,</span> <span class="n">use_destination</span><span class="o">=</span><span class="n">use_destination</span>
<span class="p">):</span>
<span class="k">if</span> <span class="n">obj_to_teleport</span> <span class="o">==</span> <span class="n">caller</span><span class="p">:</span>
<span class="n">caller</span><span class="o">.</span><span class="n">msg</span><span class="p">(</span><span class="s2">&quot;Teleported to </span><span class="si">%s</span><span class="s2">.&quot;</span> <span class="o">%</span> <span class="n">destination</span><span class="p">)</span>
<span class="k">else</span><span class="p">:</span>
<span class="n">caller</span><span class="o">.</span><span class="n">msg</span><span class="p">(</span><span class="s2">&quot;Teleported </span><span class="si">%s</span><span class="s2"> -&gt; </span><span class="si">%s</span><span class="s2">.&quot;</span> <span class="o">%</span> <span class="p">(</span><span class="n">obj_to_teleport</span><span class="p">,</span> <span class="n">destination</span><span class="p">))</span></div></div>
<div class="viewcode-block" id="CmdScript"><a class="viewcode-back" href="../../../../api/evennia.commands.default.building.html#evennia.commands.default.building.CmdScript">[docs]</a><span class="k">class</span> <span class="nc">CmdScript</span><span class="p">(</span><span class="n">COMMAND_DEFAULT_CLASS</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> attach a script to an object</span>
<span class="sd"> Usage:</span>
<span class="sd"> script[/switch] &lt;obj&gt; [= script_path or &lt;scriptkey&gt;]</span>
<span class="sd"> Switches:</span>
<span class="sd"> start - start all non-running scripts on object, or a given script only</span>
<span class="sd"> stop - stop all scripts on objects, or a given script only</span>
<span class="sd"> If no script path/key is given, lists all scripts active on the given</span>
<span class="sd"> object.</span>
<span class="sd"> Script path can be given from the base location for scripts as given in</span>
<span class="sd"> settings. If adding a new script, it will be started automatically</span>
<span class="sd"> (no /start switch is needed). Using the /start or /stop switches on an</span>
<span class="sd"> object without specifying a script key/path will start/stop ALL scripts on</span>
<span class="sd"> the object.</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="n">key</span> <span class="o">=</span> <span class="s2">&quot;script&quot;</span>
<span class="n">aliases</span> <span class="o">=</span> <span class="s2">&quot;addscript&quot;</span>
<span class="n">switch_options</span> <span class="o">=</span> <span class="p">(</span><span class="s2">&quot;start&quot;</span><span class="p">,</span> <span class="s2">&quot;stop&quot;</span><span class="p">)</span>
<span class="n">locks</span> <span class="o">=</span> <span class="s2">&quot;cmd:perm(script) or perm(Builder)&quot;</span>
<span class="n">help_category</span> <span class="o">=</span> <span class="s2">&quot;Building&quot;</span>
<div class="viewcode-block" id="CmdScript.func"><a class="viewcode-back" href="../../../../api/evennia.commands.default.building.html#evennia.commands.default.building.CmdScript.func">[docs]</a> <span class="k">def</span> <span class="nf">func</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;Do stuff&quot;&quot;&quot;</span>
<span class="n">caller</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">caller</span>
<span class="k">if</span> <span class="ow">not</span> <span class="bp">self</span><span class="o">.</span><span class="n">args</span><span class="p">:</span>
<span class="n">string</span> <span class="o">=</span> <span class="s2">&quot;Usage: script[/switch] &lt;obj&gt; [= script_path or &lt;script key&gt;]&quot;</span>
<span class="n">caller</span><span class="o">.</span><span class="n">msg</span><span class="p">(</span><span class="n">string</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">lhs</span><span class="p">:</span>
<span class="n">caller</span><span class="o">.</span><span class="n">msg</span><span class="p">(</span><span class="s2">&quot;To create a global script you need |wscripts/add &lt;typeclass&gt;|n.&quot;</span><span class="p">)</span>
<span class="k">return</span>
<span class="n">obj</span> <span class="o">=</span> <span class="n">caller</span><span class="o">.</span><span class="n">search</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">lhs</span><span class="p">)</span>
<span class="k">if</span> <span class="ow">not</span> <span class="n">obj</span><span class="p">:</span>
<span class="k">return</span>
<span class="n">result</span> <span class="o">=</span> <span class="p">[]</span>
<span class="k">if</span> <span class="ow">not</span> <span class="bp">self</span><span class="o">.</span><span class="n">rhs</span><span class="p">:</span>
<span class="c1"># no rhs means we want to operate on all scripts</span>
<span class="n">scripts</span> <span class="o">=</span> <span class="n">obj</span><span class="o">.</span><span class="n">scripts</span><span class="o">.</span><span class="n">all</span><span class="p">()</span>
<span class="k">if</span> <span class="ow">not</span> <span class="n">scripts</span><span class="p">:</span>
<span class="n">result</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="s2">&quot;No scripts defined on </span><span class="si">%s</span><span class="s2">.&quot;</span> <span class="o">%</span> <span class="n">obj</span><span class="o">.</span><span class="n">get_display_name</span><span class="p">(</span><span class="n">caller</span><span class="p">))</span>
<span class="k">elif</span> <span class="ow">not</span> <span class="bp">self</span><span class="o">.</span><span class="n">switches</span><span class="p">:</span>
<span class="c1"># view all scripts</span>
<span class="kn">from</span> <span class="nn">evennia.commands.default.system</span> <span class="k">import</span> <span class="n">ScriptEvMore</span>
<span class="n">ScriptEvMore</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">caller</span><span class="p">,</span> <span class="n">scripts</span><span class="o">.</span><span class="n">order_by</span><span class="p">(</span><span class="s2">&quot;id&quot;</span><span class="p">),</span> <span class="n">session</span><span class="o">=</span><span class="bp">self</span><span class="o">.</span><span class="n">session</span><span class="p">)</span>
<span class="k">return</span>
<span class="k">elif</span> <span class="s2">&quot;start&quot;</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">switches</span><span class="p">:</span>
<span class="n">num</span> <span class="o">=</span> <span class="nb">sum</span><span class="p">([</span><span class="n">obj</span><span class="o">.</span><span class="n">scripts</span><span class="o">.</span><span class="n">start</span><span class="p">(</span><span class="n">script</span><span class="o">.</span><span class="n">key</span><span class="p">)</span> <span class="k">for</span> <span class="n">script</span> <span class="ow">in</span> <span class="n">scripts</span><span class="p">])</span>
<span class="n">result</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="s2">&quot;</span><span class="si">%s</span><span class="s2"> scripts started on </span><span class="si">%s</span><span class="s2">.&quot;</span> <span class="o">%</span> <span class="p">(</span><span class="n">num</span><span class="p">,</span> <span class="n">obj</span><span class="o">.</span><span class="n">get_display_name</span><span class="p">(</span><span class="n">caller</span><span class="p">)))</span>
<span class="k">elif</span> <span class="s2">&quot;stop&quot;</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">switches</span><span class="p">:</span>
<span class="k">for</span> <span class="n">script</span> <span class="ow">in</span> <span class="n">scripts</span><span class="p">:</span>
<span class="n">result</span><span class="o">.</span><span class="n">append</span><span class="p">(</span>
<span class="s2">&quot;Stopping script </span><span class="si">%s</span><span class="s2"> on </span><span class="si">%s</span><span class="s2">.&quot;</span>
<span class="o">%</span> <span class="p">(</span><span class="n">script</span><span class="o">.</span><span class="n">get_display_name</span><span class="p">(</span><span class="n">caller</span><span class="p">),</span> <span class="n">obj</span><span class="o">.</span><span class="n">get_display_name</span><span class="p">(</span><span class="n">caller</span><span class="p">))</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">obj</span><span class="o">.</span><span class="n">scripts</span><span class="o">.</span><span class="n">validate</span><span class="p">()</span>
<span class="k">else</span><span class="p">:</span> <span class="c1"># rhs exists</span>
<span class="k">if</span> <span class="ow">not</span> <span class="bp">self</span><span class="o">.</span><span class="n">switches</span><span class="p">:</span>
<span class="c1"># adding a new script, and starting it</span>
<span class="n">ok</span> <span class="o">=</span> <span class="n">obj</span><span class="o">.</span><span class="n">scripts</span><span class="o">.</span><span class="n">add</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">rhs</span><span class="p">,</span> <span class="n">autostart</span><span class="o">=</span><span class="kc">True</span><span class="p">)</span>
<span class="k">if</span> <span class="ow">not</span> <span class="n">ok</span><span class="p">:</span>
<span class="n">result</span><span class="o">.</span><span class="n">append</span><span class="p">(</span>
<span class="s2">&quot;</span><span class="se">\n</span><span class="s2">Script </span><span class="si">%s</span><span class="s2"> could not be added and/or started on </span><span class="si">%s</span><span class="s2"> &quot;</span>
<span class="s2">&quot;(or it started and immediately shut down).&quot;</span>
<span class="o">%</span> <span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">rhs</span><span class="p">,</span> <span class="n">obj</span><span class="o">.</span><span class="n">get_display_name</span><span class="p">(</span><span class="n">caller</span><span class="p">))</span>
<span class="p">)</span>
<span class="k">else</span><span class="p">:</span>
<span class="n">result</span><span class="o">.</span><span class="n">append</span><span class="p">(</span>
<span class="s2">&quot;Script |w</span><span class="si">%s</span><span class="s2">|n successfully added and started on </span><span class="si">%s</span><span class="s2">.&quot;</span>
<span class="o">%</span> <span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">rhs</span><span class="p">,</span> <span class="n">obj</span><span class="o">.</span><span class="n">get_display_name</span><span class="p">(</span><span class="n">caller</span><span class="p">))</span>
<span class="p">)</span>
<span class="k">else</span><span class="p">:</span>
<span class="n">paths</span> <span class="o">=</span> <span class="p">[</span><span class="bp">self</span><span class="o">.</span><span class="n">rhs</span><span class="p">]</span> <span class="o">+</span> <span class="p">[</span>
<span class="s2">&quot;</span><span class="si">%s</span><span class="s2">.</span><span class="si">%s</span><span class="s2">&quot;</span> <span class="o">%</span> <span class="p">(</span><span class="n">prefix</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">rhs</span><span class="p">)</span> <span class="k">for</span> <span class="n">prefix</span> <span class="ow">in</span> <span class="n">settings</span><span class="o">.</span><span class="n">TYPECLASS_PATHS</span>
<span class="p">]</span>
<span class="k">if</span> <span class="s2">&quot;stop&quot;</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">switches</span><span class="p">:</span>
<span class="c1"># we are stopping an already existing script</span>
<span class="k">for</span> <span class="n">path</span> <span class="ow">in</span> <span class="n">paths</span><span class="p">:</span>
<span class="n">ok</span> <span class="o">=</span> <span class="n">obj</span><span class="o">.</span><span class="n">scripts</span><span class="o">.</span><span class="n">stop</span><span class="p">(</span><span class="n">path</span><span class="p">)</span>
<span class="k">if</span> <span class="ow">not</span> <span class="n">ok</span><span class="p">:</span>
<span class="n">result</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="s2">&quot;</span><span class="se">\n</span><span class="s2">Script </span><span class="si">%s</span><span class="s2"> could not be stopped. Does it exist?&quot;</span> <span class="o">%</span> <span class="n">path</span><span class="p">)</span>
<span class="k">else</span><span class="p">:</span>
<span class="n">result</span> <span class="o">=</span> <span class="p">[</span><span class="s2">&quot;Script stopped and removed from object.&quot;</span><span class="p">]</span>
<span class="k">break</span>
<span class="k">if</span> <span class="s2">&quot;start&quot;</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">switches</span><span class="p">:</span>
<span class="c1"># we are starting an already existing script</span>
<span class="k">for</span> <span class="n">path</span> <span class="ow">in</span> <span class="n">paths</span><span class="p">:</span>
<span class="n">ok</span> <span class="o">=</span> <span class="n">obj</span><span class="o">.</span><span class="n">scripts</span><span class="o">.</span><span class="n">start</span><span class="p">(</span><span class="n">path</span><span class="p">)</span>
<span class="k">if</span> <span class="ow">not</span> <span class="n">ok</span><span class="p">:</span>
<span class="n">result</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="s2">&quot;</span><span class="se">\n</span><span class="s2">Script </span><span class="si">%s</span><span class="s2"> could not be (re)started.&quot;</span> <span class="o">%</span> <span class="n">path</span><span class="p">)</span>
<span class="k">else</span><span class="p">:</span>
<span class="n">result</span> <span class="o">=</span> <span class="p">[</span><span class="s2">&quot;Script started successfully.&quot;</span><span class="p">]</span>
<span class="k">break</span>
<span class="n">EvMore</span><span class="p">(</span><span class="n">caller</span><span class="p">,</span> <span class="s2">&quot;&quot;</span><span class="o">.</span><span class="n">join</span><span class="p">(</span><span class="n">result</span><span class="p">)</span><span class="o">.</span><span class="n">strip</span><span class="p">())</span></div></div>
<div class="viewcode-block" id="CmdTag"><a class="viewcode-back" href="../../../../api/evennia.commands.default.building.html#evennia.commands.default.building.CmdTag">[docs]</a><span class="k">class</span> <span class="nc">CmdTag</span><span class="p">(</span><span class="n">COMMAND_DEFAULT_CLASS</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> handles the tags of an object</span>
<span class="sd"> Usage:</span>
<span class="sd"> tag[/del] &lt;obj&gt; [= &lt;tag&gt;[:&lt;category&gt;]]</span>
<span class="sd"> tag/search &lt;tag&gt;[:&lt;category]</span>
<span class="sd"> Switches:</span>
<span class="sd"> search - return all objects with a given Tag</span>
<span class="sd"> del - remove the given tag. If no tag is specified,</span>
<span class="sd"> clear all tags on object.</span>
<span class="sd"> Manipulates and lists tags on objects. Tags allow for quick</span>
<span class="sd"> grouping of and searching for objects. If only &lt;obj&gt; is given,</span>
<span class="sd"> list all tags on the object. If /search is used, list objects</span>
<span class="sd"> with the given tag.</span>
<span class="sd"> The category can be used for grouping tags themselves, but it</span>
<span class="sd"> should be used with restrain - tags on their own are usually</span>
<span class="sd"> enough to for most grouping schemes.</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="n">key</span> <span class="o">=</span> <span class="s2">&quot;tag&quot;</span>
<span class="n">aliases</span> <span class="o">=</span> <span class="p">[</span><span class="s2">&quot;tags&quot;</span><span class="p">]</span>
<span class="n">options</span> <span class="o">=</span> <span class="p">(</span><span class="s2">&quot;search&quot;</span><span class="p">,</span> <span class="s2">&quot;del&quot;</span><span class="p">)</span>
<span class="n">locks</span> <span class="o">=</span> <span class="s2">&quot;cmd:perm(tag) or perm(Builder)&quot;</span>
<span class="n">help_category</span> <span class="o">=</span> <span class="s2">&quot;Building&quot;</span>
<span class="n">arg_regex</span> <span class="o">=</span> <span class="sa">r</span><span class="s2">&quot;(/\w+?(\s|$))|\s|$&quot;</span>
<div class="viewcode-block" id="CmdTag.func"><a class="viewcode-back" href="../../../../api/evennia.commands.default.building.html#evennia.commands.default.building.CmdTag.func">[docs]</a> <span class="k">def</span> <span class="nf">func</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;Implement the tag functionality&quot;&quot;&quot;</span>
<span class="k">if</span> <span class="ow">not</span> <span class="bp">self</span><span class="o">.</span><span class="n">args</span><span class="p">:</span>
<span class="bp">self</span><span class="o">.</span><span class="n">caller</span><span class="o">.</span><span class="n">msg</span><span class="p">(</span><span class="s2">&quot;Usage: tag[/switches] &lt;obj&gt; [= &lt;tag&gt;[:&lt;category&gt;]]&quot;</span><span class="p">)</span>
<span class="k">return</span>
<span class="k">if</span> <span class="s2">&quot;search&quot;</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">switches</span><span class="p">:</span>
<span class="c1"># search by tag</span>
<span class="n">tag</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">args</span>
<span class="n">category</span> <span class="o">=</span> <span class="kc">None</span>
<span class="k">if</span> <span class="s2">&quot;:&quot;</span> <span class="ow">in</span> <span class="n">tag</span><span class="p">:</span>
<span class="n">tag</span><span class="p">,</span> <span class="n">category</span> <span class="o">=</span> <span class="p">[</span><span class="n">part</span><span class="o">.</span><span class="n">strip</span><span class="p">()</span> <span class="k">for</span> <span class="n">part</span> <span class="ow">in</span> <span class="n">tag</span><span class="o">.</span><span class="n">split</span><span class="p">(</span><span class="s2">&quot;:&quot;</span><span class="p">,</span> <span class="mi">1</span><span class="p">)]</span>
<span class="n">objs</span> <span class="o">=</span> <span class="n">search</span><span class="o">.</span><span class="n">search_tag</span><span class="p">(</span><span class="n">tag</span><span class="p">,</span> <span class="n">category</span><span class="o">=</span><span class="n">category</span><span class="p">)</span>
<span class="n">nobjs</span> <span class="o">=</span> <span class="nb">len</span><span class="p">(</span><span class="n">objs</span><span class="p">)</span>
<span class="k">if</span> <span class="n">nobjs</span> <span class="o">&gt;</span> <span class="mi">0</span><span class="p">:</span>
<span class="n">catstr</span> <span class="o">=</span> <span class="p">(</span>
<span class="s2">&quot; (category: &#39;|w</span><span class="si">%s</span><span class="s2">|n&#39;)&quot;</span> <span class="o">%</span> <span class="n">category</span>
<span class="k">if</span> <span class="n">category</span>
<span class="k">else</span> <span class="p">(</span><span class="s2">&quot;&quot;</span> <span class="k">if</span> <span class="n">nobjs</span> <span class="o">==</span> <span class="mi">1</span> <span class="k">else</span> <span class="s2">&quot; (may have different tag categories)&quot;</span><span class="p">)</span>
<span class="p">)</span>
<span class="n">matchstr</span> <span class="o">=</span> <span class="s2">&quot;, &quot;</span><span class="o">.</span><span class="n">join</span><span class="p">(</span><span class="n">o</span><span class="o">.</span><span class="n">get_display_name</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">caller</span><span class="p">)</span> <span class="k">for</span> <span class="n">o</span> <span class="ow">in</span> <span class="n">objs</span><span class="p">)</span>
<span class="n">string</span> <span class="o">=</span> <span class="s2">&quot;Found |w</span><span class="si">%i</span><span class="s2">|n object</span><span class="si">%s</span><span class="s2"> with tag &#39;|w</span><span class="si">%s</span><span class="s2">|n&#39;</span><span class="si">%s</span><span class="s2">:</span><span class="se">\n</span><span class="s2"> </span><span class="si">%s</span><span class="s2">&quot;</span> <span class="o">%</span> <span class="p">(</span>
<span class="n">nobjs</span><span class="p">,</span>
<span class="s2">&quot;s&quot;</span> <span class="k">if</span> <span class="n">nobjs</span> <span class="o">&gt;</span> <span class="mi">1</span> <span class="k">else</span> <span class="s2">&quot;&quot;</span><span class="p">,</span>
<span class="n">tag</span><span class="p">,</span>
<span class="n">catstr</span><span class="p">,</span>
<span class="n">matchstr</span><span class="p">,</span>
<span class="p">)</span>
<span class="k">else</span><span class="p">:</span>
<span class="n">string</span> <span class="o">=</span> <span class="s2">&quot;No objects found with tag &#39;</span><span class="si">%s%s</span><span class="s2">&#39;.&quot;</span> <span class="o">%</span> <span class="p">(</span>
<span class="n">tag</span><span class="p">,</span>
<span class="s2">&quot; (category: </span><span class="si">%s</span><span class="s2">)&quot;</span> <span class="o">%</span> <span class="n">category</span> <span class="k">if</span> <span class="n">category</span> <span class="k">else</span> <span class="s2">&quot;&quot;</span><span class="p">,</span>
<span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">caller</span><span class="o">.</span><span class="n">msg</span><span class="p">(</span><span class="n">string</span><span class="p">)</span>
<span class="k">return</span>
<span class="k">if</span> <span class="s2">&quot;del&quot;</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">switches</span><span class="p">:</span>
<span class="c1"># remove one or all tags</span>
<span class="n">obj</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">caller</span><span class="o">.</span><span class="n">search</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">lhs</span><span class="p">,</span> <span class="n">global_search</span><span class="o">=</span><span class="kc">True</span><span class="p">)</span>
<span class="k">if</span> <span class="ow">not</span> <span class="n">obj</span><span class="p">:</span>
<span class="k">return</span>
<span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">rhs</span><span class="p">:</span>
<span class="c1"># remove individual tag</span>
<span class="n">tag</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">rhs</span>
<span class="n">category</span> <span class="o">=</span> <span class="kc">None</span>
<span class="k">if</span> <span class="s2">&quot;:&quot;</span> <span class="ow">in</span> <span class="n">tag</span><span class="p">:</span>
<span class="n">tag</span><span class="p">,</span> <span class="n">category</span> <span class="o">=</span> <span class="p">[</span><span class="n">part</span><span class="o">.</span><span class="n">strip</span><span class="p">()</span> <span class="k">for</span> <span class="n">part</span> <span class="ow">in</span> <span class="n">tag</span><span class="o">.</span><span class="n">split</span><span class="p">(</span><span class="s2">&quot;:&quot;</span><span class="p">,</span> <span class="mi">1</span><span class="p">)]</span>
<span class="k">if</span> <span class="n">obj</span><span class="o">.</span><span class="n">tags</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="n">tag</span><span class="p">,</span> <span class="n">category</span><span class="o">=</span><span class="n">category</span><span class="p">):</span>
<span class="n">obj</span><span class="o">.</span><span class="n">tags</span><span class="o">.</span><span class="n">remove</span><span class="p">(</span><span class="n">tag</span><span class="p">,</span> <span class="n">category</span><span class="o">=</span><span class="n">category</span><span class="p">)</span>
<span class="n">string</span> <span class="o">=</span> <span class="s2">&quot;Removed tag &#39;</span><span class="si">%s</span><span class="s2">&#39;</span><span class="si">%s</span><span class="s2"> from </span><span class="si">%s</span><span class="s2">.&quot;</span> <span class="o">%</span> <span class="p">(</span>
<span class="n">tag</span><span class="p">,</span>
<span class="s2">&quot; (category: </span><span class="si">%s</span><span class="s2">)&quot;</span> <span class="o">%</span> <span class="n">category</span> <span class="k">if</span> <span class="n">category</span> <span class="k">else</span> <span class="s2">&quot;&quot;</span><span class="p">,</span>
<span class="n">obj</span><span class="p">,</span>
<span class="p">)</span>
<span class="k">else</span><span class="p">:</span>
<span class="n">string</span> <span class="o">=</span> <span class="s2">&quot;No tag &#39;</span><span class="si">%s</span><span class="s2">&#39;</span><span class="si">%s</span><span class="s2"> to delete on </span><span class="si">%s</span><span class="s2">.&quot;</span> <span class="o">%</span> <span class="p">(</span>
<span class="n">tag</span><span class="p">,</span>
<span class="s2">&quot; (category: </span><span class="si">%s</span><span class="s2">)&quot;</span> <span class="o">%</span> <span class="n">category</span> <span class="k">if</span> <span class="n">category</span> <span class="k">else</span> <span class="s2">&quot;&quot;</span><span class="p">,</span>
<span class="n">obj</span><span class="p">,</span>
<span class="p">)</span>
<span class="k">else</span><span class="p">:</span>
<span class="c1"># no tag specified, clear all tags</span>
<span class="n">old_tags</span> <span class="o">=</span> <span class="p">[</span>
<span class="s2">&quot;</span><span class="si">%s%s</span><span class="s2">&quot;</span> <span class="o">%</span> <span class="p">(</span><span class="n">tag</span><span class="p">,</span> <span class="s2">&quot; (category: </span><span class="si">%s</span><span class="s2">)&quot;</span> <span class="o">%</span> <span class="n">category</span> <span class="k">if</span> <span class="n">category</span> <span class="k">else</span> <span class="s2">&quot;&quot;</span><span class="p">)</span>
<span class="k">for</span> <span class="n">tag</span><span class="p">,</span> <span class="n">category</span> <span class="ow">in</span> <span class="n">obj</span><span class="o">.</span><span class="n">tags</span><span class="o">.</span><span class="n">all</span><span class="p">(</span><span class="n">return_key_and_category</span><span class="o">=</span><span class="kc">True</span><span class="p">)</span>
<span class="p">]</span>
<span class="k">if</span> <span class="n">old_tags</span><span class="p">:</span>
<span class="n">obj</span><span class="o">.</span><span class="n">tags</span><span class="o">.</span><span class="n">clear</span><span class="p">()</span>
<span class="n">string</span> <span class="o">=</span> <span class="s2">&quot;Cleared all tags from </span><span class="si">%s</span><span class="s2">: </span><span class="si">%s</span><span class="s2">&quot;</span> <span class="o">%</span> <span class="p">(</span><span class="n">obj</span><span class="p">,</span> <span class="s2">&quot;, &quot;</span><span class="o">.</span><span class="n">join</span><span class="p">(</span><span class="nb">sorted</span><span class="p">(</span><span class="n">old_tags</span><span class="p">)))</span>
<span class="k">else</span><span class="p">:</span>
<span class="n">string</span> <span class="o">=</span> <span class="s2">&quot;No Tags to clear on </span><span class="si">%s</span><span class="s2">.&quot;</span> <span class="o">%</span> <span class="n">obj</span>
<span class="bp">self</span><span class="o">.</span><span class="n">caller</span><span class="o">.</span><span class="n">msg</span><span class="p">(</span><span class="n">string</span><span class="p">)</span>
<span class="k">return</span>
<span class="c1"># no search/deletion</span>
<span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">rhs</span><span class="p">:</span>
<span class="c1"># = is found; command args are of the form obj = tag</span>
<span class="n">obj</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">caller</span><span class="o">.</span><span class="n">search</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">lhs</span><span class="p">,</span> <span class="n">global_search</span><span class="o">=</span><span class="kc">True</span><span class="p">)</span>
<span class="k">if</span> <span class="ow">not</span> <span class="n">obj</span><span class="p">:</span>
<span class="k">return</span>
<span class="n">tag</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">rhs</span>
<span class="n">category</span> <span class="o">=</span> <span class="kc">None</span>
<span class="k">if</span> <span class="s2">&quot;:&quot;</span> <span class="ow">in</span> <span class="n">tag</span><span class="p">:</span>
<span class="n">tag</span><span class="p">,</span> <span class="n">category</span> <span class="o">=</span> <span class="p">[</span><span class="n">part</span><span class="o">.</span><span class="n">strip</span><span class="p">()</span> <span class="k">for</span> <span class="n">part</span> <span class="ow">in</span> <span class="n">tag</span><span class="o">.</span><span class="n">split</span><span class="p">(</span><span class="s2">&quot;:&quot;</span><span class="p">,</span> <span class="mi">1</span><span class="p">)]</span>
<span class="c1"># create the tag</span>
<span class="n">obj</span><span class="o">.</span><span class="n">tags</span><span class="o">.</span><span class="n">add</span><span class="p">(</span><span class="n">tag</span><span class="p">,</span> <span class="n">category</span><span class="o">=</span><span class="n">category</span><span class="p">)</span>
<span class="n">string</span> <span class="o">=</span> <span class="s2">&quot;Added tag &#39;</span><span class="si">%s</span><span class="s2">&#39;</span><span class="si">%s</span><span class="s2"> to </span><span class="si">%s</span><span class="s2">.&quot;</span> <span class="o">%</span> <span class="p">(</span>
<span class="n">tag</span><span class="p">,</span>
<span class="s2">&quot; (category: </span><span class="si">%s</span><span class="s2">)&quot;</span> <span class="o">%</span> <span class="n">category</span> <span class="k">if</span> <span class="n">category</span> <span class="k">else</span> <span class="s2">&quot;&quot;</span><span class="p">,</span>
<span class="n">obj</span><span class="p">,</span>
<span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">caller</span><span class="o">.</span><span class="n">msg</span><span class="p">(</span><span class="n">string</span><span class="p">)</span>
<span class="k">else</span><span class="p">:</span>
<span class="c1"># no = found - list tags on object</span>
<span class="n">obj</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">caller</span><span class="o">.</span><span class="n">search</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">args</span><span class="p">,</span> <span class="n">global_search</span><span class="o">=</span><span class="kc">True</span><span class="p">)</span>
<span class="k">if</span> <span class="ow">not</span> <span class="n">obj</span><span class="p">:</span>
<span class="k">return</span>
<span class="n">tagtuples</span> <span class="o">=</span> <span class="n">obj</span><span class="o">.</span><span class="n">tags</span><span class="o">.</span><span class="n">all</span><span class="p">(</span><span class="n">return_key_and_category</span><span class="o">=</span><span class="kc">True</span><span class="p">)</span>
<span class="n">ntags</span> <span class="o">=</span> <span class="nb">len</span><span class="p">(</span><span class="n">tagtuples</span><span class="p">)</span>
<span class="n">tags</span> <span class="o">=</span> <span class="p">[</span><span class="n">tup</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span> <span class="k">for</span> <span class="n">tup</span> <span class="ow">in</span> <span class="n">tagtuples</span><span class="p">]</span>
<span class="n">categories</span> <span class="o">=</span> <span class="p">[</span><span class="s2">&quot; (category: </span><span class="si">%s</span><span class="s2">)&quot;</span> <span class="o">%</span> <span class="n">tup</span><span class="p">[</span><span class="mi">1</span><span class="p">]</span> <span class="k">if</span> <span class="n">tup</span><span class="p">[</span><span class="mi">1</span><span class="p">]</span> <span class="k">else</span> <span class="s2">&quot;&quot;</span> <span class="k">for</span> <span class="n">tup</span> <span class="ow">in</span> <span class="n">tagtuples</span><span class="p">]</span>
<span class="k">if</span> <span class="n">ntags</span><span class="p">:</span>
<span class="n">string</span> <span class="o">=</span> <span class="s2">&quot;Tag</span><span class="si">%s</span><span class="s2"> on </span><span class="si">%s</span><span class="s2">: </span><span class="si">%s</span><span class="s2">&quot;</span> <span class="o">%</span> <span class="p">(</span>
<span class="s2">&quot;s&quot;</span> <span class="k">if</span> <span class="n">ntags</span> <span class="o">&gt;</span> <span class="mi">1</span> <span class="k">else</span> <span class="s2">&quot;&quot;</span><span class="p">,</span>
<span class="n">obj</span><span class="p">,</span>
<span class="s2">&quot;, &quot;</span><span class="o">.</span><span class="n">join</span><span class="p">(</span><span class="nb">sorted</span><span class="p">(</span><span class="s2">&quot;&#39;</span><span class="si">%s</span><span class="s2">&#39;</span><span class="si">%s</span><span class="s2">&quot;</span> <span class="o">%</span> <span class="p">(</span><span class="n">tags</span><span class="p">[</span><span class="n">i</span><span class="p">],</span> <span class="n">categories</span><span class="p">[</span><span class="n">i</span><span class="p">])</span> <span class="k">for</span> <span class="n">i</span> <span class="ow">in</span> <span class="nb">range</span><span class="p">(</span><span class="n">ntags</span><span class="p">))),</span>
<span class="p">)</span>
<span class="k">else</span><span class="p">:</span>
<span class="n">string</span> <span class="o">=</span> <span class="s2">&quot;No tags attached to </span><span class="si">%s</span><span class="s2">.&quot;</span> <span class="o">%</span> <span class="n">obj</span>
<span class="bp">self</span><span class="o">.</span><span class="n">caller</span><span class="o">.</span><span class="n">msg</span><span class="p">(</span><span class="n">string</span><span class="p">)</span></div></div>
<span class="c1"># helper functions for spawn</span>
<div class="viewcode-block" id="CmdSpawn"><a class="viewcode-back" href="../../../../api/evennia.commands.default.building.html#evennia.commands.default.building.CmdSpawn">[docs]</a><span class="k">class</span> <span class="nc">CmdSpawn</span><span class="p">(</span><span class="n">COMMAND_DEFAULT_CLASS</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> spawn objects from prototype</span>
<span class="sd"> Usage:</span>
<span class="sd"> spawn[/noloc] &lt;prototype_key&gt;</span>
<span class="sd"> spawn[/noloc] &lt;prototype_dict&gt;</span>
<span class="sd"> spawn/search [prototype_keykey][;tag[,tag]]</span>
<span class="sd"> spawn/list [tag, tag, ...]</span>
<span class="sd"> spawn/list modules - list only module-based prototypes</span>
<span class="sd"> spawn/show [&lt;prototype_key&gt;]</span>
<span class="sd"> spawn/update &lt;prototype_key&gt;</span>
<span class="sd"> spawn/save &lt;prototype_dict&gt;</span>
<span class="sd"> spawn/edit [&lt;prototype_key&gt;]</span>
<span class="sd"> olc - equivalent to spawn/edit</span>
<span class="sd"> Switches:</span>
<span class="sd"> noloc - allow location to be None if not specified explicitly. Otherwise,</span>
<span class="sd"> location will default to caller&#39;s current location.</span>
<span class="sd"> search - search prototype by name or tags.</span>
<span class="sd"> list - list available prototypes, optionally limit by tags.</span>
<span class="sd"> show, examine - inspect prototype by key. If not given, acts like list.</span>
<span class="sd"> raw - show the raw dict of the prototype as a one-line string for manual editing.</span>
<span class="sd"> save - save a prototype to the database. It will be listable by /list.</span>
<span class="sd"> delete - remove a prototype from database, if allowed to.</span>
<span class="sd"> update - find existing objects with the same prototype_key and update</span>
<span class="sd"> them with latest version of given prototype. If given with /save,</span>
<span class="sd"> will auto-update all objects with the old version of the prototype</span>
<span class="sd"> without asking first.</span>
<span class="sd"> edit, menu, olc - create/manipulate prototype in a menu interface.</span>
<span class="sd"> Example:</span>
<span class="sd"> spawn GOBLIN</span>
<span class="sd"> spawn {&quot;key&quot;:&quot;goblin&quot;, &quot;typeclass&quot;:&quot;monster.Monster&quot;, &quot;location&quot;:&quot;#2&quot;}</span>
<span class="sd"> spawn/save {&quot;key&quot;: &quot;grunt&quot;, prototype: &quot;goblin&quot;};;mobs;edit:all()</span>
<span class="sd"> \f</span>
<span class="sd"> Dictionary keys:</span>
<span class="sd"> |wprototype_parent |n - name of parent prototype to use. Required if typeclass is</span>
<span class="sd"> not set. Can be a path or a list for multiple inheritance (inherits</span>
<span class="sd"> left to right). If set one of the parents must have a typeclass.</span>
<span class="sd"> |wtypeclass |n - string. Required if prototype_parent is not set.</span>
<span class="sd"> |wkey |n - string, the main object identifier</span>
<span class="sd"> |wlocation |n - this should be a valid object or #dbref</span>
<span class="sd"> |whome |n - valid object or #dbref</span>
<span class="sd"> |wdestination|n - only valid for exits (object or dbref)</span>
<span class="sd"> |wpermissions|n - string or list of permission strings</span>
<span class="sd"> |wlocks |n - a lock-string</span>
<span class="sd"> |waliases |n - string or list of strings.</span>
<span class="sd"> |wndb_|n&lt;name&gt; - value of a nattribute (ndb_ is stripped)</span>
<span class="sd"> |wprototype_key|n - name of this prototype. Unique. Used to store/retrieve from db</span>
<span class="sd"> and update existing prototyped objects if desired.</span>
<span class="sd"> |wprototype_desc|n - desc of this prototype. Used in listings</span>
<span class="sd"> |wprototype_locks|n - locks of this prototype. Limits who may use prototype</span>
<span class="sd"> |wprototype_tags|n - tags of this prototype. Used to find prototype</span>
<span class="sd"> any other keywords are interpreted as Attributes and their values.</span>
<span class="sd"> The available prototypes are defined globally in modules set in</span>
<span class="sd"> settings.PROTOTYPE_MODULES. If spawn is used without arguments it</span>
<span class="sd"> displays a list of available prototypes.</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="n">key</span> <span class="o">=</span> <span class="s2">&quot;spawn&quot;</span>
<span class="n">aliases</span> <span class="o">=</span> <span class="p">[</span><span class="s2">&quot;olc&quot;</span><span class="p">]</span>
<span class="n">switch_options</span> <span class="o">=</span> <span class="p">(</span>
<span class="s2">&quot;noloc&quot;</span><span class="p">,</span>
<span class="s2">&quot;search&quot;</span><span class="p">,</span>
<span class="s2">&quot;list&quot;</span><span class="p">,</span>
<span class="s2">&quot;show&quot;</span><span class="p">,</span>
<span class="s2">&quot;raw&quot;</span><span class="p">,</span>
<span class="s2">&quot;examine&quot;</span><span class="p">,</span>
<span class="s2">&quot;save&quot;</span><span class="p">,</span>
<span class="s2">&quot;delete&quot;</span><span class="p">,</span>
<span class="s2">&quot;menu&quot;</span><span class="p">,</span>
<span class="s2">&quot;olc&quot;</span><span class="p">,</span>
<span class="s2">&quot;update&quot;</span><span class="p">,</span>
<span class="s2">&quot;edit&quot;</span><span class="p">,</span>
<span class="p">)</span>
<span class="n">locks</span> <span class="o">=</span> <span class="s2">&quot;cmd:perm(spawn) or perm(Builder)&quot;</span>
<span class="n">help_category</span> <span class="o">=</span> <span class="s2">&quot;Building&quot;</span>
<span class="k">def</span> <span class="nf">_search_prototype</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">prototype_key</span><span class="p">,</span> <span class="n">quiet</span><span class="o">=</span><span class="kc">False</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> Search for prototype and handle no/multi-match and access.</span>
<span class="sd"> Returns a single found prototype or None - in the</span>
<span class="sd"> case, the caller has already been informed of the</span>
<span class="sd"> search error we need not do any further action.</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="n">prototypes</span> <span class="o">=</span> <span class="n">protlib</span><span class="o">.</span><span class="n">search_prototype</span><span class="p">(</span><span class="n">prototype_key</span><span class="p">)</span>
<span class="n">nprots</span> <span class="o">=</span> <span class="nb">len</span><span class="p">(</span><span class="n">prototypes</span><span class="p">)</span>
<span class="c1"># handle the search result</span>
<span class="n">err</span> <span class="o">=</span> <span class="kc">None</span>
<span class="k">if</span> <span class="ow">not</span> <span class="n">prototypes</span><span class="p">:</span>
<span class="n">err</span> <span class="o">=</span> <span class="n">f</span><span class="s2">&quot;No prototype named &#39;</span><span class="si">{prototype_key}</span><span class="s2">&#39; was found.&quot;</span>
<span class="k">elif</span> <span class="n">nprots</span> <span class="o">&gt;</span> <span class="mi">1</span><span class="p">:</span>
<span class="n">err</span> <span class="o">=</span> <span class="s2">&quot;Found </span><span class="si">{}</span><span class="s2"> prototypes matching &#39;</span><span class="si">{}</span><span class="s2">&#39;:</span><span class="se">\n</span><span class="s2"> </span><span class="si">{}</span><span class="s2">&quot;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span>
<span class="n">nprots</span><span class="p">,</span>
<span class="n">prototype_key</span><span class="p">,</span>
<span class="s2">&quot;, &quot;</span><span class="o">.</span><span class="n">join</span><span class="p">(</span><span class="n">proto</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s2">&quot;prototype_key&quot;</span><span class="p">,</span> <span class="s2">&quot;&quot;</span><span class="p">)</span> <span class="k">for</span> <span class="n">proto</span> <span class="ow">in</span> <span class="n">prototypes</span><span class="p">),</span>
<span class="p">)</span>
<span class="k">else</span><span class="p">:</span>
<span class="c1"># we have a single prototype, check access</span>
<span class="n">prototype</span> <span class="o">=</span> <span class="n">prototypes</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span>
<span class="k">if</span> <span class="ow">not</span> <span class="bp">self</span><span class="o">.</span><span class="n">caller</span><span class="o">.</span><span class="n">locks</span><span class="o">.</span><span class="n">check_lockstring</span><span class="p">(</span>
<span class="bp">self</span><span class="o">.</span><span class="n">caller</span><span class="p">,</span> <span class="n">prototype</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s2">&quot;prototype_locks&quot;</span><span class="p">,</span> <span class="s2">&quot;&quot;</span><span class="p">),</span> <span class="n">access_type</span><span class="o">=</span><span class="s2">&quot;spawn&quot;</span><span class="p">,</span> <span class="n">default</span><span class="o">=</span><span class="kc">True</span>
<span class="p">):</span>
<span class="n">err</span> <span class="o">=</span> <span class="s2">&quot;You don&#39;t have access to use this prototype.&quot;</span>
<span class="k">if</span> <span class="n">err</span><span class="p">:</span>
<span class="c1"># return None on any error</span>
<span class="k">if</span> <span class="ow">not</span> <span class="n">quiet</span><span class="p">:</span>
<span class="bp">self</span><span class="o">.</span><span class="n">caller</span><span class="o">.</span><span class="n">msg</span><span class="p">(</span><span class="n">err</span><span class="p">)</span>
<span class="k">return</span>
<span class="k">return</span> <span class="n">prototype</span>
<span class="k">def</span> <span class="nf">_parse_prototype</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">inp</span><span class="p">,</span> <span class="n">expect</span><span class="o">=</span><span class="nb">dict</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> Parse a prototype dict or key from the input and convert it safely</span>
<span class="sd"> into a dict if appropriate.</span>
<span class="sd"> Args:</span>
<span class="sd"> inp (str): The input from user.</span>
<span class="sd"> expect (type, optional):</span>
<span class="sd"> Returns:</span>
<span class="sd"> prototype (dict, str or None): The parsed prototype. If None, the error</span>
<span class="sd"> was already reported.</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="n">eval_err</span> <span class="o">=</span> <span class="kc">None</span>
<span class="k">try</span><span class="p">:</span>
<span class="n">prototype</span> <span class="o">=</span> <span class="n">_LITERAL_EVAL</span><span class="p">(</span><span class="n">inp</span><span class="p">)</span>
<span class="k">except</span> <span class="p">(</span><span class="ne">SyntaxError</span><span class="p">,</span> <span class="ne">ValueError</span><span class="p">)</span> <span class="k">as</span> <span class="n">err</span><span class="p">:</span>
<span class="c1"># treat as string</span>
<span class="n">eval_err</span> <span class="o">=</span> <span class="n">err</span>
<span class="n">prototype</span> <span class="o">=</span> <span class="n">utils</span><span class="o">.</span><span class="n">to_str</span><span class="p">(</span><span class="n">inp</span><span class="p">)</span>
<span class="k">finally</span><span class="p">:</span>
<span class="c1"># it&#39;s possible that the input was a prototype-key, in which case</span>
<span class="c1"># it&#39;s okay for the LITERAL_EVAL to fail. Only if the result does not</span>
<span class="c1"># match the expected type do we have a problem.</span>
<span class="k">if</span> <span class="ow">not</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">prototype</span><span class="p">,</span> <span class="n">expect</span><span class="p">):</span>
<span class="k">if</span> <span class="n">eval_err</span><span class="p">:</span>
<span class="n">string</span> <span class="o">=</span> <span class="p">(</span>
<span class="n">f</span><span class="s2">&quot;</span><span class="si">{inp}</span><span class="se">\n</span><span class="si">{eval_err}</span><span class="se">\n</span><span class="s2">|RCritical Python syntax error in argument. Only primitive &quot;</span>
<span class="s2">&quot;Python structures are allowed. </span><span class="se">\n</span><span class="s2">Make sure to use correct &quot;</span>
<span class="s2">&quot;Python syntax. Remember especially to put quotes around all &quot;</span>
<span class="s2">&quot;strings inside lists and dicts.|n For more advanced uses, embed &quot;</span>
<span class="s2">&quot;inlinefuncs in the strings.&quot;</span>
<span class="p">)</span>
<span class="k">else</span><span class="p">:</span>
<span class="n">string</span> <span class="o">=</span> <span class="s2">&quot;Expected </span><span class="si">{}</span><span class="s2">, got </span><span class="si">{}</span><span class="s2">.&quot;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">expect</span><span class="p">,</span> <span class="nb">type</span><span class="p">(</span><span class="n">prototype</span><span class="p">))</span>
<span class="bp">self</span><span class="o">.</span><span class="n">caller</span><span class="o">.</span><span class="n">msg</span><span class="p">(</span><span class="n">string</span><span class="p">)</span>
<span class="k">return</span>
<span class="k">if</span> <span class="n">expect</span> <span class="o">==</span> <span class="nb">dict</span><span class="p">:</span>
<span class="c1"># an actual prototype. We need to make sure it&#39;s safe,</span>
<span class="c1"># so don&#39;t allow exec.</span>
<span class="c1"># TODO: Exec support is deprecated. Remove completely for 1.0.</span>
<span class="k">if</span> <span class="s2">&quot;exec&quot;</span> <span class="ow">in</span> <span class="n">prototype</span> <span class="ow">and</span> <span class="ow">not</span> <span class="bp">self</span><span class="o">.</span><span class="n">caller</span><span class="o">.</span><span class="n">check_permstring</span><span class="p">(</span><span class="s2">&quot;Developer&quot;</span><span class="p">):</span>
<span class="bp">self</span><span class="o">.</span><span class="n">caller</span><span class="o">.</span><span class="n">msg</span><span class="p">(</span>
<span class="s2">&quot;Spawn aborted: You are not allowed to &quot;</span> <span class="s2">&quot;use the &#39;exec&#39; prototype key.&quot;</span>
<span class="p">)</span>
<span class="k">return</span>
<span class="k">try</span><span class="p">:</span>
<span class="c1"># we homogenize the protoype first, to be more lenient with free-form</span>
<span class="n">protlib</span><span class="o">.</span><span class="n">validate_prototype</span><span class="p">(</span><span class="n">protlib</span><span class="o">.</span><span class="n">homogenize_prototype</span><span class="p">(</span><span class="n">prototype</span><span class="p">))</span>
<span class="k">except</span> <span class="ne">RuntimeError</span> <span class="k">as</span> <span class="n">err</span><span class="p">:</span>
<span class="bp">self</span><span class="o">.</span><span class="n">caller</span><span class="o">.</span><span class="n">msg</span><span class="p">(</span><span class="nb">str</span><span class="p">(</span><span class="n">err</span><span class="p">))</span>
<span class="k">return</span>
<span class="k">return</span> <span class="n">prototype</span>
<span class="k">def</span> <span class="nf">_get_prototype_detail</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">query</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span> <span class="n">prototypes</span><span class="o">=</span><span class="kc">None</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> Display the detailed specs of one or more prototypes.</span>
<span class="sd"> Args:</span>
<span class="sd"> query (str, optional): If this is given and `prototypes` is not, search for</span>
<span class="sd"> the prototype(s) by this query. This may be a partial query which</span>
<span class="sd"> may lead to multiple matches, all being displayed.</span>
<span class="sd"> prototypes (list, optional): If given, ignore `query` and only show these</span>
<span class="sd"> prototype-details.</span>
<span class="sd"> Returns:</span>
<span class="sd"> display (str, None): A formatted string of one or more prototype details.</span>
<span class="sd"> If None, the caller was already informed of the error.</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="k">if</span> <span class="ow">not</span> <span class="n">prototypes</span><span class="p">:</span>
<span class="c1"># we need to query. Note that if query is None, all prototypes will</span>
<span class="c1"># be returned.</span>
<span class="n">prototypes</span> <span class="o">=</span> <span class="n">protlib</span><span class="o">.</span><span class="n">search_prototype</span><span class="p">(</span><span class="n">key</span><span class="o">=</span><span class="n">query</span><span class="p">)</span>
<span class="k">if</span> <span class="n">prototypes</span><span class="p">:</span>
<span class="k">return</span> <span class="s2">&quot;</span><span class="se">\n</span><span class="s2">&quot;</span><span class="o">.</span><span class="n">join</span><span class="p">(</span><span class="n">protlib</span><span class="o">.</span><span class="n">prototype_to_str</span><span class="p">(</span><span class="n">prot</span><span class="p">)</span> <span class="k">for</span> <span class="n">prot</span> <span class="ow">in</span> <span class="n">prototypes</span><span class="p">)</span>
<span class="k">elif</span> <span class="n">query</span><span class="p">:</span>
<span class="bp">self</span><span class="o">.</span><span class="n">caller</span><span class="o">.</span><span class="n">msg</span><span class="p">(</span><span class="n">f</span><span class="s2">&quot;No prototype named &#39;</span><span class="si">{query}</span><span class="s2">&#39; was found.&quot;</span><span class="p">)</span>
<span class="k">else</span><span class="p">:</span>
<span class="bp">self</span><span class="o">.</span><span class="n">caller</span><span class="o">.</span><span class="n">msg</span><span class="p">(</span><span class="s2">&quot;No prototypes found.&quot;</span><span class="p">)</span>
<span class="k">def</span> <span class="nf">_list_prototypes</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">key</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span> <span class="n">tags</span><span class="o">=</span><span class="kc">None</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;Display prototypes as a list, optionally limited by key/tags. &quot;&quot;&quot;</span>
<span class="n">protlib</span><span class="o">.</span><span class="n">list_prototypes</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">caller</span><span class="p">,</span> <span class="n">key</span><span class="o">=</span><span class="n">key</span><span class="p">,</span> <span class="n">tags</span><span class="o">=</span><span class="n">tags</span><span class="p">,</span> <span class="n">session</span><span class="o">=</span><span class="bp">self</span><span class="o">.</span><span class="n">session</span><span class="p">)</span>
<span class="nd">@interactive</span>
<span class="k">def</span> <span class="nf">_update_existing_objects</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">caller</span><span class="p">,</span> <span class="n">prototype_key</span><span class="p">,</span> <span class="n">quiet</span><span class="o">=</span><span class="kc">False</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> Update existing objects (if any) with this prototype-key to the latest</span>
<span class="sd"> prototype version.</span>
<span class="sd"> Args:</span>
<span class="sd"> caller (Object): This is necessary for @interactive to work.</span>
<span class="sd"> prototype_key (str): The prototype to update.</span>
<span class="sd"> quiet (bool, optional): If set, don&#39;t report to user if no</span>
<span class="sd"> old objects were found to update.</span>
<span class="sd"> Returns:</span>
<span class="sd"> n_updated (int): Number of updated objects.</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="n">prototype</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_search_prototype</span><span class="p">(</span><span class="n">prototype_key</span><span class="p">)</span>
<span class="k">if</span> <span class="ow">not</span> <span class="n">prototype</span><span class="p">:</span>
<span class="k">return</span>
<span class="n">existing_objects</span> <span class="o">=</span> <span class="n">protlib</span><span class="o">.</span><span class="n">search_objects_with_prototype</span><span class="p">(</span><span class="n">prototype_key</span><span class="p">)</span>
<span class="k">if</span> <span class="ow">not</span> <span class="n">existing_objects</span><span class="p">:</span>
<span class="k">if</span> <span class="ow">not</span> <span class="n">quiet</span><span class="p">:</span>
<span class="n">caller</span><span class="o">.</span><span class="n">msg</span><span class="p">(</span><span class="s2">&quot;No existing objects found with an older version of this prototype.&quot;</span><span class="p">)</span>
<span class="k">return</span>
<span class="k">if</span> <span class="n">existing_objects</span><span class="p">:</span>
<span class="n">n_existing</span> <span class="o">=</span> <span class="nb">len</span><span class="p">(</span><span class="n">existing_objects</span><span class="p">)</span>
<span class="n">slow</span> <span class="o">=</span> <span class="s2">&quot; (note that this may be slow)&quot;</span> <span class="k">if</span> <span class="n">n_existing</span> <span class="o">&gt;</span> <span class="mi">10</span> <span class="k">else</span> <span class="s2">&quot;&quot;</span>
<span class="n">string</span> <span class="o">=</span> <span class="p">(</span>
<span class="n">f</span><span class="s2">&quot;There are </span><span class="si">{n_existing}</span><span class="s2"> existing object(s) with an older version &quot;</span>
<span class="n">f</span><span class="s2">&quot;of prototype &#39;</span><span class="si">{prototype_key}</span><span class="s2">&#39;. Should it be re-applied to them</span><span class="si">{slow}</span><span class="s2">? [Y]/N&quot;</span>
<span class="p">)</span>
<span class="n">answer</span> <span class="o">=</span> <span class="k">yield</span> <span class="p">(</span><span class="n">string</span><span class="p">)</span>
<span class="k">if</span> <span class="n">answer</span><span class="o">.</span><span class="n">lower</span><span class="p">()</span> <span class="ow">in</span> <span class="p">[</span><span class="s2">&quot;n&quot;</span><span class="p">,</span> <span class="s2">&quot;no&quot;</span><span class="p">]:</span>
<span class="n">caller</span><span class="o">.</span><span class="n">msg</span><span class="p">(</span>
<span class="s2">&quot;|rNo update was done of existing objects. &quot;</span>
<span class="s2">&quot;Use spawn/update &lt;key&gt; to apply later as needed.|n&quot;</span>
<span class="p">)</span>
<span class="k">return</span>
<span class="k">try</span><span class="p">:</span>
<span class="n">n_updated</span> <span class="o">=</span> <span class="n">spawner</span><span class="o">.</span><span class="n">batch_update_objects_with_prototype</span><span class="p">(</span>
<span class="n">prototype</span><span class="p">,</span> <span class="n">objects</span><span class="o">=</span><span class="n">existing_objects</span>
<span class="p">)</span>
<span class="k">except</span> <span class="ne">Exception</span><span class="p">:</span>
<span class="n">logger</span><span class="o">.</span><span class="n">log_trace</span><span class="p">()</span>
<span class="n">caller</span><span class="o">.</span><span class="n">msg</span><span class="p">(</span><span class="n">f</span><span class="s2">&quot;</span><span class="si">{n_updated}</span><span class="s2"> objects were updated.&quot;</span><span class="p">)</span>
<span class="k">return</span>
<span class="k">def</span> <span class="nf">_parse_key_desc_tags</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">argstring</span><span class="p">,</span> <span class="n">desc</span><span class="o">=</span><span class="kc">True</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> Parse ;-separated input list.</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="n">key</span><span class="p">,</span> <span class="n">desc</span><span class="p">,</span> <span class="n">tags</span> <span class="o">=</span> <span class="s2">&quot;&quot;</span><span class="p">,</span> <span class="s2">&quot;&quot;</span><span class="p">,</span> <span class="p">[]</span>
<span class="k">if</span> <span class="s2">&quot;;&quot;</span> <span class="ow">in</span> <span class="n">argstring</span><span class="p">:</span>
<span class="n">parts</span> <span class="o">=</span> <span class="p">[</span><span class="n">part</span><span class="o">.</span><span class="n">strip</span><span class="p">()</span><span class="o">.</span><span class="n">lower</span><span class="p">()</span> <span class="k">for</span> <span class="n">part</span> <span class="ow">in</span> <span class="n">argstring</span><span class="o">.</span><span class="n">split</span><span class="p">(</span><span class="s2">&quot;;&quot;</span><span class="p">)]</span>
<span class="k">if</span> <span class="nb">len</span><span class="p">(</span><span class="n">parts</span><span class="p">)</span> <span class="o">&gt;</span> <span class="mi">1</span> <span class="ow">and</span> <span class="n">desc</span><span class="p">:</span>
<span class="n">key</span> <span class="o">=</span> <span class="n">parts</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span>
<span class="n">desc</span> <span class="o">=</span> <span class="n">parts</span><span class="p">[</span><span class="mi">1</span><span class="p">]</span>
<span class="n">tags</span> <span class="o">=</span> <span class="n">parts</span><span class="p">[</span><span class="mi">2</span><span class="p">:]</span>
<span class="k">else</span><span class="p">:</span>
<span class="n">key</span> <span class="o">=</span> <span class="n">parts</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span>
<span class="n">tags</span> <span class="o">=</span> <span class="n">parts</span><span class="p">[</span><span class="mi">1</span><span class="p">:]</span>
<span class="k">else</span><span class="p">:</span>
<span class="n">key</span> <span class="o">=</span> <span class="n">argstring</span><span class="o">.</span><span class="n">strip</span><span class="p">()</span><span class="o">.</span><span class="n">lower</span><span class="p">()</span>
<span class="k">return</span> <span class="n">key</span><span class="p">,</span> <span class="n">desc</span><span class="p">,</span> <span class="n">tags</span>
<div class="viewcode-block" id="CmdSpawn.func"><a class="viewcode-back" href="../../../../api/evennia.commands.default.building.html#evennia.commands.default.building.CmdSpawn.func">[docs]</a> <span class="k">def</span> <span class="nf">func</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;Implements the spawner&quot;&quot;&quot;</span>
<span class="n">caller</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">caller</span>
<span class="n">noloc</span> <span class="o">=</span> <span class="s2">&quot;noloc&quot;</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">switches</span>
<span class="c1"># run the menu/olc</span>
<span class="k">if</span> <span class="p">(</span>
<span class="bp">self</span><span class="o">.</span><span class="n">cmdstring</span> <span class="o">==</span> <span class="s2">&quot;olc&quot;</span>
<span class="ow">or</span> <span class="s2">&quot;menu&quot;</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">switches</span>
<span class="ow">or</span> <span class="s2">&quot;olc&quot;</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">switches</span>
<span class="ow">or</span> <span class="s2">&quot;edit&quot;</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">switches</span>
<span class="p">):</span>
<span class="c1"># OLC menu mode</span>
<span class="n">prototype</span> <span class="o">=</span> <span class="kc">None</span>
<span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">lhs</span><span class="p">:</span>
<span class="n">prototype_key</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">lhs</span>
<span class="n">prototype</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_search_prototype</span><span class="p">(</span><span class="n">prototype_key</span><span class="p">)</span>
<span class="k">if</span> <span class="ow">not</span> <span class="n">prototype</span><span class="p">:</span>
<span class="k">return</span>
<span class="n">olc_menus</span><span class="o">.</span><span class="n">start_olc</span><span class="p">(</span><span class="n">caller</span><span class="p">,</span> <span class="n">session</span><span class="o">=</span><span class="bp">self</span><span class="o">.</span><span class="n">session</span><span class="p">,</span> <span class="n">prototype</span><span class="o">=</span><span class="n">prototype</span><span class="p">)</span>
<span class="k">return</span>
<span class="k">if</span> <span class="s2">&quot;search&quot;</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">switches</span><span class="p">:</span>
<span class="c1"># query for a key match. The arg is a search query or nothing.</span>
<span class="k">if</span> <span class="ow">not</span> <span class="bp">self</span><span class="o">.</span><span class="n">args</span><span class="p">:</span>
<span class="c1"># an empty search returns the full list</span>
<span class="bp">self</span><span class="o">.</span><span class="n">_list_prototypes</span><span class="p">()</span>
<span class="k">return</span>
<span class="c1"># search for key;tag combinations</span>
<span class="n">key</span><span class="p">,</span> <span class="n">_</span><span class="p">,</span> <span class="n">tags</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_parse_key_desc_tags</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">args</span><span class="p">,</span> <span class="n">desc</span><span class="o">=</span><span class="kc">False</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">_list_prototypes</span><span class="p">(</span><span class="n">key</span><span class="p">,</span> <span class="n">tags</span><span class="p">)</span>
<span class="k">return</span>
<span class="k">if</span> <span class="s2">&quot;raw&quot;</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">switches</span><span class="p">:</span>
<span class="c1"># query for key match and return the prototype as a safe one-liner string.</span>
<span class="k">if</span> <span class="ow">not</span> <span class="bp">self</span><span class="o">.</span><span class="n">args</span><span class="p">:</span>
<span class="n">caller</span><span class="o">.</span><span class="n">msg</span><span class="p">(</span><span class="s2">&quot;You need to specify a prototype-key to get the raw data for.&quot;</span><span class="p">)</span>
<span class="n">prototype</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_search_prototype</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">args</span><span class="p">)</span>
<span class="k">if</span> <span class="ow">not</span> <span class="n">prototype</span><span class="p">:</span>
<span class="k">return</span>
<span class="n">caller</span><span class="o">.</span><span class="n">msg</span><span class="p">(</span><span class="nb">str</span><span class="p">(</span><span class="n">prototype</span><span class="p">))</span>
<span class="k">return</span>
<span class="k">if</span> <span class="s2">&quot;show&quot;</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">switches</span> <span class="ow">or</span> <span class="s2">&quot;examine&quot;</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">switches</span><span class="p">:</span>
<span class="c1"># show a specific prot detail. The argument is a search query or empty.</span>
<span class="k">if</span> <span class="ow">not</span> <span class="bp">self</span><span class="o">.</span><span class="n">args</span><span class="p">:</span>
<span class="c1"># we don&#39;t show the list of all details, that&#39;s too spammy.</span>
<span class="n">caller</span><span class="o">.</span><span class="n">msg</span><span class="p">(</span><span class="s2">&quot;You need to specify a prototype-key to show.&quot;</span><span class="p">)</span>
<span class="k">return</span>
<span class="n">detail_string</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_get_prototype_detail</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">args</span><span class="p">)</span>
<span class="k">if</span> <span class="ow">not</span> <span class="n">detail_string</span><span class="p">:</span>
<span class="k">return</span>
<span class="n">caller</span><span class="o">.</span><span class="n">msg</span><span class="p">(</span><span class="n">detail_string</span><span class="p">)</span>
<span class="k">return</span>
<span class="k">if</span> <span class="s2">&quot;list&quot;</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">switches</span><span class="p">:</span>
<span class="c1"># for list, all optional arguments are tags.</span>
<span class="n">tags</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">lhslist</span>
<span class="n">err</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_list_prototypes</span><span class="p">(</span><span class="n">tags</span><span class="o">=</span><span class="n">tags</span><span class="p">)</span>
<span class="k">if</span> <span class="n">err</span><span class="p">:</span>
<span class="n">caller</span><span class="o">.</span><span class="n">msg</span><span class="p">(</span>
<span class="s2">&quot;No prototypes found with prototype-tag(s): </span><span class="si">{}</span><span class="s2">&quot;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span>
<span class="n">list_to_string</span><span class="p">(</span><span class="n">tags</span><span class="p">,</span> <span class="s2">&quot;or&quot;</span><span class="p">)</span>
<span class="p">)</span>
<span class="p">)</span>
<span class="k">return</span>
<span class="k">if</span> <span class="s2">&quot;save&quot;</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">switches</span><span class="p">:</span>
<span class="c1"># store a prototype to the database store</span>
<span class="k">if</span> <span class="ow">not</span> <span class="bp">self</span><span class="o">.</span><span class="n">args</span><span class="p">:</span>
<span class="n">caller</span><span class="o">.</span><span class="n">msg</span><span class="p">(</span>
<span class="s2">&quot;Usage: spawn/save [&lt;key&gt;[;desc[;tag,tag[,...][;lockstring]]]] = &lt;prototype_dict&gt;&quot;</span>
<span class="p">)</span>
<span class="k">return</span>
<span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">rhs</span><span class="p">:</span>
<span class="c1"># input on the form key = prototype</span>
<span class="n">prototype_key</span><span class="p">,</span> <span class="n">prototype_desc</span><span class="p">,</span> <span class="n">prototype_tags</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_parse_key_desc_tags</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">lhs</span><span class="p">)</span>
<span class="n">prototype_key</span> <span class="o">=</span> <span class="kc">None</span> <span class="k">if</span> <span class="ow">not</span> <span class="n">prototype_key</span> <span class="k">else</span> <span class="n">prototype_key</span>
<span class="n">prototype_desc</span> <span class="o">=</span> <span class="kc">None</span> <span class="k">if</span> <span class="ow">not</span> <span class="n">prototype_desc</span> <span class="k">else</span> <span class="n">prototype_desc</span>
<span class="n">prototype_tags</span> <span class="o">=</span> <span class="kc">None</span> <span class="k">if</span> <span class="ow">not</span> <span class="n">prototype_tags</span> <span class="k">else</span> <span class="n">prototype_tags</span>
<span class="n">prototype_input</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">rhs</span><span class="o">.</span><span class="n">strip</span><span class="p">()</span>
<span class="k">else</span><span class="p">:</span>
<span class="n">prototype_key</span> <span class="o">=</span> <span class="n">prototype_desc</span> <span class="o">=</span> <span class="kc">None</span>
<span class="n">prototype_tags</span> <span class="o">=</span> <span class="kc">None</span>
<span class="n">prototype_input</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">lhs</span><span class="o">.</span><span class="n">strip</span><span class="p">()</span>
<span class="c1"># handle parsing</span>
<span class="n">prototype</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_parse_prototype</span><span class="p">(</span><span class="n">prototype_input</span><span class="p">)</span>
<span class="k">if</span> <span class="ow">not</span> <span class="n">prototype</span><span class="p">:</span>
<span class="k">return</span>
<span class="n">prot_prototype_key</span> <span class="o">=</span> <span class="n">prototype</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s2">&quot;prototype_key&quot;</span><span class="p">)</span>
<span class="k">if</span> <span class="ow">not</span> <span class="p">(</span><span class="n">prototype_key</span> <span class="ow">or</span> <span class="n">prot_prototype_key</span><span class="p">):</span>
<span class="n">caller</span><span class="o">.</span><span class="n">msg</span><span class="p">(</span>
<span class="s2">&quot;A prototype_key must be given, either as `prototype_key = &lt;prototype&gt;` &quot;</span>
<span class="s2">&quot;or as a key &#39;prototype_key&#39; inside the prototype structure.&quot;</span>
<span class="p">)</span>
<span class="k">return</span>
<span class="k">if</span> <span class="n">prototype_key</span> <span class="ow">is</span> <span class="kc">None</span><span class="p">:</span>
<span class="n">prototype_key</span> <span class="o">=</span> <span class="n">prot_prototype_key</span>
<span class="k">if</span> <span class="n">prot_prototype_key</span> <span class="o">!=</span> <span class="n">prototype_key</span><span class="p">:</span>
<span class="n">caller</span><span class="o">.</span><span class="n">msg</span><span class="p">(</span><span class="s2">&quot;(Replacing `prototype_key` in prototype with given key.)&quot;</span><span class="p">)</span>
<span class="n">prototype</span><span class="p">[</span><span class="s2">&quot;prototype_key&quot;</span><span class="p">]</span> <span class="o">=</span> <span class="n">prototype_key</span>
<span class="k">if</span> <span class="n">prototype_desc</span> <span class="ow">is</span> <span class="ow">not</span> <span class="kc">None</span> <span class="ow">and</span> <span class="n">prot_prototype_key</span> <span class="o">!=</span> <span class="n">prototype_desc</span><span class="p">:</span>
<span class="n">caller</span><span class="o">.</span><span class="n">msg</span><span class="p">(</span><span class="s2">&quot;(Replacing `prototype_desc` in prototype with given desc.)&quot;</span><span class="p">)</span>
<span class="n">prototype</span><span class="p">[</span><span class="s2">&quot;prototype_desc&quot;</span><span class="p">]</span> <span class="o">=</span> <span class="n">prototype_desc</span>
<span class="k">if</span> <span class="n">prototype_tags</span> <span class="ow">is</span> <span class="ow">not</span> <span class="kc">None</span> <span class="ow">and</span> <span class="n">prototype</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s2">&quot;prototype_tags&quot;</span><span class="p">)</span> <span class="o">!=</span> <span class="n">prototype_tags</span><span class="p">:</span>
<span class="n">caller</span><span class="o">.</span><span class="n">msg</span><span class="p">(</span><span class="s2">&quot;(Replacing `prototype_tags` in prototype with given tag(s))&quot;</span><span class="p">)</span>
<span class="n">prototype</span><span class="p">[</span><span class="s2">&quot;prototype_tags&quot;</span><span class="p">]</span> <span class="o">=</span> <span class="n">prototype_tags</span>
<span class="n">string</span> <span class="o">=</span> <span class="s2">&quot;&quot;</span>
<span class="c1"># check for existing prototype (exact match)</span>
<span class="n">old_prototype</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_search_prototype</span><span class="p">(</span><span class="n">prototype_key</span><span class="p">,</span> <span class="n">quiet</span><span class="o">=</span><span class="kc">True</span><span class="p">)</span>
<span class="n">diff</span> <span class="o">=</span> <span class="n">spawner</span><span class="o">.</span><span class="n">prototype_diff</span><span class="p">(</span><span class="n">old_prototype</span><span class="p">,</span> <span class="n">prototype</span><span class="p">,</span> <span class="n">homogenize</span><span class="o">=</span><span class="kc">True</span><span class="p">)</span>
<span class="n">diffstr</span> <span class="o">=</span> <span class="n">spawner</span><span class="o">.</span><span class="n">format_diff</span><span class="p">(</span><span class="n">diff</span><span class="p">)</span>
<span class="n">new_prototype_detail</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_get_prototype_detail</span><span class="p">(</span><span class="n">prototypes</span><span class="o">=</span><span class="p">[</span><span class="n">prototype</span><span class="p">])</span>
<span class="k">if</span> <span class="n">old_prototype</span><span class="p">:</span>
<span class="k">if</span> <span class="ow">not</span> <span class="n">diffstr</span><span class="p">:</span>
<span class="n">string</span> <span class="o">=</span> <span class="n">f</span><span class="s2">&quot;|yAlready existing Prototype:|n</span><span class="se">\n</span><span class="si">{new_prototype_detail}</span><span class="se">\n</span><span class="s2">&quot;</span>
<span class="n">question</span> <span class="o">=</span> <span class="p">(</span>
<span class="s2">&quot;</span><span class="se">\n</span><span class="s2">There seems to be no changes. Do you still want to (re)save? [Y]/N&quot;</span>
<span class="p">)</span>
<span class="k">else</span><span class="p">:</span>
<span class="n">string</span> <span class="o">=</span> <span class="p">(</span>
<span class="n">f</span><span class="s1">&#39;|yExisting prototype &quot;</span><span class="si">{prototype_key}</span><span class="s1">&quot; found. Change:|n</span><span class="se">\n</span><span class="si">{diffstr}</span><span class="se">\n</span><span class="s1">&#39;</span>
<span class="n">f</span><span class="s2">&quot;|yNew changed prototype:|n</span><span class="se">\n</span><span class="si">{new_prototype_detail}</span><span class="s2">&quot;</span>
<span class="p">)</span>
<span class="n">question</span> <span class="o">=</span> <span class="p">(</span>
<span class="s2">&quot;</span><span class="se">\n</span><span class="s2">|yDo you want to apply the change to the existing prototype?|n [Y]/N&quot;</span>
<span class="p">)</span>
<span class="k">else</span><span class="p">:</span>
<span class="n">string</span> <span class="o">=</span> <span class="n">f</span><span class="s2">&quot;|yCreating new prototype:|n</span><span class="se">\n</span><span class="si">{new_prototype_detail}</span><span class="s2">&quot;</span>
<span class="n">question</span> <span class="o">=</span> <span class="s2">&quot;</span><span class="se">\n</span><span class="s2">Do you want to continue saving? [Y]/N&quot;</span>
<span class="n">answer</span> <span class="o">=</span> <span class="k">yield</span> <span class="p">(</span><span class="n">string</span> <span class="o">+</span> <span class="n">question</span><span class="p">)</span>
<span class="k">if</span> <span class="n">answer</span><span class="o">.</span><span class="n">lower</span><span class="p">()</span> <span class="ow">in</span> <span class="p">[</span><span class="s2">&quot;n&quot;</span><span class="p">,</span> <span class="s2">&quot;no&quot;</span><span class="p">]:</span>
<span class="n">caller</span><span class="o">.</span><span class="n">msg</span><span class="p">(</span><span class="s2">&quot;|rSave cancelled.|n&quot;</span><span class="p">)</span>
<span class="k">return</span>
<span class="c1"># all seems ok. Try to save.</span>
<span class="k">try</span><span class="p">:</span>
<span class="n">prot</span> <span class="o">=</span> <span class="n">protlib</span><span class="o">.</span><span class="n">save_prototype</span><span class="p">(</span><span class="n">prototype</span><span class="p">)</span>
<span class="k">if</span> <span class="ow">not</span> <span class="n">prot</span><span class="p">:</span>
<span class="n">caller</span><span class="o">.</span><span class="n">msg</span><span class="p">(</span><span class="s2">&quot;|rError saving:|R </span><span class="si">{}</span><span class="s2">.|n&quot;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">prototype_key</span><span class="p">))</span>
<span class="k">return</span>
<span class="k">except</span> <span class="n">protlib</span><span class="o">.</span><span class="n">PermissionError</span> <span class="k">as</span> <span class="n">err</span><span class="p">:</span>
<span class="n">caller</span><span class="o">.</span><span class="n">msg</span><span class="p">(</span><span class="s2">&quot;|rError saving:|R </span><span class="si">{}</span><span class="s2">|n&quot;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">err</span><span class="p">))</span>
<span class="k">return</span>
<span class="n">caller</span><span class="o">.</span><span class="n">msg</span><span class="p">(</span><span class="s2">&quot;|gSaved prototype:|n </span><span class="si">{}</span><span class="s2">&quot;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">prototype_key</span><span class="p">))</span>
<span class="c1"># check if we want to update existing objects</span>
<span class="bp">self</span><span class="o">.</span><span class="n">_update_existing_objects</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">caller</span><span class="p">,</span> <span class="n">prototype_key</span><span class="p">,</span> <span class="n">quiet</span><span class="o">=</span><span class="kc">True</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">args</span><span class="p">:</span>
<span class="c1"># all switches beyond this point gets a common non-arg return</span>
<span class="n">ncount</span> <span class="o">=</span> <span class="nb">len</span><span class="p">(</span><span class="n">protlib</span><span class="o">.</span><span class="n">search_prototype</span><span class="p">())</span>
<span class="n">caller</span><span class="o">.</span><span class="n">msg</span><span class="p">(</span>
<span class="s2">&quot;Usage: spawn &lt;prototype-key&gt; or {{key: value, ...}}&quot;</span>
<span class="n">f</span><span class="s2">&quot;</span><span class="se">\n</span><span class="s2"> (</span><span class="si">{ncount}</span><span class="s2"> existing prototypes. Use /list to inspect)&quot;</span>
<span class="p">)</span>
<span class="k">return</span>
<span class="k">if</span> <span class="s2">&quot;delete&quot;</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">switches</span><span class="p">:</span>
<span class="c1"># remove db-based prototype</span>
<span class="n">prototype_detail</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_get_prototype_detail</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">args</span><span class="p">)</span>
<span class="k">if</span> <span class="ow">not</span> <span class="n">prototype_detail</span><span class="p">:</span>
<span class="k">return</span>
<span class="n">string</span> <span class="o">=</span> <span class="n">f</span><span class="s2">&quot;|rDeleting prototype:|n</span><span class="se">\n</span><span class="si">{prototype_detail}</span><span class="s2">&quot;</span>
<span class="n">question</span> <span class="o">=</span> <span class="s2">&quot;</span><span class="se">\n</span><span class="s2">Do you want to continue deleting? [Y]/N&quot;</span>
<span class="n">answer</span> <span class="o">=</span> <span class="k">yield</span> <span class="p">(</span><span class="n">string</span> <span class="o">+</span> <span class="n">question</span><span class="p">)</span>
<span class="k">if</span> <span class="n">answer</span><span class="o">.</span><span class="n">lower</span><span class="p">()</span> <span class="ow">in</span> <span class="p">[</span><span class="s2">&quot;n&quot;</span><span class="p">,</span> <span class="s2">&quot;no&quot;</span><span class="p">]:</span>
<span class="n">caller</span><span class="o">.</span><span class="n">msg</span><span class="p">(</span><span class="s2">&quot;|rDeletion cancelled.|n&quot;</span><span class="p">)</span>
<span class="k">return</span>
<span class="k">try</span><span class="p">:</span>
<span class="n">success</span> <span class="o">=</span> <span class="n">protlib</span><span class="o">.</span><span class="n">delete_prototype</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">args</span><span class="p">)</span>
<span class="k">except</span> <span class="n">protlib</span><span class="o">.</span><span class="n">PermissionError</span> <span class="k">as</span> <span class="n">err</span><span class="p">:</span>
<span class="n">retmsg</span> <span class="o">=</span> <span class="n">f</span><span class="s2">&quot;|rError deleting:|R </span><span class="si">{err}</span><span class="s2">|n&quot;</span>
<span class="k">else</span><span class="p">:</span>
<span class="n">retmsg</span> <span class="o">=</span> <span class="p">(</span>
<span class="s2">&quot;Deletion successful&quot;</span>
<span class="k">if</span> <span class="n">success</span>
<span class="k">else</span> <span class="s2">&quot;Deletion failed (does the prototype exist?)&quot;</span>
<span class="p">)</span>
<span class="n">caller</span><span class="o">.</span><span class="n">msg</span><span class="p">(</span><span class="n">retmsg</span><span class="p">)</span>
<span class="k">return</span>
<span class="k">if</span> <span class="s2">&quot;update&quot;</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">switches</span><span class="p">:</span>
<span class="c1"># update existing prototypes</span>
<span class="n">prototype_key</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">args</span><span class="o">.</span><span class="n">strip</span><span class="p">()</span><span class="o">.</span><span class="n">lower</span><span class="p">()</span>
<span class="bp">self</span><span class="o">.</span><span class="n">_update_existing_objects</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">caller</span><span class="p">,</span> <span class="n">prototype_key</span><span class="p">)</span>
<span class="k">return</span>
<span class="c1"># If we get to this point, we use not switches but are trying a</span>
<span class="c1"># direct creation of an object from a given prototype or -key</span>
<span class="n">prototype</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_parse_prototype</span><span class="p">(</span>
<span class="bp">self</span><span class="o">.</span><span class="n">args</span><span class="p">,</span> <span class="n">expect</span><span class="o">=</span><span class="nb">dict</span> <span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">args</span><span class="o">.</span><span class="n">strip</span><span class="p">()</span><span class="o">.</span><span class="n">startswith</span><span class="p">(</span><span class="s2">&quot;{&quot;</span><span class="p">)</span> <span class="k">else</span> <span class="nb">str</span>
<span class="p">)</span>
<span class="k">if</span> <span class="ow">not</span> <span class="n">prototype</span><span class="p">:</span>
<span class="c1"># this will only let through dicts or strings</span>
<span class="k">return</span>
<span class="n">key</span> <span class="o">=</span> <span class="s2">&quot;&lt;unnamed&gt;&quot;</span>
<span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">prototype</span><span class="p">,</span> <span class="nb">str</span><span class="p">):</span>
<span class="c1"># A prototype key we are looking to apply</span>
<span class="n">prototype_key</span> <span class="o">=</span> <span class="n">prototype</span>
<span class="n">prototype</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_search_prototype</span><span class="p">(</span><span class="n">prototype_key</span><span class="p">)</span>
<span class="k">if</span> <span class="ow">not</span> <span class="n">prototype</span><span class="p">:</span>
<span class="k">return</span>
<span class="c1"># proceed to spawning</span>
<span class="k">try</span><span class="p">:</span>
<span class="k">for</span> <span class="n">obj</span> <span class="ow">in</span> <span class="n">spawner</span><span class="o">.</span><span class="n">spawn</span><span class="p">(</span><span class="n">prototype</span><span class="p">):</span>
<span class="bp">self</span><span class="o">.</span><span class="n">caller</span><span class="o">.</span><span class="n">msg</span><span class="p">(</span><span class="s2">&quot;Spawned </span><span class="si">%s</span><span class="s2">.&quot;</span> <span class="o">%</span> <span class="n">obj</span><span class="o">.</span><span class="n">get_display_name</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">caller</span><span class="p">))</span>
<span class="k">if</span> <span class="ow">not</span> <span class="n">prototype</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s2">&quot;location&quot;</span><span class="p">)</span> <span class="ow">and</span> <span class="ow">not</span> <span class="n">noloc</span><span class="p">:</span>
<span class="c1"># we don&#39;t hardcode the location in the prototype (unless the user</span>
<span class="c1"># did so manually) - that would lead to it having to be &#39;removed&#39; every</span>
<span class="c1"># time we try to update objects with this prototype in the future.</span>
<span class="n">obj</span><span class="o">.</span><span class="n">location</span> <span class="o">=</span> <span class="n">caller</span><span class="o">.</span><span class="n">location</span>
<span class="k">except</span> <span class="ne">RuntimeError</span> <span class="k">as</span> <span class="n">err</span><span class="p">:</span>
<span class="n">caller</span><span class="o">.</span><span class="n">msg</span><span class="p">(</span><span class="n">err</span><span class="p">)</span></div></div>
</pre></div>
<div class="clearer"></div>
</div>
</div>
</div>
<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>Versions</h3>
<ul>
<li><a href="building.html">1.0-dev (develop branch)</a></li>
<li><a href="../../../../../0.9.5/index.html">0.9.5 (master branch)</a></li>
</ul>
</div>
</div>
<div class="clearer"></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 1.0-dev</a> &#187;</li>
<li class="nav-item nav-item-1"><a href="../../../index.html" >Module code</a> &#187;</li>
<li class="nav-item nav-item-2"><a href="../../../evennia.html" >evennia</a> &#187;</li>
<li class="nav-item nav-item-this"><a href="">evennia.commands.default.building</a></li>
</ul>
<div class="develop">develop branch</div>
</div>
<div class="footer" role="contentinfo">
&#169; Copyright 2020, The Evennia developer community.
Created using <a href="https://www.sphinx-doc.org/">Sphinx</a> 3.2.1.
</div>
</body>
</html>