Updated HTML docs

This commit is contained in:
Griatch 2020-07-31 18:18:01 +02:00
parent 781788f2e5
commit 76bce04295
170 changed files with 6650 additions and 1911 deletions

View file

@ -1,4 +1,4 @@
# Sphinx build info version 1
# This file hashes the configuration used when building these files. When it is not found, a full rebuild will be done.
config: cf3619ac3ad9acf90f2a5d3e90e572c5
config: 9b2ff8faebec5aef9393bdaae11cef51
tags: 645f666f9bcd5a90fca523b33c5a78b7

View file

@ -490,13 +490,17 @@
<span class="c1"># Stopped at breakpoint. Press &#39;n&#39; to continue into the code.</span>
<span class="n">dbg</span><span class="o">.</span><span class="n">set_trace</span><span class="p">()</span></div>
<span class="c1"># initialize the doc string</span>
<span class="k">global</span> <span class="vm">__doc__</span>
<span class="vm">__doc__</span> <span class="o">=</span> <span class="n">DOCSTRING</span><span class="o">.</span><span class="n">format</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="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;evennia.</span><span class="si">{key}</span><span class="s2">&quot;</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="nb">globals</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;_&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="p">(</span><span class="s2">&quot;DOCSTRING&quot;</span><span class="p">,</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="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;evennia.</span><span class="si">{key}</span><span class="s2">&quot;</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="nb">globals</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;_&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="p">(</span><span class="s2">&quot;DOCSTRING&quot;</span><span class="p">,)</span>
<span class="p">)</span>
<span class="p">)</span>
</pre></div>
<div class="clearer"></div>

View file

@ -692,6 +692,53 @@
<span class="n">logger</span><span class="o">.</span><span class="n">log_sec</span><span class="p">(</span><span class="n">f</span><span class="s2">&quot;Password successfully changed for </span><span class="si">{self}</span><span class="s2">.&quot;</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">at_password_change</span><span class="p">()</span></div>
<div class="viewcode-block" id="DefaultAccount.create_character"><a class="viewcode-back" href="../../../api/evennia.accounts.accounts.html#evennia.accounts.accounts.DefaultAccount.create_character">[docs]</a> <span class="k">def</span> <span class="nf">create_character</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="o">*</span><span class="n">args</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> Create a character linked to this account.</span>
<span class="sd"> Args:</span>
<span class="sd"> key (str, optional): If not given, use the same name as the account.</span>
<span class="sd"> typeclass (str, optional): Typeclass to use for this character. If</span>
<span class="sd"> not given, use settings.BASE_CHARACTER_TYPECLASS.</span>
<span class="sd"> permissions (list, optional): If not given, use the account&#39;s permissions.</span>
<span class="sd"> ip (str, optiona): The client IP creating this character. Will fall back to the</span>
<span class="sd"> one stored for the account if not given.</span>
<span class="sd"> kwargs (any): Other kwargs will be used in the create_call.</span>
<span class="sd"> Returns:</span>
<span class="sd"> Object: A new character of the `character_typeclass` type. None on an error.</span>
<span class="sd"> list or None: A list of errors, or None.</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="c1"># parse inputs</span>
<span class="n">character_key</span> <span class="o">=</span> <span class="n">kwargs</span><span class="o">.</span><span class="n">pop</span><span class="p">(</span><span class="s2">&quot;key&quot;</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">key</span><span class="p">)</span>
<span class="n">character_ip</span> <span class="o">=</span> <span class="n">kwargs</span><span class="o">.</span><span class="n">pop</span><span class="p">(</span><span class="s2">&quot;ip&quot;</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">db</span><span class="o">.</span><span class="n">creator_ip</span><span class="p">)</span>
<span class="n">character_permissions</span> <span class="o">=</span> <span class="n">kwargs</span><span class="o">.</span><span class="n">pop</span><span class="p">(</span><span class="s2">&quot;permissions&quot;</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">permissions</span><span class="p">)</span>
<span class="c1"># Load the appropriate Character class</span>
<span class="n">character_typeclass</span> <span class="o">=</span> <span class="n">kwargs</span><span class="o">.</span><span class="n">pop</span><span class="p">(</span><span class="s2">&quot;typeclass&quot;</span><span class="p">,</span> <span class="kc">None</span><span class="p">)</span>
<span class="n">character_typeclass</span> <span class="o">=</span> <span class="p">(</span>
<span class="n">character_typeclass</span> <span class="k">if</span> <span class="n">character_typeclass</span> <span class="k">else</span> <span class="n">settings</span><span class="o">.</span><span class="n">BASE_CHARACTER_TYPECLASS</span>
<span class="p">)</span>
<span class="n">Character</span> <span class="o">=</span> <span class="n">class_from_module</span><span class="p">(</span><span class="n">character_typeclass</span><span class="p">)</span>
<span class="c1"># Create the character</span>
<span class="n">character</span><span class="p">,</span> <span class="n">errs</span> <span class="o">=</span> <span class="n">Character</span><span class="o">.</span><span class="n">create</span><span class="p">(</span>
<span class="n">character_key</span><span class="p">,</span>
<span class="bp">self</span><span class="p">,</span>
<span class="n">ip</span><span class="o">=</span><span class="n">character_ip</span><span class="p">,</span>
<span class="n">typeclass</span><span class="o">=</span><span class="n">character_typeclass</span><span class="p">,</span>
<span class="n">permissions</span><span class="o">=</span><span class="n">character_permissions</span><span class="p">,</span>
<span class="o">**</span><span class="n">kwargs</span><span class="p">,</span>
<span class="p">)</span>
<span class="k">if</span> <span class="n">character</span><span class="p">:</span>
<span class="c1"># Update playable character list</span>
<span class="k">if</span> <span class="n">character</span> <span class="ow">not</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">characters</span><span class="p">:</span>
<span class="bp">self</span><span class="o">.</span><span class="n">db</span><span class="o">.</span><span class="n">_playable_characters</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">character</span><span class="p">)</span>
<span class="c1"># We need to set this to have @ic auto-connect to this character</span>
<span class="bp">self</span><span class="o">.</span><span class="n">db</span><span class="o">.</span><span class="n">_last_puppet</span> <span class="o">=</span> <span class="n">character</span>
<span class="k">return</span> <span class="n">character</span><span class="p">,</span> <span class="n">errs</span></div>
<div class="viewcode-block" id="DefaultAccount.create"><a class="viewcode-back" href="../../../api/evennia.accounts.accounts.html#evennia.accounts.accounts.DefaultAccount.create">[docs]</a> <span class="nd">@classmethod</span>
<span class="k">def</span> <span class="nf">create</span><span class="p">(</span><span class="bp">cls</span><span class="p">,</span> <span class="o">*</span><span class="n">args</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;</span>
@ -800,31 +847,13 @@
<span class="n">logger</span><span class="o">.</span><span class="n">log_err</span><span class="p">(</span><span class="n">string</span><span class="p">)</span>
<span class="k">if</span> <span class="n">account</span> <span class="ow">and</span> <span class="n">settings</span><span class="o">.</span><span class="n">MULTISESSION_MODE</span> <span class="o">&lt;</span> <span class="mi">2</span><span class="p">:</span>
<span class="c1"># Load the appropriate Character class</span>
<span class="n">character_typeclass</span> <span class="o">=</span> <span class="n">kwargs</span><span class="o">.</span><span class="n">get</span><span class="p">(</span>
<span class="s2">&quot;character_typeclass&quot;</span><span class="p">,</span> <span class="n">settings</span><span class="o">.</span><span class="n">BASE_CHARACTER_TYPECLASS</span>
<span class="c1"># Auto-create a character to go with this account</span>
<span class="n">character</span><span class="p">,</span> <span class="n">errs</span> <span class="o">=</span> <span class="n">account</span><span class="o">.</span><span class="n">create_character</span><span class="p">(</span>
<span class="n">typeclass</span><span class="o">=</span><span class="n">kwargs</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s2">&quot;character_typeclass&quot;</span><span class="p">)</span>
<span class="p">)</span>
<span class="n">character_home</span> <span class="o">=</span> <span class="n">kwargs</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s2">&quot;home&quot;</span><span class="p">)</span>
<span class="n">Character</span> <span class="o">=</span> <span class="n">class_from_module</span><span class="p">(</span><span class="n">character_typeclass</span><span class="p">)</span>
<span class="c1"># Create the character</span>
<span class="n">character</span><span class="p">,</span> <span class="n">errs</span> <span class="o">=</span> <span class="n">Character</span><span class="o">.</span><span class="n">create</span><span class="p">(</span>
<span class="n">account</span><span class="o">.</span><span class="n">key</span><span class="p">,</span>
<span class="n">account</span><span class="p">,</span>
<span class="n">ip</span><span class="o">=</span><span class="n">ip</span><span class="p">,</span>
<span class="n">typeclass</span><span class="o">=</span><span class="n">character_typeclass</span><span class="p">,</span>
<span class="n">permissions</span><span class="o">=</span><span class="n">permissions</span><span class="p">,</span>
<span class="n">home</span><span class="o">=</span><span class="n">character_home</span><span class="p">,</span>
<span class="p">)</span>
<span class="n">errors</span><span class="o">.</span><span class="n">extend</span><span class="p">(</span><span class="n">errs</span><span class="p">)</span>
<span class="k">if</span> <span class="n">character</span><span class="p">:</span>
<span class="c1"># Update playable character list</span>
<span class="k">if</span> <span class="n">character</span> <span class="ow">not</span> <span class="ow">in</span> <span class="n">account</span><span class="o">.</span><span class="n">characters</span><span class="p">:</span>
<span class="n">account</span><span class="o">.</span><span class="n">db</span><span class="o">.</span><span class="n">_playable_characters</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">character</span><span class="p">)</span>
<span class="c1"># We need to set this to have @ic auto-connect to this character</span>
<span class="n">account</span><span class="o">.</span><span class="n">db</span><span class="o">.</span><span class="n">_last_puppet</span> <span class="o">=</span> <span class="n">character</span>
<span class="k">if</span> <span class="n">errs</span><span class="p">:</span>
<span class="n">errors</span><span class="o">.</span><span class="n">extend</span><span class="p">(</span><span class="n">errs</span><span class="p">)</span>
<span class="k">except</span> <span class="ne">Exception</span><span class="p">:</span>
<span class="c1"># We are in the middle between logged in and -not, so we have</span>
@ -961,6 +990,7 @@
<span class="n">nofound_string</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span>
<span class="n">multimatch_string</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span>
<span class="n">use_nicks</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">False</span><span class="p">,</span>
<span class="o">**</span><span class="n">kwargs</span><span class="p">,</span>
<span class="p">):</span>
<span class="sd">&quot;&quot;&quot;</span>
@ -987,9 +1017,13 @@
<span class="sd"> message to echo if `searchdata` leads to multiple matches.</span>
<span class="sd"> If not given, will fall back to the default handler.</span>
<span class="sd"> use_nicks (bool, optional): Use account-level nick replacement.</span>
<span class="sd"> quiet (bool, optional): If set, will not show any error to the user,</span>
<span class="sd"> and will also lead to returning a list of matches.</span>
<span class="sd"> Return:</span>
<span class="sd"> match (Account, Object or None): A single Account or Object match.</span>
<span class="sd"> list: If `quiet=True` this is a list of 0, 1 or more Account or Object matches.</span>
<span class="sd"> Notes:</span>
<span class="sd"> Extra keywords are ignored, but are allowed in call in</span>
<span class="sd"> order to make API more consistent with</span>
@ -1001,28 +1035,31 @@
<span class="c1"># handle wrapping of common terms</span>
<span class="k">if</span> <span class="n">searchdata</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;me&quot;</span><span class="p">,</span> <span class="s2">&quot;*me&quot;</span><span class="p">,</span> <span class="s2">&quot;self&quot;</span><span class="p">,</span> <span class="s2">&quot;*self&quot;</span><span class="p">):</span>
<span class="k">return</span> <span class="bp">self</span>
<span class="k">if</span> <span class="n">search_object</span><span class="p">:</span>
<span class="n">matches</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">object_search</span><span class="p">(</span>
<span class="n">searchdata</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="n">use_nicks</span><span class="o">=</span><span class="n">use_nicks</span>
<span class="p">)</span>
<span class="k">else</span><span class="p">:</span>
<span class="n">searchdata</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">nicks</span><span class="o">.</span><span class="n">nickreplace</span><span class="p">(</span>
<span class="n">searchdata</span><span class="p">,</span> <span class="n">categories</span><span class="o">=</span><span class="p">(</span><span class="s2">&quot;account&quot;</span><span class="p">,),</span> <span class="n">include_account</span><span class="o">=</span><span class="kc">False</span>
<span class="p">)</span>
<span class="n">matches</span> <span class="o">=</span> <span class="n">AccountDB</span><span class="o">.</span><span class="n">objects</span><span class="o">.</span><span class="n">account_search</span><span class="p">(</span><span class="n">searchdata</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="n">matches</span> <span class="o">=</span> <span class="n">_AT_SEARCH_RESULT</span><span class="p">(</span>
<span class="n">matches</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="n">searchdata</span><span class="p">,</span>
<span class="n">nofound_string</span><span class="o">=</span><span class="n">nofound_string</span><span class="p">,</span>
<span class="n">multimatch_string</span><span class="o">=</span><span class="n">multimatch_string</span><span class="p">,</span>
<span class="n">searchdata</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">nicks</span><span class="o">.</span><span class="n">nickreplace</span><span class="p">(</span>
<span class="n">searchdata</span><span class="p">,</span> <span class="n">categories</span><span class="o">=</span><span class="p">(</span><span class="s2">&quot;account&quot;</span><span class="p">,),</span> <span class="n">include_account</span><span class="o">=</span><span class="kc">False</span>
<span class="p">)</span>
<span class="k">if</span> <span class="n">matches</span> <span class="ow">and</span> <span class="n">return_puppet</span><span class="p">:</span>
<span class="k">try</span><span class="p">:</span>
<span class="k">return</span> <span class="n">matches</span><span class="o">.</span><span class="n">puppet</span>
<span class="k">except</span> <span class="ne">AttributeError</span><span class="p">:</span>
<span class="k">return</span> <span class="kc">None</span>
<span class="k">if</span> <span class="n">search_object</span><span class="p">:</span>
<span class="n">matches</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">object_search</span><span class="p">(</span><span class="n">searchdata</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">else</span><span class="p">:</span>
<span class="n">matches</span> <span class="o">=</span> <span class="n">AccountDB</span><span class="o">.</span><span class="n">objects</span><span class="o">.</span><span class="n">account_search</span><span class="p">(</span><span class="n">searchdata</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">if</span> <span class="n">quiet</span><span class="p">:</span>
<span class="n">matches</span> <span class="o">=</span> <span class="nb">list</span><span class="p">(</span><span class="n">matches</span><span class="p">)</span>
<span class="k">if</span> <span class="n">return_puppet</span><span class="p">:</span>
<span class="n">matches</span> <span class="o">=</span> <span class="p">[</span><span class="n">match</span><span class="o">.</span><span class="n">puppet</span> <span class="k">for</span> <span class="n">match</span> <span class="ow">in</span> <span class="n">matches</span><span class="p">]</span>
<span class="k">else</span><span class="p">:</span>
<span class="n">matches</span> <span class="o">=</span> <span class="n">_AT_SEARCH_RESULT</span><span class="p">(</span>
<span class="n">matches</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="n">searchdata</span><span class="p">,</span>
<span class="n">nofound_string</span><span class="o">=</span><span class="n">nofound_string</span><span class="p">,</span>
<span class="n">multimatch_string</span><span class="o">=</span><span class="n">multimatch_string</span><span class="p">,</span>
<span class="p">)</span>
<span class="k">if</span> <span class="n">matches</span> <span class="ow">and</span> <span class="n">return_puppet</span><span class="p">:</span>
<span class="k">try</span><span class="p">:</span>
<span class="n">matches</span> <span class="o">=</span> <span class="n">matches</span><span class="o">.</span><span class="n">puppet</span>
<span class="k">except</span> <span class="ne">AttributeError</span><span class="p">:</span>
<span class="k">return</span> <span class="kc">None</span>
<span class="k">return</span> <span class="n">matches</span></div>
<div class="viewcode-block" id="DefaultAccount.access"><a class="viewcode-back" href="../../../api/evennia.accounts.accounts.html#evennia.accounts.accounts.DefaultAccount.access">[docs]</a> <span class="k">def</span> <span class="nf">access</span><span class="p">(</span>
@ -1589,7 +1626,7 @@
<span class="k">try</span><span class="p">:</span>
<span class="c1"># Find an available guest name.</span>
<span class="k">for</span> <span class="n">name</span> <span class="ow">in</span> <span class="n">settings</span><span class="o">.</span><span class="n">GUEST_LIST</span><span class="p">:</span>
<span class="k">if</span> <span class="ow">not</span> <span class="n">AccountDB</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">username__iexact</span><span class="o">=</span><span class="n">name</span><span class="p">)</span><span class="o">.</span><span class="n">count</span><span class="p">():</span>
<span class="k">if</span> <span class="ow">not</span> <span class="n">AccountDB</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">username__iexact</span><span class="o">=</span><span class="n">name</span><span class="p">)</span><span class="o">.</span><span class="n">exists</span><span class="p">():</span>
<span class="n">username</span> <span class="o">=</span> <span class="n">name</span>
<span class="k">break</span>
<span class="k">if</span> <span class="ow">not</span> <span class="n">username</span><span class="p">:</span>
@ -1615,6 +1652,15 @@
<span class="n">ip</span><span class="o">=</span><span class="n">ip</span><span class="p">,</span>
<span class="p">)</span>
<span class="n">errors</span><span class="o">.</span><span class="n">extend</span><span class="p">(</span><span class="n">errs</span><span class="p">)</span>
<span class="k">if</span> <span class="ow">not</span> <span class="n">account</span><span class="o">.</span><span class="n">characters</span><span class="p">:</span>
<span class="c1"># this can happen for multisession_mode &gt; 1. For guests we</span>
<span class="c1"># always auto-create a character, regardless of multi-session-mode.</span>
<span class="n">character</span><span class="p">,</span> <span class="n">errs</span> <span class="o">=</span> <span class="n">account</span><span class="o">.</span><span class="n">create_character</span><span class="p">()</span>
<span class="k">if</span> <span class="n">errs</span><span class="p">:</span>
<span class="n">errors</span><span class="o">.</span><span class="n">extend</span><span class="p">(</span><span class="n">errs</span><span class="p">)</span>
<span class="k">return</span> <span class="n">account</span><span class="p">,</span> <span class="n">errors</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>

View file

@ -45,13 +45,26 @@
<span class="c1">#</span>
<span class="kn">from</span> <span class="nn">django</span> <span class="k">import</span> <span class="n">forms</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.contrib</span> <span class="k">import</span> <span class="n">admin</span>
<span class="kn">from</span> <span class="nn">django.contrib</span> <span class="k">import</span> <span class="n">admin</span><span class="p">,</span> <span class="n">messages</span>
<span class="kn">from</span> <span class="nn">django.contrib.admin.options</span> <span class="k">import</span> <span class="n">IS_POPUP_VAR</span>
<span class="kn">from</span> <span class="nn">django.contrib.auth.admin</span> <span class="k">import</span> <span class="n">UserAdmin</span> <span class="k">as</span> <span class="n">BaseUserAdmin</span>
<span class="kn">from</span> <span class="nn">django.contrib.auth.forms</span> <span class="k">import</span> <span class="n">UserChangeForm</span><span class="p">,</span> <span class="n">UserCreationForm</span>
<span class="kn">from</span> <span class="nn">django.contrib.admin.utils</span> <span class="k">import</span> <span class="n">unquote</span>
<span class="kn">from</span> <span class="nn">django.template.response</span> <span class="k">import</span> <span class="n">TemplateResponse</span>
<span class="kn">from</span> <span class="nn">django.http</span> <span class="k">import</span> <span class="n">Http404</span><span class="p">,</span> <span class="n">HttpResponseRedirect</span>
<span class="kn">from</span> <span class="nn">django.core.exceptions</span> <span class="k">import</span> <span class="n">PermissionDenied</span>
<span class="kn">from</span> <span class="nn">django.views.decorators.debug</span> <span class="k">import</span> <span class="n">sensitive_post_parameters</span>
<span class="kn">from</span> <span class="nn">django.utils.decorators</span> <span class="k">import</span> <span class="n">method_decorator</span>
<span class="kn">from</span> <span class="nn">django.utils.html</span> <span class="k">import</span> <span class="n">escape</span>
<span class="kn">from</span> <span class="nn">django.urls</span> <span class="k">import</span> <span class="n">path</span><span class="p">,</span> <span class="n">reverse</span>
<span class="kn">from</span> <span class="nn">django.contrib.auth</span> <span class="k">import</span> <span class="n">update_session_auth_hash</span>
<span class="kn">from</span> <span class="nn">evennia.accounts.models</span> <span class="k">import</span> <span class="n">AccountDB</span>
<span class="kn">from</span> <span class="nn">evennia.typeclasses.admin</span> <span class="k">import</span> <span class="n">AttributeInline</span><span class="p">,</span> <span class="n">TagInline</span>
<span class="kn">from</span> <span class="nn">evennia.utils</span> <span class="k">import</span> <span class="n">create</span>
<span class="n">sensitive_post_parameters_m</span> <span class="o">=</span> <span class="n">method_decorator</span><span class="p">(</span><span class="n">sensitive_post_parameters</span><span class="p">())</span>
<span class="c1"># handle the custom User editor</span>
<div class="viewcode-block" id="AccountDBChangeForm"><a class="viewcode-back" href="../../../api/evennia.accounts.admin.html#evennia.accounts.admin.AccountDBChangeForm">[docs]</a><span class="k">class</span> <span class="nc">AccountDBChangeForm</span><span class="p">(</span><span class="n">UserChangeForm</span><span class="p">):</span>
@ -128,7 +141,8 @@
<div class="viewcode-block" id="AccountForm.Meta"><a class="viewcode-back" href="../../../api/evennia.accounts.admin.html#evennia.accounts.admin.AccountForm.Meta">[docs]</a> <span class="k">class</span> <span class="nc">Meta</span><span class="p">(</span><span class="nb">object</span><span class="p">):</span>
<span class="n">model</span> <span class="o">=</span> <span class="n">AccountDB</span>
<span class="n">fields</span> <span class="o">=</span> <span class="s2">&quot;__all__&quot;</span></div>
<span class="n">fields</span> <span class="o">=</span> <span class="s2">&quot;__all__&quot;</span>
<span class="n">app_label</span> <span class="o">=</span> <span class="s2">&quot;accounts&quot;</span></div>
<span class="n">db_key</span> <span class="o">=</span> <span class="n">forms</span><span class="o">.</span><span class="n">RegexField</span><span class="p">(</span>
<span class="n">label</span><span class="o">=</span><span class="s2">&quot;Username&quot;</span><span class="p">,</span>
@ -300,6 +314,70 @@
<span class="p">),</span>
<span class="p">)</span>
<div class="viewcode-block" id="AccountDBAdmin.user_change_password"><a class="viewcode-back" href="../../../api/evennia.accounts.admin.html#evennia.accounts.admin.AccountDBAdmin.user_change_password">[docs]</a> <span class="nd">@sensitive_post_parameters_m</span>
<span class="k">def</span> <span class="nf">user_change_password</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">request</span><span class="p">,</span> <span class="nb">id</span><span class="p">,</span> <span class="n">form_url</span><span class="o">=</span><span class="s2">&quot;&quot;</span><span class="p">):</span>
<span class="n">user</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">get_object</span><span class="p">(</span><span class="n">request</span><span class="p">,</span> <span class="n">unquote</span><span class="p">(</span><span class="nb">id</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">has_change_permission</span><span class="p">(</span><span class="n">request</span><span class="p">,</span> <span class="n">user</span><span class="p">):</span>
<span class="k">raise</span> <span class="n">PermissionDenied</span>
<span class="k">if</span> <span class="n">user</span> <span class="ow">is</span> <span class="kc">None</span><span class="p">:</span>
<span class="k">raise</span> <span class="n">Http404</span><span class="p">(</span><span class="s2">&quot;</span><span class="si">%(name)s</span><span class="s2"> object with primary key </span><span class="si">%(key)r</span><span class="s2"> does not exist.&quot;</span><span class="p">)</span> <span class="o">%</span> <span class="p">{</span>
<span class="s2">&quot;name&quot;</span><span class="p">:</span> <span class="bp">self</span><span class="o">.</span><span class="n">model</span><span class="o">.</span><span class="n">_meta</span><span class="o">.</span><span class="n">verbose_name</span><span class="p">,</span>
<span class="s2">&quot;key&quot;</span><span class="p">:</span> <span class="n">escape</span><span class="p">(</span><span class="nb">id</span><span class="p">),</span>
<span class="p">}</span>
<span class="k">if</span> <span class="n">request</span><span class="o">.</span><span class="n">method</span> <span class="o">==</span> <span class="s2">&quot;POST&quot;</span><span class="p">:</span>
<span class="n">form</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">change_password_form</span><span class="p">(</span><span class="n">user</span><span class="p">,</span> <span class="n">request</span><span class="o">.</span><span class="n">POST</span><span class="p">)</span>
<span class="k">if</span> <span class="n">form</span><span class="o">.</span><span class="n">is_valid</span><span class="p">():</span>
<span class="n">form</span><span class="o">.</span><span class="n">save</span><span class="p">()</span>
<span class="n">change_message</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">construct_change_message</span><span class="p">(</span><span class="n">request</span><span class="p">,</span> <span class="n">form</span><span class="p">,</span> <span class="kc">None</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">log_change</span><span class="p">(</span><span class="n">request</span><span class="p">,</span> <span class="n">user</span><span class="p">,</span> <span class="n">change_message</span><span class="p">)</span>
<span class="n">msg</span> <span class="o">=</span> <span class="s2">&quot;Password changed successfully.&quot;</span>
<span class="n">messages</span><span class="o">.</span><span class="n">success</span><span class="p">(</span><span class="n">request</span><span class="p">,</span> <span class="n">msg</span><span class="p">)</span>
<span class="n">update_session_auth_hash</span><span class="p">(</span><span class="n">request</span><span class="p">,</span> <span class="n">form</span><span class="o">.</span><span class="n">user</span><span class="p">)</span>
<span class="k">return</span> <span class="n">HttpResponseRedirect</span><span class="p">(</span>
<span class="n">reverse</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">_</span><span class="si">%s</span><span class="s2">_change&quot;</span>
<span class="o">%</span> <span class="p">(</span>
<span class="bp">self</span><span class="o">.</span><span class="n">admin_site</span><span class="o">.</span><span class="n">name</span><span class="p">,</span>
<span class="n">user</span><span class="o">.</span><span class="n">_meta</span><span class="o">.</span><span class="n">app_label</span><span class="p">,</span>
<span class="c1"># the model_name is something we need to hardcode</span>
<span class="c1"># since our accountdb is a proxy:</span>
<span class="s2">&quot;accountdb&quot;</span><span class="p">,</span>
<span class="p">),</span>
<span class="n">args</span><span class="o">=</span><span class="p">(</span><span class="n">user</span><span class="o">.</span><span class="n">pk</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">form</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">change_password_form</span><span class="p">(</span><span class="n">user</span><span class="p">)</span>
<span class="n">fieldsets</span> <span class="o">=</span> <span class="p">[(</span><span class="kc">None</span><span class="p">,</span> <span class="p">{</span><span class="s2">&quot;fields&quot;</span><span class="p">:</span> <span class="nb">list</span><span class="p">(</span><span class="n">form</span><span class="o">.</span><span class="n">base_fields</span><span class="p">)})]</span>
<span class="n">adminForm</span> <span class="o">=</span> <span class="n">admin</span><span class="o">.</span><span class="n">helpers</span><span class="o">.</span><span class="n">AdminForm</span><span class="p">(</span><span class="n">form</span><span class="p">,</span> <span class="n">fieldsets</span><span class="p">,</span> <span class="p">{})</span>
<span class="n">context</span> <span class="o">=</span> <span class="p">{</span>
<span class="s2">&quot;title&quot;</span><span class="p">:</span> <span class="s2">&quot;Change password: </span><span class="si">%s</span><span class="s2">&quot;</span> <span class="o">%</span> <span class="n">escape</span><span class="p">(</span><span class="n">user</span><span class="o">.</span><span class="n">get_username</span><span class="p">()),</span>
<span class="s2">&quot;adminForm&quot;</span><span class="p">:</span> <span class="n">adminForm</span><span class="p">,</span>
<span class="s2">&quot;form_url&quot;</span><span class="p">:</span> <span class="n">form_url</span><span class="p">,</span>
<span class="s2">&quot;form&quot;</span><span class="p">:</span> <span class="n">form</span><span class="p">,</span>
<span class="s2">&quot;is_popup&quot;</span><span class="p">:</span> <span class="p">(</span><span class="n">IS_POPUP_VAR</span> <span class="ow">in</span> <span class="n">request</span><span class="o">.</span><span class="n">POST</span> <span class="ow">or</span> <span class="n">IS_POPUP_VAR</span> <span class="ow">in</span> <span class="n">request</span><span class="o">.</span><span class="n">GET</span><span class="p">),</span>
<span class="s2">&quot;add&quot;</span><span class="p">:</span> <span class="kc">True</span><span class="p">,</span>
<span class="s2">&quot;change&quot;</span><span class="p">:</span> <span class="kc">False</span><span class="p">,</span>
<span class="s2">&quot;has_delete_permission&quot;</span><span class="p">:</span> <span class="kc">False</span><span class="p">,</span>
<span class="s2">&quot;has_change_permission&quot;</span><span class="p">:</span> <span class="kc">True</span><span class="p">,</span>
<span class="s2">&quot;has_absolute_url&quot;</span><span class="p">:</span> <span class="kc">False</span><span class="p">,</span>
<span class="s2">&quot;opts&quot;</span><span class="p">:</span> <span class="bp">self</span><span class="o">.</span><span class="n">model</span><span class="o">.</span><span class="n">_meta</span><span class="p">,</span>
<span class="s2">&quot;original&quot;</span><span class="p">:</span> <span class="n">user</span><span class="p">,</span>
<span class="s2">&quot;save_as&quot;</span><span class="p">:</span> <span class="kc">False</span><span class="p">,</span>
<span class="s2">&quot;show_save&quot;</span><span class="p">:</span> <span class="kc">True</span><span class="p">,</span>
<span class="o">**</span><span class="bp">self</span><span class="o">.</span><span class="n">admin_site</span><span class="o">.</span><span class="n">each_context</span><span class="p">(</span><span class="n">request</span><span class="p">),</span>
<span class="p">}</span>
<span class="n">request</span><span class="o">.</span><span class="n">current_app</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">admin_site</span><span class="o">.</span><span class="n">name</span>
<span class="k">return</span> <span class="n">TemplateResponse</span><span class="p">(</span>
<span class="n">request</span><span class="p">,</span>
<span class="bp">self</span><span class="o">.</span><span class="n">change_user_password_template</span> <span class="ow">or</span> <span class="s2">&quot;admin/auth/user/change_password.html&quot;</span><span class="p">,</span>
<span class="n">context</span><span class="p">,</span>
<span class="p">)</span></div>
<div class="viewcode-block" id="AccountDBAdmin.save_model"><a class="viewcode-back" href="../../../api/evennia.accounts.admin.html#evennia.accounts.admin.AccountDBAdmin.save_model">[docs]</a> <span class="k">def</span> <span class="nf">save_model</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">request</span><span class="p">,</span> <span class="n">obj</span><span class="p">,</span> <span class="n">form</span><span class="p">,</span> <span class="n">change</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> Custom save actions.</span>

View file

@ -150,8 +150,8 @@
<span class="n">__applabel__</span> <span class="o">=</span> <span class="s2">&quot;accounts&quot;</span>
<span class="n">__settingsclasspath__</span> <span class="o">=</span> <span class="n">settings</span><span class="o">.</span><span class="n">BASE_SCRIPT_TYPECLASS</span>
<span class="k">class</span> <span class="nc">Meta</span><span class="p">(</span><span class="nb">object</span><span class="p">):</span>
<span class="n">verbose_name</span> <span class="o">=</span> <span class="s2">&quot;Account&quot;</span>
<span class="c1"># class Meta:</span>
<span class="c1"># verbose_name = &quot;Account&quot;</span>
<span class="c1"># cmdset_storage property</span>
<span class="c1"># This seems very sensitive to caching, so leaving it be for now /Griatch</span>

View file

@ -513,13 +513,13 @@
<span class="n">tempmergers</span><span class="p">[</span><span class="n">prio</span><span class="p">]</span> <span class="o">=</span> <span class="n">cmdset</span>
<span class="c1"># sort cmdsets after reverse priority (highest prio are merged in last)</span>
<span class="n">cmdsets</span> <span class="o">=</span> <span class="k">yield</span> <span class="nb">sorted</span><span class="p">(</span><span class="nb">list</span><span class="p">(</span><span class="n">tempmergers</span><span class="o">.</span><span class="n">values</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">sorted_cmdsets</span> <span class="o">=</span> <span class="k">yield</span> <span class="nb">sorted</span><span class="p">(</span><span class="nb">list</span><span class="p">(</span><span class="n">tempmergers</span><span class="o">.</span><span class="n">values</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="c1"># Merge all command sets into one, beginning with the lowest-prio one</span>
<span class="n">cmdset</span> <span class="o">=</span> <span class="n">cmdsets</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span>
<span class="k">for</span> <span class="n">merging_cmdset</span> <span class="ow">in</span> <span class="n">cmdsets</span><span class="p">[</span><span class="mi">1</span><span class="p">:]:</span>
<span class="n">cmdset</span> <span class="o">=</span> <span class="n">sorted_cmdsets</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span>
<span class="k">for</span> <span class="n">merging_cmdset</span> <span class="ow">in</span> <span class="n">sorted_cmdsets</span><span class="p">[</span><span class="mi">1</span><span class="p">:]:</span>
<span class="n">cmdset</span> <span class="o">=</span> <span class="k">yield</span> <span class="n">cmdset</span> <span class="o">+</span> <span class="n">merging_cmdset</span>
<span class="c1"># store the full sets for diagnosis</span>
<span class="c1"># store the original, ungrouped set for diagnosis</span>
<span class="n">cmdset</span><span class="o">.</span><span class="n">merged_from</span> <span class="o">=</span> <span class="n">cmdsets</span>
<span class="c1"># cache</span>
<span class="n">_CMDSET_MERGE_CACHE</span><span class="p">[</span><span class="n">mergehash</span><span class="p">]</span> <span class="o">=</span> <span class="n">cmdset</span>

View file

@ -484,12 +484,12 @@
<span class="c1"># print &quot;__add__ for %s (prio %i) called with %s (prio %i).&quot; % (self.key, self.priority, cmdset_a.key, cmdset_a.priority)</span>
<span class="c1"># return the system commands to the cmdset</span>
<span class="n">cmdset_c</span><span class="o">.</span><span class="n">add</span><span class="p">(</span><span class="n">sys_commands</span><span class="p">)</span>
<span class="n">cmdset_c</span><span class="o">.</span><span class="n">add</span><span class="p">(</span><span class="n">sys_commands</span><span class="p">,</span> <span class="n">allow_duplicates</span><span class="o">=</span><span class="kc">True</span><span class="p">)</span>
<span class="k">return</span> <span class="n">cmdset_c</span>
<div class="viewcode-block" id="CmdSet.add"><a class="viewcode-back" href="../../../api/evennia.commands.cmdset.html#evennia.commands.cmdset.CmdSet.add">[docs]</a> <span class="k">def</span> <span class="nf">add</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">cmd</span><span class="p">):</span>
<div class="viewcode-block" id="CmdSet.add"><a class="viewcode-back" href="../../../api/evennia.commands.cmdset.html#evennia.commands.cmdset.CmdSet.add">[docs]</a> <span class="k">def</span> <span class="nf">add</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">cmd</span><span class="p">,</span> <span class="n">allow_duplicates</span><span class="o">=</span><span class="kc">False</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> Add a new command or commands to this CmdSetcommand, a list of</span>
<span class="sd"> Add a new command or commands to this CmdSet, a list of</span>
<span class="sd"> commands or a cmdset to this cmdset. Note that this is *not*</span>
<span class="sd"> a merge operation (that is handled by the + operator).</span>
@ -497,6 +497,9 @@
<span class="sd"> cmd (Command, list, Cmdset): This allows for adding one or</span>
<span class="sd"> more commands to this Cmdset in one go. If another Cmdset</span>
<span class="sd"> is given, all its commands will be added.</span>
<span class="sd"> allow_duplicates (bool, optional): If set, will not try to remove</span>
<span class="sd"> duplicate cmds in the set. This is needed during the merge process</span>
<span class="sd"> to avoid wiping commands coming from cmdsets with duplicate=True.</span>
<span class="sd"> Notes:</span>
<span class="sd"> If cmd already exists in set, it will replace the old one</span>
@ -539,8 +542,10 @@
<span class="n">commands</span><span class="p">[</span><span class="n">ic</span><span class="p">]</span> <span class="o">=</span> <span class="n">cmd</span> <span class="c1"># replace</span>
<span class="k">except</span> <span class="ne">ValueError</span><span class="p">:</span>
<span class="n">commands</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">cmd</span><span class="p">)</span>
<span class="c1"># extra run to make sure to avoid doublets</span>
<span class="bp">self</span><span class="o">.</span><span class="n">commands</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">commands</span><span class="p">))</span>
<span class="bp">self</span><span class="o">.</span><span class="n">commands</span> <span class="o">=</span> <span class="n">commands</span>
<span class="k">if</span> <span class="ow">not</span> <span class="n">allow_duplicates</span><span class="p">:</span>
<span class="c1"># extra run to make sure to avoid doublets</span>
<span class="bp">self</span><span class="o">.</span><span class="n">commands</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="bp">self</span><span class="o">.</span><span class="n">commands</span><span class="p">))</span>
<span class="c1"># add system_command to separate list as well,</span>
<span class="c1"># for quick look-up</span>
<span class="k">if</span> <span class="n">cmd</span><span class="o">.</span><span class="n">key</span><span class="o">.</span><span class="n">startswith</span><span class="p">(</span><span class="s2">&quot;__&quot;</span><span class="p">):</span>

View file

@ -195,7 +195,8 @@
<span class="k">if</span> <span class="ow">not</span> <span class="n">account</span><span class="o">.</span><span class="n">is_superuser</span> <span class="ow">and</span> <span class="p">(</span>
<span class="n">account</span><span class="o">.</span><span class="n">db</span><span class="o">.</span><span class="n">_playable_characters</span> <span class="ow">and</span> <span class="nb">len</span><span class="p">(</span><span class="n">account</span><span class="o">.</span><span class="n">db</span><span class="o">.</span><span class="n">_playable_characters</span><span class="p">)</span> <span class="o">&gt;=</span> <span class="n">charmax</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 may only create a maximum of </span><span class="si">%i</span><span class="s2"> characters.&quot;</span> <span class="o">%</span> <span class="n">charmax</span><span class="p">)</span>
<span class="n">plural</span> <span class="o">=</span> <span class="s2">&quot;&quot;</span> <span class="k">if</span> <span class="n">charmax</span> <span class="o">==</span> <span class="mi">1</span> <span class="k">else</span> <span class="s2">&quot;s&quot;</span>
<span class="bp">self</span><span class="o">.</span><span class="n">msg</span><span class="p">(</span><span class="n">f</span><span class="s2">&quot;You may only create a maximum of </span><span class="si">{charmax}</span><span class="s2"> character</span><span class="si">{plural}</span><span class="s2">.&quot;</span><span class="p">)</span>
<span class="k">return</span>
<span class="kn">from</span> <span class="nn">evennia.objects.models</span> <span class="k">import</span> <span class="n">ObjectDB</span>
@ -341,27 +342,68 @@
<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="n">new_character</span> <span class="o">=</span> <span class="kc">None</span>
<span class="n">character_candidates</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">args</span><span class="p">:</span>
<span class="n">new_character</span> <span class="o">=</span> <span class="n">account</span><span class="o">.</span><span class="n">db</span><span class="o">.</span><span class="n">_last_puppet</span>
<span class="k">if</span> <span class="ow">not</span> <span class="n">new_character</span><span class="p">:</span>
<span class="n">character_candidates</span> <span class="o">=</span> <span class="p">[</span><span class="n">account</span><span class="o">.</span><span class="n">db</span><span class="o">.</span><span class="n">_last_puppet</span><span class="p">]</span> <span class="ow">or</span> <span class="p">[]</span>
<span class="k">if</span> <span class="ow">not</span> <span class="n">character_candidates</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;Usage: ic &lt;character&gt;&quot;</span><span class="p">)</span>
<span class="k">return</span>
<span class="k">if</span> <span class="ow">not</span> <span class="n">new_character</span><span class="p">:</span>
<span class="c1"># search for a matching character</span>
<span class="n">new_character</span> <span class="o">=</span> <span class="p">[</span>
<span class="n">char</span> <span class="k">for</span> <span class="n">char</span> <span class="ow">in</span> <span class="n">search</span><span class="o">.</span><span class="n">object_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">if</span> <span class="n">char</span><span class="o">.</span><span class="n">access</span><span class="p">(</span><span class="n">account</span><span class="p">,</span> <span class="s2">&quot;puppet&quot;</span><span class="p">)</span>
<span class="p">]</span>
<span class="k">if</span> <span class="ow">not</span> <span class="n">new_character</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;That is not a valid character choice.&quot;</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">new_character</span><span class="p">)</span> <span class="o">&gt;</span> <span class="mi">1</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;Multiple targets with the same name:</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="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">%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">key</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">new_character</span><span class="p">)</span>
<span class="k">else</span><span class="p">:</span>
<span class="c1"># argument given</span>
<span class="k">if</span> <span class="n">account</span><span class="o">.</span><span class="n">db</span><span class="o">.</span><span class="n">_playable_characters</span><span class="p">:</span>
<span class="c1"># look at the playable_characters list first</span>
<span class="n">character_candidates</span><span class="o">.</span><span class="n">extend</span><span class="p">(</span>
<span class="n">account</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">candidates</span><span class="o">=</span><span class="n">account</span><span class="o">.</span><span class="n">db</span><span class="o">.</span><span class="n">_playable_characters</span><span class="p">,</span>
<span class="n">search_object</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="p">)</span>
<span class="p">)</span>
<span class="k">return</span>
<span class="k">else</span><span class="p">:</span>
<span class="n">new_character</span> <span class="o">=</span> <span class="n">new_character</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span>
<span class="k">if</span> <span class="n">account</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="n">account</span><span class="p">,</span> <span class="s2">&quot;perm(Builder)&quot;</span><span class="p">):</span>
<span class="c1"># builders and higher should be able to puppet more than their</span>
<span class="c1"># playable characters.</span>
<span class="k">if</span> <span class="n">session</span><span class="o">.</span><span class="n">puppet</span><span class="p">:</span>
<span class="c1"># start by local search - this helps to avoid the user</span>
<span class="c1"># getting locked into their playable characters should one</span>
<span class="c1"># happen to be named the same as another. We replace the suggestion</span>
<span class="c1"># from playable_characters here - this allows builders to puppet objects</span>
<span class="c1"># with the same name as their playable chars should it be necessary</span>
<span class="c1"># (by going to the same location).</span>
<span class="n">character_candidates</span> <span class="o">=</span> <span class="p">[</span>
<span class="n">char</span>
<span class="k">for</span> <span class="n">char</span> <span class="ow">in</span> <span class="n">session</span><span class="o">.</span><span class="n">puppet</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">quiet</span><span class="o">=</span><span class="kc">True</span><span class="p">)</span>
<span class="k">if</span> <span class="n">char</span><span class="o">.</span><span class="n">access</span><span class="p">(</span><span class="n">account</span><span class="p">,</span> <span class="s2">&quot;puppet&quot;</span><span class="p">)</span>
<span class="p">]</span>
<span class="k">if</span> <span class="ow">not</span> <span class="n">character_candidates</span><span class="p">:</span>
<span class="c1"># fall back to global search only if Builder+ has no</span>
<span class="c1"># playable_characers in list and is not standing in a room</span>
<span class="c1"># with a matching char.</span>
<span class="n">character_candidates</span><span class="o">.</span><span class="n">extend</span><span class="p">(</span>
<span class="p">[</span>
<span class="n">char</span>
<span class="k">for</span> <span class="n">char</span> <span class="ow">in</span> <span class="n">search</span><span class="o">.</span><span class="n">object_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">if</span> <span class="n">char</span><span class="o">.</span><span class="n">access</span><span class="p">(</span><span class="n">account</span><span class="p">,</span> <span class="s2">&quot;puppet&quot;</span><span class="p">)</span>
<span class="p">]</span>
<span class="p">)</span>
<span class="c1"># handle possible candidates</span>
<span class="k">if</span> <span class="ow">not</span> <span class="n">character_candidates</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;That is not a valid character choice.&quot;</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">character_candidates</span><span class="p">)</span> <span class="o">&gt;</span> <span class="mi">1</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;Multiple targets with the same name:</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="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">%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">key</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">character_candidates</span><span class="p">)</span>
<span class="p">)</span>
<span class="k">return</span>
<span class="k">else</span><span class="p">:</span>
<span class="n">new_character</span> <span class="o">=</span> <span class="n">character_candidates</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span>
<span class="c1"># do the puppet puppet</span>
<span class="k">try</span><span class="p">:</span>
<span class="n">account</span><span class="o">.</span><span class="n">puppet_object</span><span class="p">(</span><span class="n">session</span><span class="p">,</span> <span class="n">new_character</span><span class="p">)</span>
<span class="n">account</span><span class="o">.</span><span class="n">db</span><span class="o">.</span><span class="n">_last_puppet</span> <span class="o">=</span> <span class="n">new_character</span>

View file

@ -91,35 +91,6 @@
<span class="s2"> Error reported was: &#39;</span><span class="si">%s</span><span class="s2">&#39;</span>
<span class="s2">&quot;&quot;&quot;</span>
<span class="n">_PROCPOOL_BATCHCMD_SOURCE</span> <span class="o">=</span> <span class="s2">&quot;&quot;&quot;</span>
<span class="s2">from evennia.commands.default.batchprocess import batch_cmd_exec, step_pointer, BatchSafeCmdSet</span>
<span class="s2">caller.ndb.batch_stack = commands</span>
<span class="s2">caller.ndb.batch_stackptr = 0</span>
<span class="s2">caller.ndb.batch_batchmode = &quot;batch_commands&quot;</span>
<span class="s2">caller.cmdset.add(BatchSafeCmdSet)</span>
<span class="s2">for inum in range(len(commands)):</span>
<span class="s2"> print &quot;command:&quot;, inum</span>
<span class="s2"> caller.cmdset.add(BatchSafeCmdSet)</span>
<span class="s2"> if not batch_cmd_exec(caller):</span>
<span class="s2"> break</span>
<span class="s2"> step_pointer(caller, 1)</span>
<span class="s2">print &quot;leaving run ...&quot;</span>
<span class="s2">&quot;&quot;&quot;</span>
<span class="n">_PROCPOOL_BATCHCODE_SOURCE</span> <span class="o">=</span> <span class="s2">&quot;&quot;&quot;</span>
<span class="s2">from evennia.commands.default.batchprocess import batch_code_exec, step_pointer, BatchSafeCmdSet</span>
<span class="s2">caller.ndb.batch_stack = codes</span>
<span class="s2">caller.ndb.batch_stackptr = 0</span>
<span class="s2">caller.ndb.batch_batchmode = &quot;batch_code&quot;</span>
<span class="s2">caller.cmdset.add(BatchSafeCmdSet)</span>
<span class="s2">for inum in range(len(codes)):</span>
<span class="s2"> print &quot;code:&quot;, inum</span>
<span class="s2"> caller.cmdset.add(BatchSafeCmdSet)</span>
<span class="s2"> if not batch_code_exec(caller):</span>
<span class="s2"> break</span>
<span class="s2"> step_pointer(caller, 1)</span>
<span class="s2">print &quot;leaving run ...&quot;</span>
<span class="s2">&quot;&quot;&quot;</span>
<span class="c1"># -------------------------------------------------------------</span>
<span class="c1"># Helper functions</span>
@ -341,42 +312,17 @@
<span class="s2">&quot;for </span><span class="si">%s</span><span class="s2"> (this might take some time) ...&quot;</span> <span class="o">%</span> <span class="n">python_path</span>
<span class="p">)</span>
<span class="n">procpool</span> <span class="o">=</span> <span class="kc">False</span>
<span class="k">if</span> <span class="s2">&quot;PythonProcPool&quot;</span> <span class="ow">in</span> <span class="n">utils</span><span class="o">.</span><span class="n">server_services</span><span class="p">():</span>
<span class="k">if</span> <span class="n">utils</span><span class="o">.</span><span class="n">uses_database</span><span class="p">(</span><span class="s2">&quot;sqlite3&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;Batchprocessor disabled ProcPool under SQLite3.&quot;</span><span class="p">)</span>
<span class="k">else</span><span class="p">:</span>
<span class="n">procpool</span> <span class="o">=</span> <span class="kc">True</span>
<span class="k">if</span> <span class="n">procpool</span><span class="p">:</span>
<span class="c1"># run in parallel process</span>
<span class="k">def</span> <span class="nf">callback</span><span class="p">(</span><span class="n">r</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; |GBatchfile &#39;</span><span class="si">%s</span><span class="s2">&#39; applied.&quot;</span> <span class="o">%</span> <span class="n">python_path</span><span class="p">)</span>
<span class="n">purge_processor</span><span class="p">(</span><span class="n">caller</span><span class="p">)</span>
<span class="k">def</span> <span class="nf">errback</span><span class="p">(</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="s2">&quot; |RError from processor: &#39;</span><span class="si">%s</span><span class="s2">&#39;&quot;</span> <span class="o">%</span> <span class="n">e</span><span class="p">)</span>
<span class="n">purge_processor</span><span class="p">(</span><span class="n">caller</span><span class="p">)</span>
<span class="n">utils</span><span class="o">.</span><span class="n">run_async</span><span class="p">(</span>
<span class="n">_PROCPOOL_BATCHCMD_SOURCE</span><span class="p">,</span>
<span class="n">commands</span><span class="o">=</span><span class="n">commands</span><span class="p">,</span>
<span class="n">caller</span><span class="o">=</span><span class="n">caller</span><span class="p">,</span>
<span class="n">at_return</span><span class="o">=</span><span class="n">callback</span><span class="p">,</span>
<span class="n">at_err</span><span class="o">=</span><span class="n">errback</span><span class="p">,</span>
<span class="p">)</span>
<span class="k">else</span><span class="p">:</span>
<span class="c1"># run in-process (might block)</span>
<span class="k">for</span> <span class="n">_</span> <span class="ow">in</span> <span class="nb">range</span><span class="p">(</span><span class="nb">len</span><span class="p">(</span><span class="n">commands</span><span class="p">)):</span>
<span class="c1"># loop through the batch file</span>
<span class="k">if</span> <span class="ow">not</span> <span class="n">batch_cmd_exec</span><span class="p">(</span><span class="n">caller</span><span class="p">):</span>
<span class="k">return</span>
<span class="n">step_pointer</span><span class="p">(</span><span class="n">caller</span><span class="p">,</span> <span class="mi">1</span><span class="p">)</span>
<span class="c1"># clean out the safety cmdset and clean out all other</span>
<span class="c1"># temporary attrs.</span>
<span class="n">string</span> <span class="o">=</span> <span class="s2">&quot; Batchfile &#39;</span><span class="si">%s</span><span class="s2">&#39; applied.&quot;</span> <span class="o">%</span> <span class="n">python_path</span>
<span class="n">caller</span><span class="o">.</span><span class="n">msg</span><span class="p">(</span><span class="s2">&quot;|G</span><span class="si">%s</span><span class="s2">&quot;</span> <span class="o">%</span> <span class="n">string</span><span class="p">)</span>
<span class="n">purge_processor</span><span class="p">(</span><span class="n">caller</span><span class="p">)</span></div></div>
<span class="c1"># run in-process (might block)</span>
<span class="k">for</span> <span class="n">_</span> <span class="ow">in</span> <span class="nb">range</span><span class="p">(</span><span class="nb">len</span><span class="p">(</span><span class="n">commands</span><span class="p">)):</span>
<span class="c1"># loop through the batch file</span>
<span class="k">if</span> <span class="ow">not</span> <span class="n">batch_cmd_exec</span><span class="p">(</span><span class="n">caller</span><span class="p">):</span>
<span class="k">return</span>
<span class="n">step_pointer</span><span class="p">(</span><span class="n">caller</span><span class="p">,</span> <span class="mi">1</span><span class="p">)</span>
<span class="c1"># clean out the safety cmdset and clean out all other</span>
<span class="c1"># temporary attrs.</span>
<span class="n">string</span> <span class="o">=</span> <span class="s2">&quot; Batchfile &#39;</span><span class="si">%s</span><span class="s2">&#39; applied.&quot;</span> <span class="o">%</span> <span class="n">python_path</span>
<span class="n">caller</span><span class="o">.</span><span class="n">msg</span><span class="p">(</span><span class="s2">&quot;|G</span><span class="si">%s</span><span class="s2">&quot;</span> <span class="o">%</span> <span class="n">string</span><span class="p">)</span>
<span class="n">purge_processor</span><span class="p">(</span><span class="n">caller</span><span class="p">)</span></div></div>
<div class="viewcode-block" id="CmdBatchCode"><a class="viewcode-back" href="../../../../api/evennia.commands.default.batchprocess.html#evennia.commands.default.batchprocess.CmdBatchCode">[docs]</a><span class="k">class</span> <span class="nc">CmdBatchCode</span><span class="p">(</span><span class="n">_COMMAND_DEFAULT_CLASS</span><span class="p">):</span>
@ -461,41 +407,16 @@
<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;Running Batch-code processor - Automatic mode for </span><span class="si">%s</span><span class="s2"> ...&quot;</span> <span class="o">%</span> <span class="n">python_path</span><span class="p">)</span>
<span class="n">procpool</span> <span class="o">=</span> <span class="kc">False</span>
<span class="k">if</span> <span class="s2">&quot;PythonProcPool&quot;</span> <span class="ow">in</span> <span class="n">utils</span><span class="o">.</span><span class="n">server_services</span><span class="p">():</span>
<span class="k">if</span> <span class="n">utils</span><span class="o">.</span><span class="n">uses_database</span><span class="p">(</span><span class="s2">&quot;sqlite3&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;Batchprocessor disabled ProcPool under SQLite3.&quot;</span><span class="p">)</span>
<span class="k">else</span><span class="p">:</span>
<span class="n">procpool</span> <span class="o">=</span> <span class="kc">True</span>
<span class="k">if</span> <span class="n">procpool</span><span class="p">:</span>
<span class="c1"># run in parallel process</span>
<span class="k">def</span> <span class="nf">callback</span><span class="p">(</span><span class="n">r</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; |GBatchfile &#39;</span><span class="si">%s</span><span class="s2">&#39; applied.&quot;</span> <span class="o">%</span> <span class="n">python_path</span><span class="p">)</span>
<span class="n">purge_processor</span><span class="p">(</span><span class="n">caller</span><span class="p">)</span>
<span class="k">def</span> <span class="nf">errback</span><span class="p">(</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="s2">&quot; |RError from processor: &#39;</span><span class="si">%s</span><span class="s2">&#39;&quot;</span> <span class="o">%</span> <span class="n">e</span><span class="p">)</span>
<span class="n">purge_processor</span><span class="p">(</span><span class="n">caller</span><span class="p">)</span>
<span class="n">utils</span><span class="o">.</span><span class="n">run_async</span><span class="p">(</span>
<span class="n">_PROCPOOL_BATCHCODE_SOURCE</span><span class="p">,</span>
<span class="n">codes</span><span class="o">=</span><span class="n">codes</span><span class="p">,</span>
<span class="n">caller</span><span class="o">=</span><span class="n">caller</span><span class="p">,</span>
<span class="n">at_return</span><span class="o">=</span><span class="n">callback</span><span class="p">,</span>
<span class="n">at_err</span><span class="o">=</span><span class="n">errback</span><span class="p">,</span>
<span class="p">)</span>
<span class="k">else</span><span class="p">:</span>
<span class="c1"># un in-process (will block)</span>
<span class="k">for</span> <span class="n">_</span> <span class="ow">in</span> <span class="nb">range</span><span class="p">(</span><span class="nb">len</span><span class="p">(</span><span class="n">codes</span><span class="p">)):</span>
<span class="c1"># loop through the batch file</span>
<span class="k">if</span> <span class="ow">not</span> <span class="n">batch_code_exec</span><span class="p">(</span><span class="n">caller</span><span class="p">):</span>
<span class="k">return</span>
<span class="n">step_pointer</span><span class="p">(</span><span class="n">caller</span><span class="p">,</span> <span class="mi">1</span><span class="p">)</span>
<span class="c1"># clean out the safety cmdset and clean out all other</span>
<span class="c1"># temporary attrs.</span>
<span class="n">string</span> <span class="o">=</span> <span class="s2">&quot; Batchfile &#39;</span><span class="si">%s</span><span class="s2">&#39; applied.&quot;</span> <span class="o">%</span> <span class="n">python_path</span>
<span class="n">caller</span><span class="o">.</span><span class="n">msg</span><span class="p">(</span><span class="s2">&quot;|G</span><span class="si">%s</span><span class="s2">&quot;</span> <span class="o">%</span> <span class="n">string</span><span class="p">)</span>
<span class="n">purge_processor</span><span class="p">(</span><span class="n">caller</span><span class="p">)</span></div></div>
<span class="k">for</span> <span class="n">_</span> <span class="ow">in</span> <span class="nb">range</span><span class="p">(</span><span class="nb">len</span><span class="p">(</span><span class="n">codes</span><span class="p">)):</span>
<span class="c1"># loop through the batch file</span>
<span class="k">if</span> <span class="ow">not</span> <span class="n">batch_code_exec</span><span class="p">(</span><span class="n">caller</span><span class="p">):</span>
<span class="k">return</span>
<span class="n">step_pointer</span><span class="p">(</span><span class="n">caller</span><span class="p">,</span> <span class="mi">1</span><span class="p">)</span>
<span class="c1"># clean out the safety cmdset and clean out all other</span>
<span class="c1"># temporary attrs.</span>
<span class="n">string</span> <span class="o">=</span> <span class="s2">&quot; Batchfile &#39;</span><span class="si">%s</span><span class="s2">&#39; applied.&quot;</span> <span class="o">%</span> <span class="n">python_path</span>
<span class="n">caller</span><span class="o">.</span><span class="n">msg</span><span class="p">(</span><span class="s2">&quot;|G</span><span class="si">%s</span><span class="s2">&quot;</span> <span class="o">%</span> <span class="n">string</span><span class="p">)</span>
<span class="n">purge_processor</span><span class="p">(</span><span class="n">caller</span><span class="p">)</span></div></div>
<span class="c1"># -------------------------------------------------------------</span>

View file

@ -57,11 +57,13 @@
<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="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>
@ -1448,6 +1450,7 @@
<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>
@ -1493,10 +1496,16 @@
<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">report_to</span><span class="o">=</span><span class="n">caller</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>
@ -2396,116 +2405,160 @@
<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="k">if</span> <span class="ow">not</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">value</span><span class="p">,</span> <span class="nb">str</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">to_str</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">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="n">string</span> <span class="o">=</span> <span class="s2">&quot;</span><span class="se">\n</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="o">%</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">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="n">string</span> <span class="o">=</span> <span class="s2">&quot;</span><span class="se">\n</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">attr</span><span class="p">,</span> <span class="n">value</span><span class="p">)</span>
<span class="n">string</span> <span class="o">=</span> <span class="n">raw</span><span class="p">(</span><span class="n">string</span><span class="p">)</span>
<span class="k">return</span> <span class="n">string</span></div>
<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="sd"> &quot;&quot;&quot;</span>
<span class="k">if</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">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="kc">None</span>
<span class="n">string</span> <span class="o">=</span> <span class="s2">&quot;&quot;</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">string</span> <span class="o">+=</span> <span class="s2">&quot;</span><span class="se">\n</span><span class="s2">|wPersistent attributes|n:&quot;</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="n">string</span> <span class="o">+=</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="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">string</span> <span class="o">+=</span> <span class="s2">&quot;</span><span class="se">\n</span><span class="s2">|wNon-Persistent attributes|n:&quot;</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="n">string</span> <span class="o">+=</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">return</span> <span class="n">string</span></div>
<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">avail_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"> returns a string.</span>
<span class="sd"> Args:</span>
<span class="sd"> obj (any): Object to analyze.</span>
<span class="sd"> avail_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">string</span> <span class="o">=</span> <span class="s2">&quot;</span><span class="se">\n</span><span class="s2">|wName/key|n: |c</span><span class="si">%s</span><span class="s2">|n (</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">dbref</span><span class="p">)</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">string</span> <span class="o">+=</span> <span class="s2">&quot;</span><span class="se">\n</span><span class="s2">|wAliases|n: </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">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="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">string</span> <span class="o">+=</span> <span class="s2">&quot;</span><span class="se">\n</span><span class="s2">|wSession id(s)|n: </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="s2">&quot;#</span><span class="si">%i</span><span class="s2">&quot;</span> <span class="o">%</span> <span class="n">sess</span><span class="o">.</span><span class="n">sessid</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="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">string</span> <span class="o">+=</span> <span class="s2">&quot;</span><span class="se">\n</span><span class="s2">|wEmail|n: |c</span><span class="si">%s</span><span class="s2">|n&quot;</span> <span class="o">%</span> <span class="n">obj</span><span class="o">.</span><span class="n">email</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">string</span> <span class="o">+=</span> <span class="s2">&quot;</span><span class="se">\n</span><span class="s2">|wAccount|n: |c</span><span class="si">%s</span><span class="s2">|n&quot;</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">name</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">string</span> <span class="o">+=</span> <span class="s2">&quot;</span><span class="se">\n</span><span class="s2">|wAccount Perms|n: </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">perms</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">string</span> <span class="o">+=</span> <span class="s2">&quot; |r(quelled)|n&quot;</span>
<span class="n">string</span> <span class="o">+=</span> <span class="s2">&quot;</span><span class="se">\n</span><span class="s2">|wTypeclass|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">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">typeclass_path</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">string</span> <span class="o">+=</span> <span class="s2">&quot;</span><span class="se">\n</span><span class="s2">|wLocation|n: </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">location</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">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">location</span><span class="o">.</span><span class="n">id</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">string</span> <span class="o">+=</span> <span class="s2">&quot;</span><span class="se">\n</span><span class="s2">|wHome|n: </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">home</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">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">home</span><span class="o">.</span><span class="n">id</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">string</span> <span class="o">+=</span> <span class="s2">&quot;</span><span class="se">\n</span><span class="s2">|wDestination|n: </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">destination</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">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">destination</span><span class="o">.</span><span class="n">id</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">else</span><span class="p">:</span>
<span class="n">perms_string</span> <span class="o">=</span> <span class="s2">&quot;&lt;None&gt;&quot;</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; [Superuser]&quot;</span>
<span class="n">string</span> <span class="o">+=</span> <span class="s2">&quot;</span><span class="se">\n</span><span class="s2">|wPermissions|n: </span><span class="si">%s</span><span class="s2">&quot;</span> <span class="o">%</span> <span class="n">perms_string</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="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">6</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">string</span> <span class="o">+=</span> <span class="s2">&quot;</span><span class="se">\n</span><span class="s2">|wLocks|n:</span><span class="si">%s</span><span class="s2">&quot;</span> <span class="o">%</span> <span class="n">locks_string</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="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">string</span> <span class="o">+=</span> <span class="s2">&quot;</span><span class="se">\n</span><span class="s2">|wStored Cmdset(s)|n:</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="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="s2">&quot;</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">, prio </span><span class="si">%s</span><span class="s2">)&quot;</span>
<span class="o">%</span> <span class="p">(</span><span class="n">cmdset</span><span class="o">.</span><span class="n">path</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="o">.</span><span class="n">mergetype</span><span class="p">,</span> <span class="n">cmdset</span><span class="o">.</span><span class="n">priority</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="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="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">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}</span><span class="s2">)&quot;</span>
<span class="k">for</span> <span class="n">cmdset</span> <span class="ow">in</span> <span class="n">stored_cmdsets</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="c1"># this gets all components of the currently merged set</span>
@ -2539,40 +2592,28 @@
<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="n">string</span> <span class="o">+=</span> <span class="s2">&quot;</span><span class="se">\n</span><span class="s2">|wMerged Cmdset(s)|n:</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="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="s2">&quot;</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">, prio </span><span class="si">%s</span><span class="s2">)&quot;</span>
<span class="o">%</span> <span class="p">(</span><span class="n">cmdset</span><span class="o">.</span><span class="n">path</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="o">.</span><span class="n">mergetype</span><span class="p">,</span> <span class="n">cmdset</span><span class="o">.</span><span class="n">priority</span><span class="p">)</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">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">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}</span><span class="s2">)&quot;</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="c1"># list the commands available to this object</span>
<span class="n">avail_cmdset</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">avail_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="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">avail_cmdset</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">string</span> <span class="o">+=</span> <span class="s2">&quot;</span><span class="se">\n</span><span class="s2">|wCommands available to </span><span class="si">%s</span><span class="s2"> (result of Merged CmdSets)|n:</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">obj</span><span class="o">.</span><span class="n">key</span><span class="p">,</span>
<span class="n">cmdsetstr</span><span class="p">,</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">avail_cmdset</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">string</span> <span class="o">+=</span> <span class="s2">&quot;</span><span class="se">\n</span><span class="s2">|wScripts|n:</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="n">obj</span><span class="o">.</span><span class="n">scripts</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">string</span> <span class="o">+=</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"># display Tags</span>
<span class="n">tags_string</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="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">tag</span><span class="p">,</span> <span class="n">category</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="n">indent</span><span class="o">=</span><span class="mi">5</span><span class="p">,</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_string</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">|wTags[category]|n: </span><span class="si">%s</span><span class="s2">&quot;</span> <span class="o">%</span> <span class="n">tags_string</span><span class="o">.</span><span class="n">strip</span><span class="p">()</span>
<span class="c1"># add the contents</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>
@ -2585,24 +2626,28 @@
<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">string</span> <span class="o">+=</span> <span class="s2">&quot;</span><span class="se">\n</span><span class="s2">|wExits|n: </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="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">exit</span><span class="o">.</span><span class="n">name</span><span class="p">,</span> <span class="n">exit</span><span class="o">.</span><span class="n">dbref</span><span class="p">)</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="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">string</span> <span class="o">+=</span> <span class="s2">&quot;</span><span class="se">\n</span><span class="s2">|wCharacters|n: </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="p">[</span><span class="s2">&quot;|c</span><span class="si">%s</span><span class="s2">|n(</span><span class="si">%s</span><span class="s2">)&quot;</span> <span class="o">%</span> <span class="p">(</span><span class="n">pobj</span><span class="o">.</span><span class="n">name</span><span class="p">,</span> <span class="n">pobj</span><span class="o">.</span><span class="n">dbref</span><span class="p">)</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="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">string</span> <span class="o">+=</span> <span class="s2">&quot;</span><span class="se">\n</span><span class="s2">|wContents|n: </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="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">cont</span><span class="o">.</span><span class="n">name</span><span class="p">,</span> <span class="n">cont</span><span class="o">.</span><span class="n">dbref</span><span class="p">)</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="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="n">separator</span> <span class="o">=</span> <span class="s2">&quot;-&quot;</span> <span class="o">*</span> <span class="n">_DEFAULT_WIDTH</span>
<span class="c1"># output info</span>
<span class="k">return</span> <span class="s2">&quot;</span><span class="si">%s</span><span class="se">\n</span><span class="si">%s</span><span class="se">\n</span><span class="si">%s</span><span class="s2">&quot;</span> <span class="o">%</span> <span class="p">(</span><span class="n">separator</span><span class="p">,</span> <span class="n">string</span><span class="o">.</span><span class="n">strip</span><span class="p">(),</span> <span class="n">separator</span><span class="p">)</span></div>
<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>
@ -2617,8 +2662,7 @@
<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="n">string</span> <span class="o">=</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="bp">self</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>
<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>
@ -2672,7 +2716,13 @@
<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">caller</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_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="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>

View file

@ -467,11 +467,16 @@
<span class="k">if</span> <span class="ow">not</span> <span class="n">obj</span><span class="o">.</span><span class="n">at_before_get</span><span class="p">(</span><span class="n">caller</span><span class="p">):</span>
<span class="k">return</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="p">,</span> <span class="n">quiet</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;You pick up </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="p">)</span>
<span class="n">caller</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"> picks up </span><span class="si">%s</span><span class="s2">.&quot;</span> <span class="o">%</span> <span class="p">(</span><span class="n">caller</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">name</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="c1"># calling at_get hook method</span>
<span class="n">obj</span><span class="o">.</span><span class="n">at_get</span><span class="p">(</span><span class="n">caller</span><span class="p">)</span></div></div>
<span class="n">success</span> <span class="o">=</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="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">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;This can&#39;t be picked up.&quot;</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 pick up </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="p">)</span>
<span class="n">caller</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"> picks up </span><span class="si">%s</span><span class="s2">.&quot;</span> <span class="o">%</span> <span class="p">(</span><span class="n">caller</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">name</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="c1"># calling at_get hook method</span>
<span class="n">obj</span><span class="o">.</span><span class="n">at_get</span><span class="p">(</span><span class="n">caller</span><span class="p">)</span></div></div>
<div class="viewcode-block" id="CmdDrop"><a class="viewcode-back" href="../../../../api/evennia.commands.default.general.html#evennia.commands.default.general.CmdDrop">[docs]</a><span class="k">class</span> <span class="nc">CmdDrop</span><span class="p">(</span><span class="n">COMMAND_DEFAULT_CLASS</span><span class="p">):</span>
@ -512,11 +517,14 @@
<span class="k">if</span> <span class="ow">not</span> <span class="n">obj</span><span class="o">.</span><span class="n">at_before_drop</span><span class="p">(</span><span class="n">caller</span><span class="p">):</span>
<span class="k">return</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="n">caller</span><span class="o">.</span><span class="n">msg</span><span class="p">(</span><span class="s2">&quot;You drop </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">caller</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"> drops </span><span class="si">%s</span><span class="s2">.&quot;</span> <span class="o">%</span> <span class="p">(</span><span class="n">caller</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">name</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="c1"># Call the object script&#39;s at_drop() method.</span>
<span class="n">obj</span><span class="o">.</span><span class="n">at_drop</span><span class="p">(</span><span class="n">caller</span><span class="p">)</span></div></div>
<span class="n">success</span> <span class="o">=</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="ow">not</span> <span class="n">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;This couldn&#39;t be dropped.&quot;</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 drop </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">caller</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"> drops </span><span class="si">%s</span><span class="s2">.&quot;</span> <span class="o">%</span> <span class="p">(</span><span class="n">caller</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">name</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="c1"># Call the object script&#39;s at_drop() method.</span>
<span class="n">obj</span><span class="o">.</span><span class="n">at_drop</span><span class="p">(</span><span class="n">caller</span><span class="p">)</span></div></div>
<div class="viewcode-block" id="CmdGive"><a class="viewcode-back" href="../../../../api/evennia.commands.default.general.html#evennia.commands.default.general.CmdGive">[docs]</a><span class="k">class</span> <span class="nc">CmdGive</span><span class="p">(</span><span class="n">COMMAND_DEFAULT_CLASS</span><span class="p">):</span>
@ -563,11 +571,14 @@
<span class="k">return</span>
<span class="c1"># give object</span>
<span class="n">caller</span><span class="o">.</span><span class="n">msg</span><span class="p">(</span><span class="s2">&quot;You give </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">to_give</span><span class="o">.</span><span class="n">key</span><span class="p">,</span> <span class="n">target</span><span class="o">.</span><span class="n">key</span><span class="p">))</span>
<span class="n">to_give</span><span class="o">.</span><span class="n">move_to</span><span class="p">(</span><span class="n">target</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">target</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"> gives you </span><span class="si">%s</span><span class="s2">.&quot;</span> <span class="o">%</span> <span class="p">(</span><span class="n">caller</span><span class="o">.</span><span class="n">key</span><span class="p">,</span> <span class="n">to_give</span><span class="o">.</span><span class="n">key</span><span class="p">))</span>
<span class="c1"># Call the object script&#39;s at_give() method.</span>
<span class="n">to_give</span><span class="o">.</span><span class="n">at_give</span><span class="p">(</span><span class="n">caller</span><span class="p">,</span> <span class="n">target</span><span class="p">)</span></div></div>
<span class="n">success</span> <span class="o">=</span> <span class="n">to_give</span><span class="o">.</span><span class="n">move_to</span><span class="p">(</span><span class="n">target</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">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;This could not be given.&quot;</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 give </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">to_give</span><span class="o">.</span><span class="n">key</span><span class="p">,</span> <span class="n">target</span><span class="o">.</span><span class="n">key</span><span class="p">))</span>
<span class="n">target</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"> gives you </span><span class="si">%s</span><span class="s2">.&quot;</span> <span class="o">%</span> <span class="p">(</span><span class="n">caller</span><span class="o">.</span><span class="n">key</span><span class="p">,</span> <span class="n">to_give</span><span class="o">.</span><span class="n">key</span><span class="p">))</span>
<span class="c1"># Call the object script&#39;s at_give() method.</span>
<span class="n">to_give</span><span class="o">.</span><span class="n">at_give</span><span class="p">(</span><span class="n">caller</span><span class="p">,</span> <span class="n">target</span><span class="p">)</span></div></div>
<div class="viewcode-block" id="CmdSetDesc"><a class="viewcode-back" href="../../../../api/evennia.commands.default.general.html#evennia.commands.default.general.CmdSetDesc">[docs]</a><span class="k">class</span> <span class="nc">CmdSetDesc</span><span class="p">(</span><span class="n">COMMAND_DEFAULT_CLASS</span><span class="p">):</span>

View file

@ -243,12 +243,6 @@
<span class="k">else</span><span class="p">:</span>
<span class="bp">self</span><span class="o">.</span><span class="n">character</span> <span class="o">=</span> <span class="kc">None</span></div>
<span class="k">def</span> <span class="nf">get_command_info</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> Update of parent class&#39;s get_command_info() for MuxCommand.</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="bp">self</span><span class="o">.</span><span class="n">get_command_info</span><span class="p">()</span>
<div class="viewcode-block" id="MuxCommand.get_command_info"><a class="viewcode-back" href="../../../../api/evennia.commands.default.muxcommand.html#evennia.commands.default.muxcommand.MuxCommand.get_command_info">[docs]</a> <span class="k">def</span> <span class="nf">get_command_info</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> Update of parent class&#39;s get_command_info() for MuxCommand.</span>

View file

@ -489,7 +489,9 @@
<span class="n">table</span><span class="o">.</span><span class="n">add_row</span><span class="p">(</span>
<span class="n">script</span><span class="o">.</span><span class="n">id</span><span class="p">,</span>
<span class="n">script</span><span class="o">.</span><span class="n">obj</span><span class="o">.</span><span class="n">key</span> <span class="k">if</span> <span class="p">(</span><span class="nb">hasattr</span><span class="p">(</span><span class="n">script</span><span class="p">,</span> <span class="s2">&quot;obj&quot;</span><span class="p">)</span> <span class="ow">and</span> <span class="n">script</span><span class="o">.</span><span class="n">obj</span><span class="p">)</span> <span class="k">else</span> <span class="s2">&quot;&lt;Global&gt;&quot;</span><span class="p">,</span>
<span class="n">f</span><span class="s2">&quot;</span><span class="si">{script.obj.key}</span><span class="s2">(</span><span class="si">{script.obj.dbref}</span><span class="s2">)&quot;</span>
<span class="k">if</span> <span class="p">(</span><span class="nb">hasattr</span><span class="p">(</span><span class="n">script</span><span class="p">,</span> <span class="s2">&quot;obj&quot;</span><span class="p">)</span> <span class="ow">and</span> <span class="n">script</span><span class="o">.</span><span class="n">obj</span><span class="p">)</span>
<span class="k">else</span> <span class="s2">&quot;&lt;Global&gt;&quot;</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="n">script</span><span class="o">.</span><span class="n">interval</span> <span class="k">if</span> <span class="n">script</span><span class="o">.</span><span class="n">interval</span> <span class="o">&gt;</span> <span class="mi">0</span> <span class="k">else</span> <span class="s2">&quot;--&quot;</span><span class="p">,</span>
<span class="n">nextrep</span><span class="p">,</span>

View file

@ -58,7 +58,7 @@
<span class="kn">from</span> <span class="nn">anything</span> <span class="k">import</span> <span class="n">Anything</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">mock</span> <span class="k">import</span> <span class="n">Mock</span><span class="p">,</span> <span class="n">mock</span>
<span class="kn">from</span> <span class="nn">unittest.mock</span> <span class="k">import</span> <span class="n">patch</span><span class="p">,</span> <span class="n">Mock</span><span class="p">,</span> <span class="n">MagicMock</span>
<span class="kn">from</span> <span class="nn">evennia</span> <span class="k">import</span> <span class="n">DefaultRoom</span><span class="p">,</span> <span class="n">DefaultExit</span><span class="p">,</span> <span class="n">ObjectDB</span>
<span class="kn">from</span> <span class="nn">evennia.commands.default.cmdset_character</span> <span class="k">import</span> <span class="n">CharacterCmdSet</span>
@ -97,7 +97,8 @@
<span class="c1"># ------------------------------------------------------------</span>
<div class="viewcode-block" id="CommandTest"><a class="viewcode-back" href="../../../../api/evennia.commands.default.tests.html#evennia.commands.default.tests.CommandTest">[docs]</a><span class="k">class</span> <span class="nc">CommandTest</span><span class="p">(</span><span class="n">EvenniaTest</span><span class="p">):</span>
<div class="viewcode-block" id="CommandTest"><a class="viewcode-back" href="../../../../api/evennia.commands.default.tests.html#evennia.commands.default.tests.CommandTest">[docs]</a><span class="nd">@patch</span><span class="p">(</span><span class="s2">&quot;evennia.server.portal.portal.LoopingCall&quot;</span><span class="p">,</span> <span class="n">new</span><span class="o">=</span><span class="n">MagicMock</span><span class="p">())</span>
<span class="k">class</span> <span class="nc">CommandTest</span><span class="p">(</span><span class="n">EvenniaTest</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> Tests a command</span>
<span class="sd"> &quot;&quot;&quot;</span>
@ -190,11 +191,18 @@
<span class="n">returned_msg</span> <span class="o">=</span> <span class="n">msg_sep</span><span class="o">.</span><span class="n">join</span><span class="p">(</span>
<span class="n">_RE</span><span class="o">.</span><span class="n">sub</span><span class="p">(</span><span class="s2">&quot;&quot;</span><span class="p">,</span> <span class="n">ansi</span><span class="o">.</span><span class="n">parse_ansi</span><span class="p">(</span><span class="n">mess</span><span class="p">,</span> <span class="n">strip_ansi</span><span class="o">=</span><span class="n">noansi</span><span class="p">))</span> <span class="k">for</span> <span class="n">mess</span> <span class="ow">in</span> <span class="n">stored_msg</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="n">msg</span> <span class="o">==</span> <span class="s2">&quot;&quot;</span> <span class="ow">and</span> <span class="n">returned_msg</span> <span class="ow">or</span> <span class="ow">not</span> <span class="n">returned_msg</span><span class="o">.</span><span class="n">startswith</span><span class="p">(</span><span class="n">msg</span><span class="o">.</span><span class="n">strip</span><span class="p">()):</span>
<span class="n">msg</span> <span class="o">=</span> <span class="n">msg</span><span class="o">.</span><span class="n">strip</span><span class="p">()</span>
<span class="k">if</span> <span class="n">msg</span> <span class="o">==</span> <span class="s2">&quot;&quot;</span> <span class="ow">and</span> <span class="n">returned_msg</span> <span class="ow">or</span> <span class="ow">not</span> <span class="n">returned_msg</span><span class="o">.</span><span class="n">startswith</span><span class="p">(</span><span class="n">msg</span><span class="p">):</span>
<span class="n">prt</span> <span class="o">=</span> <span class="s2">&quot;&quot;</span>
<span class="k">for</span> <span class="n">ic</span><span class="p">,</span> <span class="n">char</span> <span class="ow">in</span> <span class="nb">enumerate</span><span class="p">(</span><span class="n">msg</span><span class="p">):</span>
<span class="kn">import</span> <span class="nn">re</span>
<span class="n">prt</span> <span class="o">+=</span> <span class="n">char</span>
<span class="n">sep1</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;=&quot;</span> <span class="o">*</span> <span class="mi">30</span> <span class="o">+</span> <span class="s2">&quot;Wanted message&quot;</span> <span class="o">+</span> <span class="s2">&quot;=&quot;</span> <span class="o">*</span> <span class="mi">34</span> <span class="o">+</span> <span class="s2">&quot;</span><span class="se">\n</span><span class="s2">&quot;</span>
<span class="n">sep2</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;=&quot;</span> <span class="o">*</span> <span class="mi">30</span> <span class="o">+</span> <span class="s2">&quot;Returned message&quot;</span> <span class="o">+</span> <span class="s2">&quot;=&quot;</span> <span class="o">*</span> <span class="mi">32</span> <span class="o">+</span> <span class="s2">&quot;</span><span class="se">\n</span><span class="s2">&quot;</span>
<span class="n">sep3</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;=&quot;</span> <span class="o">*</span> <span class="mi">78</span>
<span class="n">retval</span> <span class="o">=</span> <span class="n">sep1</span> <span class="o">+</span> <span class="n">msg</span><span class="o">.</span><span class="n">strip</span><span class="p">()</span> <span class="o">+</span> <span class="n">sep2</span> <span class="o">+</span> <span class="n">returned_msg</span> <span class="o">+</span> <span class="n">sep3</span>
<span class="n">retval</span> <span class="o">=</span> <span class="n">sep1</span> <span class="o">+</span> <span class="n">msg</span> <span class="o">+</span> <span class="n">sep2</span> <span class="o">+</span> <span class="n">returned_msg</span> <span class="o">+</span> <span class="n">sep3</span>
<span class="k">raise</span> <span class="ne">AssertionError</span><span class="p">(</span><span class="n">retval</span><span class="p">)</span>
<span class="k">else</span><span class="p">:</span>
<span class="n">returned_msg</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">str</span><span class="p">(</span><span class="n">msg</span><span class="p">)</span> <span class="k">for</span> <span class="n">msg</span> <span class="ow">in</span> <span class="n">stored_msg</span><span class="p">)</span>
@ -400,11 +408,29 @@
<span class="bp">self</span><span class="o">.</span><span class="n">call</span><span class="p">(</span><span class="n">account</span><span class="o">.</span><span class="n">CmdOOC</span><span class="p">(),</span> <span class="s2">&quot;&quot;</span><span class="p">,</span> <span class="s2">&quot;You go OOC.&quot;</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">account</span><span class="p">)</span></div>
<div class="viewcode-block" id="TestAccount.test_ic"><a class="viewcode-back" href="../../../../api/evennia.commands.default.tests.html#evennia.commands.default.tests.TestAccount.test_ic">[docs]</a> <span class="k">def</span> <span class="nf">test_ic</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="bp">self</span><span class="o">.</span><span class="n">account</span><span class="o">.</span><span class="n">db</span><span class="o">.</span><span class="n">_playable_characters</span> <span class="o">=</span> <span class="p">[</span><span class="bp">self</span><span class="o">.</span><span class="n">char1</span><span class="p">]</span>
<span class="bp">self</span><span class="o">.</span><span class="n">account</span><span class="o">.</span><span class="n">unpuppet_object</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">session</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">call</span><span class="p">(</span>
<span class="n">account</span><span class="o">.</span><span class="n">CmdIC</span><span class="p">(),</span> <span class="s2">&quot;Char&quot;</span><span class="p">,</span> <span class="s2">&quot;You become Char.&quot;</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">account</span><span class="p">,</span> <span class="n">receiver</span><span class="o">=</span><span class="bp">self</span><span class="o">.</span><span class="n">char1</span>
<span class="p">)</span></div>
<div class="viewcode-block" id="TestAccount.test_ic__other_object"><a class="viewcode-back" href="../../../../api/evennia.commands.default.tests.html#evennia.commands.default.tests.TestAccount.test_ic__other_object">[docs]</a> <span class="k">def</span> <span class="nf">test_ic__other_object</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="bp">self</span><span class="o">.</span><span class="n">account</span><span class="o">.</span><span class="n">db</span><span class="o">.</span><span class="n">_playable_characters</span> <span class="o">=</span> <span class="p">[</span><span class="bp">self</span><span class="o">.</span><span class="n">obj1</span><span class="p">]</span>
<span class="bp">self</span><span class="o">.</span><span class="n">account</span><span class="o">.</span><span class="n">unpuppet_object</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">session</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">call</span><span class="p">(</span>
<span class="n">account</span><span class="o">.</span><span class="n">CmdIC</span><span class="p">(),</span> <span class="s2">&quot;Obj&quot;</span><span class="p">,</span> <span class="s2">&quot;You become Obj.&quot;</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">account</span><span class="p">,</span> <span class="n">receiver</span><span class="o">=</span><span class="bp">self</span><span class="o">.</span><span class="n">obj1</span>
<span class="p">)</span></div>
<div class="viewcode-block" id="TestAccount.test_ic__nonaccess"><a class="viewcode-back" href="../../../../api/evennia.commands.default.tests.html#evennia.commands.default.tests.TestAccount.test_ic__nonaccess">[docs]</a> <span class="k">def</span> <span class="nf">test_ic__nonaccess</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="bp">self</span><span class="o">.</span><span class="n">account</span><span class="o">.</span><span class="n">unpuppet_object</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">session</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">call</span><span class="p">(</span>
<span class="n">account</span><span class="o">.</span><span class="n">CmdIC</span><span class="p">(),</span>
<span class="s2">&quot;Nonexistent&quot;</span><span class="p">,</span>
<span class="s2">&quot;That is not a valid character choice.&quot;</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">account</span><span class="p">,</span>
<span class="n">receiver</span><span class="o">=</span><span class="bp">self</span><span class="o">.</span><span class="n">account</span><span class="p">,</span>
<span class="p">)</span></div>
<div class="viewcode-block" id="TestAccount.test_password"><a class="viewcode-back" href="../../../../api/evennia.commands.default.tests.html#evennia.commands.default.tests.TestAccount.test_password">[docs]</a> <span class="k">def</span> <span class="nf">test_password</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="bp">self</span><span class="o">.</span><span class="n">call</span><span class="p">(</span>
<span class="n">account</span><span class="o">.</span><span class="n">CmdPassword</span><span class="p">(),</span>
@ -510,10 +536,18 @@
<span class="bp">self</span><span class="o">.</span><span class="n">call</span><span class="p">(</span><span class="n">building</span><span class="o">.</span><span class="n">CmdExamine</span><span class="p">(),</span> <span class="s2">&quot;*TestAccount&quot;</span><span class="p">,</span> <span class="s2">&quot;Name/key: TestAccount&quot;</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">char1</span><span class="o">.</span><span class="n">db</span><span class="o">.</span><span class="n">test</span> <span class="o">=</span> <span class="s2">&quot;testval&quot;</span>
<span class="bp">self</span><span class="o">.</span><span class="n">call</span><span class="p">(</span><span class="n">building</span><span class="o">.</span><span class="n">CmdExamine</span><span class="p">(),</span> <span class="s2">&quot;self/test&quot;</span><span class="p">,</span> <span class="s2">&quot;Persistent attributes:</span><span class="se">\n</span><span class="s2"> test = testval&quot;</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">call</span><span class="p">(</span><span class="n">building</span><span class="o">.</span><span class="n">CmdExamine</span><span class="p">(),</span> <span class="s2">&quot;self/test&quot;</span><span class="p">,</span> <span class="s2">&quot;Persistent attribute(s):</span><span class="se">\n</span><span class="s2"> test = testval&quot;</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">call</span><span class="p">(</span><span class="n">building</span><span class="o">.</span><span class="n">CmdExamine</span><span class="p">(),</span> <span class="s2">&quot;NotFound&quot;</span><span class="p">,</span> <span class="s2">&quot;Could not find &#39;NotFound&#39;.&quot;</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">call</span><span class="p">(</span><span class="n">building</span><span class="o">.</span><span class="n">CmdExamine</span><span class="p">(),</span> <span class="s2">&quot;out&quot;</span><span class="p">,</span> <span class="s2">&quot;Name/key: out&quot;</span><span class="p">)</span>
<span class="c1"># escape inlinefuncs</span>
<span class="bp">self</span><span class="o">.</span><span class="n">char1</span><span class="o">.</span><span class="n">db</span><span class="o">.</span><span class="n">test2</span> <span class="o">=</span> <span class="s2">&quot;this is a $random() value.&quot;</span>
<span class="bp">self</span><span class="o">.</span><span class="n">call</span><span class="p">(</span>
<span class="n">building</span><span class="o">.</span><span class="n">CmdExamine</span><span class="p">(),</span>
<span class="s2">&quot;self/test2&quot;</span><span class="p">,</span>
<span class="s2">&quot;Persistent attribute(s):</span><span class="se">\n</span><span class="s2"> test2 = this is a \$random() value.&quot;</span><span class="p">,</span>
<span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">room1</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">script</span><span class="o">.</span><span class="vm">__class__</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">call</span><span class="p">(</span><span class="n">building</span><span class="o">.</span><span class="n">CmdExamine</span><span class="p">(),</span> <span class="s2">&quot;&quot;</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">account</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">script</span><span class="o">.</span><span class="vm">__class__</span><span class="p">)</span>
@ -559,7 +593,7 @@
<span class="bp">self</span><span class="o">.</span><span class="n">call</span><span class="p">(</span><span class="n">building</span><span class="o">.</span><span class="n">CmdSetAttribute</span><span class="p">(),</span> <span class="s2">&quot;Obj2/test2&quot;</span><span class="p">,</span> <span class="s2">&quot;Attribute Obj2/test2 = value2&quot;</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">call</span><span class="p">(</span><span class="n">building</span><span class="o">.</span><span class="n">CmdSetAttribute</span><span class="p">(),</span> <span class="s2">&quot;Obj2/NotFound&quot;</span><span class="p">,</span> <span class="s2">&quot;Obj2 has no attribute &#39;notfound&#39;.&quot;</span><span class="p">)</span>
<span class="k">with</span> <span class="n">mock</span><span class="o">.</span><span class="n">patch</span><span class="p">(</span><span class="s2">&quot;evennia.commands.default.building.EvEditor&quot;</span><span class="p">)</span> <span class="k">as</span> <span class="n">mock_ed</span><span class="p">:</span>
<span class="k">with</span> <span class="n">patch</span><span class="p">(</span><span class="s2">&quot;evennia.commands.default.building.EvEditor&quot;</span><span class="p">)</span> <span class="k">as</span> <span class="n">mock_ed</span><span class="p">:</span>
<span class="bp">self</span><span class="o">.</span><span class="n">call</span><span class="p">(</span><span class="n">building</span><span class="o">.</span><span class="n">CmdSetAttribute</span><span class="p">(),</span> <span class="s2">&quot;/edit Obj2/test3&quot;</span><span class="p">)</span>
<span class="n">mock_ed</span><span class="o">.</span><span class="n">assert_called_with</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">char1</span><span class="p">,</span> <span class="n">Anything</span><span class="p">,</span> <span class="n">Anything</span><span class="p">,</span> <span class="n">key</span><span class="o">=</span><span class="s2">&quot;Obj2/test3&quot;</span><span class="p">)</span>
@ -843,7 +877,7 @@
<span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">call</span><span class="p">(</span><span class="n">building</span><span class="o">.</span><span class="n">CmdDesc</span><span class="p">(),</span> <span class="s2">&quot;&quot;</span><span class="p">,</span> <span class="s2">&quot;Usage: &quot;</span><span class="p">)</span>
<span class="k">with</span> <span class="n">mock</span><span class="o">.</span><span class="n">patch</span><span class="p">(</span><span class="s2">&quot;evennia.commands.default.building.EvEditor&quot;</span><span class="p">)</span> <span class="k">as</span> <span class="n">mock_ed</span><span class="p">:</span>
<span class="k">with</span> <span class="n">patch</span><span class="p">(</span><span class="s2">&quot;evennia.commands.default.building.EvEditor&quot;</span><span class="p">)</span> <span class="k">as</span> <span class="n">mock_ed</span><span class="p">:</span>
<span class="bp">self</span><span class="o">.</span><span class="n">call</span><span class="p">(</span><span class="n">building</span><span class="o">.</span><span class="n">CmdDesc</span><span class="p">(),</span> <span class="s2">&quot;/edit&quot;</span><span class="p">)</span>
<span class="n">mock_ed</span><span class="o">.</span><span class="n">assert_called_with</span><span class="p">(</span>
<span class="bp">self</span><span class="o">.</span><span class="n">char1</span><span class="p">,</span>
@ -1058,9 +1092,9 @@
<span class="p">}</span>
<span class="p">)</span>
<span class="p">]</span>
<span class="k">with</span> <span class="n">mock</span><span class="o">.</span><span class="n">patch</span><span class="p">(</span>
<span class="k">with</span> <span class="n">patch</span><span class="p">(</span>
<span class="s2">&quot;evennia.commands.default.building.protlib.search_prototype&quot;</span><span class="p">,</span>
<span class="n">new</span><span class="o">=</span><span class="n">mock</span><span class="o">.</span><span class="n">MagicMock</span><span class="p">(</span><span class="n">return_value</span><span class="o">=</span><span class="n">test_prototype</span><span class="p">),</span>
<span class="n">new</span><span class="o">=</span><span class="n">MagicMock</span><span class="p">(</span><span class="n">return_value</span><span class="o">=</span><span class="n">test_prototype</span><span class="p">),</span>
<span class="p">)</span> <span class="k">as</span> <span class="n">mprot</span><span class="p">:</span>
<span class="bp">self</span><span class="o">.</span><span class="n">call</span><span class="p">(</span>
<span class="n">building</span><span class="o">.</span><span class="n">CmdTypeclass</span><span class="p">(),</span>
@ -1126,7 +1160,7 @@
<span class="bp">self</span><span class="o">.</span><span class="n">call</span><span class="p">(</span><span class="n">building</span><span class="o">.</span><span class="n">CmdFind</span><span class="p">(),</span> <span class="s2">&quot;/exact Obj&quot;</span><span class="p">,</span> <span class="s2">&quot;One Match&quot;</span><span class="p">)</span>
<span class="c1"># Test multitype filtering</span>
<span class="k">with</span> <span class="n">mock</span><span class="o">.</span><span class="n">patch</span><span class="p">(</span>
<span class="k">with</span> <span class="n">patch</span><span class="p">(</span>
<span class="s2">&quot;evennia.commands.default.building.CHAR_TYPECLASS&quot;</span><span class="p">,</span>
<span class="s2">&quot;evennia.objects.objects.DefaultCharacter&quot;</span><span class="p">,</span>
<span class="p">):</span>
@ -1166,7 +1200,7 @@
<span class="s2">&quot;= Obj&quot;</span><span class="p">,</span>
<span class="s2">&quot;To create a global script you need scripts/add &lt;typeclass&gt;.&quot;</span><span class="p">,</span>
<span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">call</span><span class="p">(</span><span class="n">building</span><span class="o">.</span><span class="n">CmdScript</span><span class="p">(),</span> <span class="s2">&quot;Obj = &quot;</span><span class="p">,</span> <span class="s2">&quot;dbref obj&quot;</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">call</span><span class="p">(</span><span class="n">building</span><span class="o">.</span><span class="n">CmdScript</span><span class="p">(),</span> <span class="s2">&quot;Obj = &quot;</span><span class="p">,</span> <span class="s2">&quot;dbref obj&quot;</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">call</span><span class="p">(</span>
<span class="n">building</span><span class="o">.</span><span class="n">CmdScript</span><span class="p">(),</span> <span class="s2">&quot;/start Obj&quot;</span><span class="p">,</span> <span class="s2">&quot;0 scripts started on Obj&quot;</span>
@ -1594,11 +1628,11 @@
<span class="bp">self</span><span class="o">.</span><span class="n">call</span><span class="p">(</span><span class="n">multimatch</span><span class="p">,</span> <span class="s2">&quot;look&quot;</span><span class="p">,</span> <span class="s2">&quot;&quot;</span><span class="p">)</span></div>
<div class="viewcode-block" id="TestSystemCommands.test_channelcommand"><a class="viewcode-back" href="../../../../api/evennia.commands.default.tests.html#evennia.commands.default.tests.TestSystemCommands.test_channelcommand">[docs]</a> <span class="nd">@mock</span><span class="o">.</span><span class="n">patch</span><span class="p">(</span><span class="s2">&quot;evennia.commands.default.syscommands.ChannelDB&quot;</span><span class="p">)</span>
<div class="viewcode-block" id="TestSystemCommands.test_channelcommand"><a class="viewcode-back" href="../../../../api/evennia.commands.default.tests.html#evennia.commands.default.tests.TestSystemCommands.test_channelcommand">[docs]</a> <span class="nd">@patch</span><span class="p">(</span><span class="s2">&quot;evennia.commands.default.syscommands.ChannelDB&quot;</span><span class="p">)</span>
<span class="k">def</span> <span class="nf">test_channelcommand</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">mock_channeldb</span><span class="p">):</span>
<span class="n">channel</span> <span class="o">=</span> <span class="n">mock</span><span class="o">.</span><span class="n">MagicMock</span><span class="p">()</span>
<span class="n">channel</span><span class="o">.</span><span class="n">msg</span> <span class="o">=</span> <span class="n">mock</span><span class="o">.</span><span class="n">MagicMock</span><span class="p">()</span>
<span class="n">mock_channeldb</span><span class="o">.</span><span class="n">objects</span><span class="o">.</span><span class="n">get_channel</span> <span class="o">=</span> <span class="n">mock</span><span class="o">.</span><span class="n">MagicMock</span><span class="p">(</span><span class="n">return_value</span><span class="o">=</span><span class="n">channel</span><span class="p">)</span>
<span class="n">channel</span> <span class="o">=</span> <span class="n">MagicMock</span><span class="p">()</span>
<span class="n">channel</span><span class="o">.</span><span class="n">msg</span> <span class="o">=</span> <span class="n">MagicMock</span><span class="p">()</span>
<span class="n">mock_channeldb</span><span class="o">.</span><span class="n">objects</span><span class="o">.</span><span class="n">get_channel</span> <span class="o">=</span> <span class="n">MagicMock</span><span class="p">(</span><span class="n">return_value</span><span class="o">=</span><span class="n">channel</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">call</span><span class="p">(</span><span class="n">syscommands</span><span class="o">.</span><span class="n">SystemSendToChannel</span><span class="p">(),</span> <span class="s2">&quot;public:Hello&quot;</span><span class="p">)</span>
<span class="n">channel</span><span class="o">.</span><span class="n">msg</span><span class="o">.</span><span class="n">assert_called</span><span class="p">()</span></div></div>

View file

@ -91,7 +91,9 @@
<span class="k">if</span> <span class="n">cdict</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s2">&quot;keep_log&quot;</span><span class="p">):</span>
<span class="bp">self</span><span class="o">.</span><span class="n">attributes</span><span class="o">.</span><span class="n">add</span><span class="p">(</span><span class="s2">&quot;keep_log&quot;</span><span class="p">,</span> <span class="n">cdict</span><span class="p">[</span><span class="s2">&quot;keep_log&quot;</span><span class="p">])</span>
<span class="k">if</span> <span class="n">cdict</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s2">&quot;desc&quot;</span><span class="p">):</span>
<span class="bp">self</span><span class="o">.</span><span class="n">attributes</span><span class="o">.</span><span class="n">add</span><span class="p">(</span><span class="s2">&quot;desc&quot;</span><span class="p">,</span> <span class="n">cdict</span><span class="p">[</span><span class="s2">&quot;desc&quot;</span><span class="p">])</span></div>
<span class="bp">self</span><span class="o">.</span><span class="n">attributes</span><span class="o">.</span><span class="n">add</span><span class="p">(</span><span class="s2">&quot;desc&quot;</span><span class="p">,</span> <span class="n">cdict</span><span class="p">[</span><span class="s2">&quot;desc&quot;</span><span class="p">])</span>
<span class="k">if</span> <span class="n">cdict</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s2">&quot;tags&quot;</span><span class="p">):</span>
<span class="bp">self</span><span class="o">.</span><span class="n">tags</span><span class="o">.</span><span class="n">batch_add</span><span class="p">(</span><span class="o">*</span><span class="n">cdict</span><span class="p">[</span><span class="s2">&quot;tags&quot;</span><span class="p">])</span></div>
<div class="viewcode-block" id="DefaultChannel.basetype_setup"><a class="viewcode-back" href="../../../api/evennia.comms.comms.html#evennia.comms.comms.DefaultChannel.basetype_setup">[docs]</a> <span class="k">def</span> <span class="nf">basetype_setup</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="c1"># delayed import of the channelhandler</span>
@ -435,7 +437,8 @@
<span class="sd"> to build senders for the message.</span>
<span class="sd"> sender_strings (list, optional): Name strings of senders. Used for external</span>
<span class="sd"> connections where the sender is not an account or object.</span>
<span class="sd"> When this is defined, external will be assumed.</span>
<span class="sd"> When this is defined, external will be assumed. The list will be </span>
<span class="sd"> filtered so each sender-string only occurs once.</span>
<span class="sd"> keep_log (bool or None, optional): This allows to temporarily change the logging status of</span>
<span class="sd"> this channel message. If `None`, the Channel&#39;s `keep_log` Attribute will</span>
<span class="sd"> be used. If `True` or `False`, that logging status will be used for this</span>
@ -466,6 +469,8 @@
<span class="n">msgobj</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">pre_send_message</span><span class="p">(</span><span class="n">msgobj</span><span class="p">)</span>
<span class="k">if</span> <span class="ow">not</span> <span class="n">msgobj</span><span class="p">:</span>
<span class="k">return</span> <span class="kc">False</span>
<span class="k">if</span> <span class="n">sender_strings</span><span class="p">:</span>
<span class="n">sender_strings</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">make_iter</span><span class="p">(</span><span class="n">sender_strings</span><span class="p">)))</span>
<span class="n">msgobj</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">message_transform</span><span class="p">(</span>
<span class="n">msgobj</span><span class="p">,</span> <span class="n">emit</span><span class="o">=</span><span class="n">emit</span><span class="p">,</span> <span class="n">sender_strings</span><span class="o">=</span><span class="n">sender_strings</span><span class="p">,</span> <span class="n">external</span><span class="o">=</span><span class="n">external</span>
<span class="p">)</span>

View file

@ -184,9 +184,9 @@
<span class="sd"> &quot;&quot;&quot;</span>
<span class="k">try</span><span class="p">:</span>
<span class="k">if</span> <span class="n">text</span> <span class="ow">and</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">text</span><span class="p">,</span> <span class="nb">tuple</span><span class="p">):</span>
<span class="n">text</span> <span class="o">=</span> <span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">_RE_GENDER_PRONOUN</span><span class="o">.</span><span class="n">sub</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">_get_pronoun</span><span class="p">,</span> <span class="n">text</span><span class="p">[</span><span class="mi">0</span><span class="p">]),</span> <span class="o">*</span><span class="n">text</span><span class="p">[</span><span class="mi">1</span><span class="p">:])</span>
<span class="n">text</span> <span class="o">=</span> <span class="p">(</span><span class="n">_RE_GENDER_PRONOUN</span><span class="o">.</span><span class="n">sub</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">_get_pronoun</span><span class="p">,</span> <span class="n">text</span><span class="p">[</span><span class="mi">0</span><span class="p">]),</span> <span class="o">*</span><span class="n">text</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">text</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_RE_GENDER_PRONOUN</span><span class="o">.</span><span class="n">sub</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">_get_pronoun</span><span class="p">,</span> <span class="n">text</span><span class="p">)</span>
<span class="n">text</span> <span class="o">=</span> <span class="n">_RE_GENDER_PRONOUN</span><span class="o">.</span><span class="n">sub</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">_get_pronoun</span><span class="p">,</span> <span class="n">text</span><span class="p">)</span>
<span class="k">except</span> <span class="ne">TypeError</span><span class="p">:</span>
<span class="k">pass</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>

View file

@ -119,7 +119,7 @@
<span class="sd">instead of the default:</span>
<span class="sd"> class Character(TBRangeCharacter):</span>
<span class="sd"> </span>
<span class="sd">Do the same thing in your game&#39;s objects.py module for TBRangeObject:</span>
<span class="sd"> from evennia.contrib.turnbattle.tb_range import TBRangeObject</span>
@ -287,10 +287,10 @@
<div class="viewcode-block" id="at_defeat"><a class="viewcode-back" href="../../../../api/evennia.contrib.turnbattle.tb_range.html#evennia.contrib.turnbattle.tb_range.at_defeat">[docs]</a><span class="k">def</span> <span class="nf">at_defeat</span><span class="p">(</span><span class="n">defeated</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> Announces the defeat of a fighter in combat.</span>
<span class="sd"> </span>
<span class="sd"> Args:</span>
<span class="sd"> defeated (obj): Fighter that&#39;s been defeated.</span>
<span class="sd"> </span>
<span class="sd"> Notes:</span>
<span class="sd"> All this does is announce a defeat message by default, but if you</span>
<span class="sd"> want anything else to happen to defeated fighters (like putting them</span>
@ -341,11 +341,11 @@
<div class="viewcode-block" id="get_range"><a class="viewcode-back" href="../../../../api/evennia.contrib.turnbattle.tb_range.html#evennia.contrib.turnbattle.tb_range.get_range">[docs]</a><span class="k">def</span> <span class="nf">get_range</span><span class="p">(</span><span class="n">obj1</span><span class="p">,</span> <span class="n">obj2</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> Gets the combat range between two objects.</span>
<span class="sd"> </span>
<span class="sd"> Args:</span>
<span class="sd"> obj1 (obj): First object</span>
<span class="sd"> obj2 (obj): Second object</span>
<span class="sd"> </span>
<span class="sd"> Returns:</span>
<span class="sd"> range (int or None): Distance between two objects or None if not applicable</span>
<span class="sd"> &quot;&quot;&quot;</span>
@ -365,7 +365,7 @@
<div class="viewcode-block" id="distance_inc"><a class="viewcode-back" href="../../../../api/evennia.contrib.turnbattle.tb_range.html#evennia.contrib.turnbattle.tb_range.distance_inc">[docs]</a><span class="k">def</span> <span class="nf">distance_inc</span><span class="p">(</span><span class="n">mover</span><span class="p">,</span> <span class="n">target</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> Function that increases distance in range field between mover and target.</span>
<span class="sd"> </span>
<span class="sd"> Args:</span>
<span class="sd"> mover (obj): The object moving</span>
<span class="sd"> target (obj): The object to be moved away from</span>
@ -381,11 +381,11 @@
<div class="viewcode-block" id="approach"><a class="viewcode-back" href="../../../../api/evennia.contrib.turnbattle.tb_range.html#evennia.contrib.turnbattle.tb_range.approach">[docs]</a><span class="k">def</span> <span class="nf">approach</span><span class="p">(</span><span class="n">mover</span><span class="p">,</span> <span class="n">target</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> Manages a character&#39;s whole approach, including changes in ranges to other characters.</span>
<span class="sd"> </span>
<span class="sd"> Args:</span>
<span class="sd"> mover (obj): The object moving</span>
<span class="sd"> target (obj): The object to be moved toward</span>
<span class="sd"> </span>
<span class="sd"> Notes:</span>
<span class="sd"> The mover will also automatically move toward any objects that are closer to the</span>
<span class="sd"> target than the mover is. The mover will also move away from anything they started</span>
@ -395,7 +395,7 @@
<span class="k">def</span> <span class="nf">distance_dec</span><span class="p">(</span><span class="n">mover</span><span class="p">,</span> <span class="n">target</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> Helper function that decreases distance in range field between mover and target.</span>
<span class="sd"> </span>
<span class="sd"> Args:</span>
<span class="sd"> mover (obj): The object moving</span>
<span class="sd"> target (obj): The object to be moved toward</span>
@ -429,11 +429,11 @@
<div class="viewcode-block" id="withdraw"><a class="viewcode-back" href="../../../../api/evennia.contrib.turnbattle.tb_range.html#evennia.contrib.turnbattle.tb_range.withdraw">[docs]</a><span class="k">def</span> <span class="nf">withdraw</span><span class="p">(</span><span class="n">mover</span><span class="p">,</span> <span class="n">target</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> Manages a character&#39;s whole withdrawal, including changes in ranges to other characters.</span>
<span class="sd"> </span>
<span class="sd"> Args:</span>
<span class="sd"> mover (obj): The object moving</span>
<span class="sd"> target (obj): The object to be moved away from</span>
<span class="sd"> </span>
<span class="sd"> Notes:</span>
<span class="sd"> The mover will also automatically move away from objects that are close to the target</span>
<span class="sd"> of their withdrawl. The mover will never inadvertently move toward anything else while</span>
@ -581,7 +581,8 @@
<span class="sd"> room as its object.</span>
<span class="sd"> Fights persist until only one participant is left with any HP or all</span>
<span class="sd"> remaining participants choose to end the combat with the &#39;disengage&#39; command.</span>
<span class="sd"> remaining participants choose to end the combat with the &#39;disengage&#39;</span>
<span class="sd"> command.</span>
<span class="sd"> &quot;&quot;&quot;</span>
<div class="viewcode-block" id="TBRangeTurnHandler.at_script_creation"><a class="viewcode-back" href="../../../../api/evennia.contrib.turnbattle.tb_range.html#evennia.contrib.turnbattle.tb_range.TBRangeTurnHandler.at_script_creation">[docs]</a> <span class="k">def</span> <span class="nf">at_script_creation</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
@ -656,7 +657,7 @@
<div class="viewcode-block" id="TBRangeTurnHandler.init_range"><a class="viewcode-back" href="../../../../api/evennia.contrib.turnbattle.tb_range.html#evennia.contrib.turnbattle.tb_range.TBRangeTurnHandler.init_range">[docs]</a> <span class="k">def</span> <span class="nf">init_range</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">to_init</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> Initializes range values for an object at the start of a fight.</span>
<span class="sd"> </span>
<span class="sd"> Args:</span>
<span class="sd"> to_init (object): Object to initialize range field for.</span>
<span class="sd"> &quot;&quot;&quot;</span>
@ -679,14 +680,13 @@
<div class="viewcode-block" id="TBRangeTurnHandler.join_rangefield"><a class="viewcode-back" href="../../../../api/evennia.contrib.turnbattle.tb_range.html#evennia.contrib.turnbattle.tb_range.TBRangeTurnHandler.join_rangefield">[docs]</a> <span class="k">def</span> <span class="nf">join_rangefield</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">to_init</span><span class="p">,</span> <span class="n">anchor_obj</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span> <span class="n">add_distance</span><span class="o">=</span><span class="mi">0</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> Adds a new object to the range field of a fight in progress.</span>
<span class="sd"> </span>
<span class="sd"> Args:</span>
<span class="sd"> to_init (object): Object to initialize range field for.</span>
<span class="sd"> </span>
<span class="sd"> Keyword args:</span>
<span class="sd"> anchor_obj (object): Object to copy range values from, or None for a random object.</span>
<span class="sd"> add_distance (int): Distance to put between to_init object and anchor object.</span>
<span class="sd"> </span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="c1"># Get a list of room&#39;s contents without to_init object.</span>
<span class="n">contents</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">obj</span><span class="o">.</span><span class="n">contents</span>

View file

@ -580,7 +580,9 @@
<span class="sd"> Only true if accessed_obj has the specified tag and optional</span>
<span class="sd"> category.</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="k">return</span> <span class="nb">bool</span><span class="p">(</span><span class="n">accessed_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="o">*</span><span class="n">args</span><span class="p">))</span></div>
<span class="n">tagkey</span> <span class="o">=</span> <span class="n">args</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span> <span class="k">if</span> <span class="n">args</span> <span class="k">else</span> <span class="kc">None</span>
<span class="n">category</span> <span class="o">=</span> <span class="n">args</span><span class="p">[</span><span class="mi">1</span><span class="p">]</span> <span class="k">if</span> <span class="nb">len</span><span class="p">(</span><span class="n">args</span><span class="p">)</span> <span class="o">&gt;</span> <span class="mi">1</span> <span class="k">else</span> <span class="kc">None</span>
<span class="k">return</span> <span class="nb">bool</span><span class="p">(</span><span class="n">accessed_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">tagkey</span><span class="p">,</span> <span class="n">category</span><span class="o">=</span><span class="n">category</span><span class="p">))</span></div>
<div class="viewcode-block" id="inside"><a class="viewcode-back" href="../../../api/evennia.locks.lockfuncs.html#evennia.locks.lockfuncs.inside">[docs]</a><span class="k">def</span> <span class="nf">inside</span><span class="p">(</span><span class="n">accessing_obj</span><span class="p">,</span> <span class="n">accessed_obj</span><span class="p">,</span> <span class="o">*</span><span class="n">args</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">):</span>

View file

@ -277,7 +277,13 @@
<span class="n">elist</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">_</span><span class="p">(</span><span class="s2">&quot;Lock: lock-function &#39;</span><span class="si">%s</span><span class="s2">&#39; is not available.&quot;</span><span class="p">)</span> <span class="o">%</span> <span class="n">funcstring</span><span class="p">)</span>
<span class="k">continue</span>
<span class="n">args</span> <span class="o">=</span> <span class="nb">list</span><span class="p">(</span><span class="n">arg</span><span class="o">.</span><span class="n">strip</span><span class="p">()</span> <span class="k">for</span> <span class="n">arg</span> <span class="ow">in</span> <span class="n">rest</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">arg</span> <span class="ow">and</span> <span class="s2">&quot;=&quot;</span> <span class="ow">not</span> <span class="ow">in</span> <span class="n">arg</span><span class="p">)</span>
<span class="n">kwargs</span> <span class="o">=</span> <span class="nb">dict</span><span class="p">([</span><span class="n">arg</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">for</span> <span class="n">arg</span> <span class="ow">in</span> <span class="n">rest</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">arg</span> <span class="ow">and</span> <span class="s2">&quot;=&quot;</span> <span class="ow">in</span> <span class="n">arg</span><span class="p">])</span>
<span class="n">kwargs</span> <span class="o">=</span> <span class="nb">dict</span><span class="p">(</span>
<span class="p">[</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">arg</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">for</span> <span class="n">arg</span> <span class="ow">in</span> <span class="n">rest</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">arg</span> <span class="ow">and</span> <span class="s2">&quot;=&quot;</span> <span class="ow">in</span> <span class="n">arg</span>
<span class="p">]</span>
<span class="p">)</span>
<span class="n">lock_funcs</span><span class="o">.</span><span class="n">append</span><span class="p">((</span><span class="n">func</span><span class="p">,</span> <span class="n">args</span><span class="p">,</span> <span class="n">kwargs</span><span class="p">))</span>
<span class="n">evalstring</span> <span class="o">=</span> <span class="n">evalstring</span><span class="o">.</span><span class="n">replace</span><span class="p">(</span><span class="n">funcstring</span><span class="p">,</span> <span class="s2">&quot;</span><span class="si">%s</span><span class="s2">&quot;</span><span class="p">)</span>
<span class="k">if</span> <span class="nb">len</span><span class="p">(</span><span class="n">lock_funcs</span><span class="p">)</span> <span class="o">&lt;</span> <span class="n">nfuncs</span><span class="p">:</span>

View file

@ -195,7 +195,7 @@
<span class="sd"> Args:</span>
<span class="sd"> attribute_name (str): Attribute key to search for.</span>
<span class="sd"> attribute_value (str): Attribute value to search for.</span>
<span class="sd"> attribute_value (any): Attribute value to search for. This can also be database objects.</span>
<span class="sd"> candidates (list, optional): Candidate objects to limit search to.</span>
<span class="sd"> typeclasses (list, optional): Python pats to restrict matches with.</span>
@ -216,31 +216,13 @@
<span class="p">)</span>
<span class="n">type_restriction</span> <span class="o">=</span> <span class="n">typeclasses</span> <span class="ow">and</span> <span class="n">Q</span><span class="p">(</span><span class="n">db_typeclass_path__in</span><span class="o">=</span><span class="n">make_iter</span><span class="p">(</span><span class="n">typeclasses</span><span class="p">))</span> <span class="ow">or</span> <span class="n">Q</span><span class="p">()</span>
<span class="c1"># This doesn&#39;t work if attribute_value is an object. Workaround below</span>
<span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">attribute_value</span><span class="p">,</span> <span class="p">(</span><span class="nb">str</span><span class="p">,</span> <span class="nb">int</span><span class="p">,</span> <span class="nb">float</span><span class="p">,</span> <span class="nb">bool</span><span class="p">)):</span>
<span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">filter</span><span class="p">(</span>
<span class="n">cand_restriction</span>
<span class="o">&amp;</span> <span class="n">type_restriction</span>
<span class="o">&amp;</span> <span class="n">Q</span><span class="p">(</span><span class="n">db_attributes__db_key</span><span class="o">=</span><span class="n">attribute_name</span><span class="p">,</span> <span class="n">db_attributes__db_value</span><span class="o">=</span><span class="n">attribute_value</span><span class="p">)</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="k">else</span><span class="p">:</span>
<span class="c1"># We must loop for safety since the referenced lookup gives deepcopy error if attribute value is an object.</span>
<span class="k">global</span> <span class="n">_ATTR</span>
<span class="k">if</span> <span class="ow">not</span> <span class="n">_ATTR</span><span class="p">:</span>
<span class="kn">from</span> <span class="nn">evennia.typeclasses.models</span> <span class="k">import</span> <span class="n">Attribute</span> <span class="k">as</span> <span class="n">_ATTR</span>
<span class="n">cands</span> <span class="o">=</span> <span class="nb">list</span><span class="p">(</span>
<span class="bp">self</span><span class="o">.</span><span class="n">filter</span><span class="p">(</span>
<span class="n">cand_restriction</span> <span class="o">&amp;</span> <span class="n">type_restriction</span> <span class="o">&amp;</span> <span class="n">Q</span><span class="p">(</span><span class="n">db_attributes__db_key</span><span class="o">=</span><span class="n">attribute_name</span><span class="p">)</span>
<span class="p">)</span>
<span class="p">)</span>
<span class="n">results</span> <span class="o">=</span> <span class="p">[</span>
<span class="n">attr</span><span class="o">.</span><span class="n">objectdb_set</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">_ATTR</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">objectdb__in</span><span class="o">=</span><span class="n">cands</span><span class="p">,</span> <span class="n">db_value</span><span class="o">=</span><span class="n">attribute_value</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="p">]</span>
<span class="k">return</span> <span class="n">chain</span><span class="p">(</span><span class="o">*</span><span class="n">results</span><span class="p">)</span>
<span class="n">results</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">filter</span><span class="p">(</span>
<span class="n">cand_restriction</span>
<span class="o">&amp;</span> <span class="n">type_restriction</span>
<span class="o">&amp;</span> <span class="n">Q</span><span class="p">(</span><span class="n">db_attributes__db_key</span><span class="o">=</span><span class="n">attribute_name</span><span class="p">)</span>
<span class="o">&amp;</span> <span class="n">Q</span><span class="p">(</span><span class="n">db_attributes__db_value</span><span class="o">=</span><span class="n">attribute_value</span><span class="p">)</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="k">return</span> <span class="n">results</span>
<span class="k">def</span> <span class="nf">get_objs_with_db_property</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">property_name</span><span class="p">,</span> <span class="n">candidates</span><span class="o">=</span><span class="kc">None</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;</span>

View file

@ -66,7 +66,7 @@
<span class="kn">from</span> <span class="nn">evennia.utils.utils</span> <span class="k">import</span> <span class="n">make_iter</span><span class="p">,</span> <span class="n">dbref</span><span class="p">,</span> <span class="n">lazy_property</span>
<div class="viewcode-block" id="ContentsHandler"><a class="viewcode-back" href="../../../api/evennia.objects.models.html#evennia.objects.admin.ContentsHandler">[docs]</a><span class="k">class</span> <span class="nc">ContentsHandler</span><span class="p">(</span><span class="nb">object</span><span class="p">):</span>
<div class="viewcode-block" id="ContentsHandler"><a class="viewcode-back" href="../../../api/evennia.objects.models.html#evennia.objects.admin.ContentsHandler">[docs]</a><span class="k">class</span> <span class="nc">ContentsHandler</span><span class="p">:</span>
<span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> Handles and caches the contents of an object to avoid excessive</span>
<span class="sd"> lookups (this is done very often due to cmdhandler needing to look</span>

View file

@ -250,7 +250,7 @@
<span class="c1"># lockstring of newly created objects, for easy overloading.</span>
<span class="c1"># Will be formatted with the appropriate attributes.</span>
<span class="n">lockstring</span> <span class="o">=</span> <span class="s2">&quot;control:id(</span><span class="si">{account_id}</span><span class="s2">) or perm(Admin);&quot;</span> <span class="s2">&quot;delete:id(</span><span class="si">{account_id}</span><span class="s2">) or perm(Admin)&quot;</span>
<span class="n">lockstring</span> <span class="o">=</span> <span class="s2">&quot;control:id(</span><span class="si">{account_id}</span><span class="s2">) or perm(Admin);delete:id(</span><span class="si">{account_id}</span><span class="s2">) or perm(Admin)&quot;</span>
<span class="n">objects</span> <span class="o">=</span> <span class="n">ObjectManager</span><span class="p">()</span>
@ -434,8 +434,7 @@
<span class="sd"> - `me,self`: self-reference to this object</span>
<span class="sd"> - `&lt;num&gt;-&lt;string&gt;` - can be used to differentiate</span>
<span class="sd"> between multiple same-named matches</span>
<span class="sd"> global_search (bool): Search all objects globally. This is overruled</span>
<span class="sd"> by `location` keyword.</span>
<span class="sd"> global_search (bool): Search all objects globally. This overrules &#39;location&#39; data.</span>
<span class="sd"> use_nicks (bool): Use nickname-replace (nicktype &quot;object&quot;) on `searchdata`.</span>
<span class="sd"> typeclass (str or Typeclass, or list of either): Limit search only</span>
<span class="sd"> to `Objects` with this typeclass. May be a list of typeclasses</span>
@ -2083,10 +2082,13 @@
<span class="n">_content_types</span> <span class="o">=</span> <span class="p">(</span><span class="s2">&quot;character&quot;</span><span class="p">,)</span>
<span class="c1"># lockstring of newly created rooms, for easy overloading.</span>
<span class="c1"># Will be formatted with the appropriate attributes.</span>
<span class="n">lockstring</span> <span class="o">=</span> <span class="s2">&quot;puppet:id(</span><span class="si">{character_id}</span><span class="s2">) or pid(</span><span class="si">{account_id}</span><span class="s2">) or perm(Developer) or pperm(Developer);delete:id(</span><span class="si">{account_id}</span><span class="s2">) or perm(Admin)&quot;</span>
<span class="n">lockstring</span> <span class="o">=</span> <span class="p">(</span>
<span class="s2">&quot;puppet:id(</span><span class="si">{character_id}</span><span class="s2">) or pid(</span><span class="si">{account_id}</span><span class="s2">) or perm(Developer) or pperm(Developer);&quot;</span>
<span class="s2">&quot;delete:id(</span><span class="si">{account_id}</span><span class="s2">) or perm(Admin)&quot;</span>
<span class="p">)</span>
<div class="viewcode-block" id="DefaultCharacter.create"><a class="viewcode-back" href="../../../api/evennia.objects.objects.html#evennia.objects.objects.DefaultCharacter.create">[docs]</a> <span class="nd">@classmethod</span>
<span class="k">def</span> <span class="nf">create</span><span class="p">(</span><span class="bp">cls</span><span class="p">,</span> <span class="n">key</span><span class="p">,</span> <span class="n">account</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">):</span>
<span class="k">def</span> <span class="nf">create</span><span class="p">(</span><span class="bp">cls</span><span class="p">,</span> <span class="n">key</span><span class="p">,</span> <span class="n">account</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> Creates a basic Character with default parameters, unless otherwise</span>
<span class="sd"> specified or extended.</span>
@ -2095,8 +2097,8 @@
<span class="sd"> Args:</span>
<span class="sd"> key (str): Name of the new Character.</span>
<span class="sd"> account (obj): Account to associate this Character with. Required as</span>
<span class="sd"> an argument, but one can fake it out by supplying None-- it will</span>
<span class="sd"> account (obj, optional): Account to associate this Character with.</span>
<span class="sd"> If unset supplying None-- it will</span>
<span class="sd"> change the default lockset and skip creator attribution.</span>
<span class="sd"> Keyword args:</span>
@ -2346,7 +2348,7 @@
<span class="p">)</span>
<div class="viewcode-block" id="DefaultRoom.create"><a class="viewcode-back" href="../../../api/evennia.objects.objects.html#evennia.objects.objects.DefaultRoom.create">[docs]</a> <span class="nd">@classmethod</span>
<span class="k">def</span> <span class="nf">create</span><span class="p">(</span><span class="bp">cls</span><span class="p">,</span> <span class="n">key</span><span class="p">,</span> <span class="n">account</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">):</span>
<span class="k">def</span> <span class="nf">create</span><span class="p">(</span><span class="bp">cls</span><span class="p">,</span> <span class="n">key</span><span class="p">,</span> <span class="n">account</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> Creates a basic Room with default parameters, unless otherwise</span>
<span class="sd"> specified or extended.</span>
@ -2355,7 +2357,9 @@
<span class="sd"> Args:</span>
<span class="sd"> key (str): Name of the new Room.</span>
<span class="sd"> account (obj): Account to associate this Room with.</span>
<span class="sd"> account (obj, optional): Account to associate this Room with. If</span>
<span class="sd"> given, it will be given specific control/edit permissions to this</span>
<span class="sd"> object (along with normal Admin perms). If not given, default</span>
<span class="sd"> Keyword args:</span>
<span class="sd"> description (str): Brief description for this object.</span>
@ -2384,13 +2388,20 @@
<span class="c1"># Get description, if provided</span>
<span class="n">description</span> <span class="o">=</span> <span class="n">kwargs</span><span class="o">.</span><span class="n">pop</span><span class="p">(</span><span class="s2">&quot;description&quot;</span><span class="p">,</span> <span class="s2">&quot;&quot;</span><span class="p">)</span>
<span class="c1"># get locks if provided</span>
<span class="n">locks</span> <span class="o">=</span> <span class="n">kwargs</span><span class="o">.</span><span class="n">pop</span><span class="p">(</span><span class="s2">&quot;locks&quot;</span><span class="p">,</span> <span class="s2">&quot;&quot;</span><span class="p">)</span>
<span class="k">try</span><span class="p">:</span>
<span class="c1"># Create the Room</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="o">**</span><span class="n">kwargs</span><span class="p">)</span>
<span class="c1"># Set appropriate locks</span>
<span class="n">lockstring</span> <span class="o">=</span> <span class="n">kwargs</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s2">&quot;locks&quot;</span><span class="p">,</span> <span class="bp">cls</span><span class="o">.</span><span class="n">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">account</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">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="c1"># Add locks</span>
<span class="k">if</span> <span class="ow">not</span> <span class="n">locks</span> <span class="ow">and</span> <span class="n">account</span><span class="p">:</span>
<span class="n">locks</span> <span class="o">=</span> <span class="bp">cls</span><span class="o">.</span><span class="n">lockstring</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="o">**</span><span class="p">{</span><span class="s2">&quot;id&quot;</span><span class="p">:</span> <span class="n">account</span><span class="o">.</span><span class="n">id</span><span class="p">})</span>
<span class="k">elif</span> <span class="ow">not</span> <span class="n">locks</span> <span class="ow">and</span> <span class="ow">not</span> <span class="n">account</span><span class="p">:</span>
<span class="n">locks</span> <span class="o">=</span> <span class="bp">cls</span><span class="o">.</span><span class="n">lockstring</span><span class="p">(</span><span class="o">**</span><span class="p">{</span><span class="s2">&quot;id&quot;</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="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">locks</span><span class="p">)</span>
<span class="c1"># Record creator id and creation IP</span>
<span class="k">if</span> <span class="n">ip</span><span class="p">:</span>
@ -2540,7 +2551,7 @@
<span class="c1"># Command hooks</span>
<div class="viewcode-block" id="DefaultExit.create"><a class="viewcode-back" href="../../../api/evennia.objects.objects.html#evennia.objects.objects.DefaultExit.create">[docs]</a> <span class="nd">@classmethod</span>
<span class="k">def</span> <span class="nf">create</span><span class="p">(</span><span class="bp">cls</span><span class="p">,</span> <span class="n">key</span><span class="p">,</span> <span class="n">account</span><span class="p">,</span> <span class="n">source</span><span class="p">,</span> <span class="n">dest</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">):</span>
<span class="k">def</span> <span class="nf">create</span><span class="p">(</span><span class="bp">cls</span><span class="p">,</span> <span class="n">key</span><span class="p">,</span> <span class="n">source</span><span class="p">,</span> <span class="n">dest</span><span class="p">,</span> <span class="n">account</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> Creates a basic Exit with default parameters, unless otherwise</span>
<span class="sd"> specified or extended.</span>
@ -2584,13 +2595,18 @@
<span class="n">description</span> <span class="o">=</span> <span class="n">kwargs</span><span class="o">.</span><span class="n">pop</span><span class="p">(</span><span class="s2">&quot;description&quot;</span><span class="p">,</span> <span class="s2">&quot;&quot;</span><span class="p">)</span>
<span class="n">locks</span> <span class="o">=</span> <span class="n">kwargs</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s2">&quot;locks&quot;</span><span class="p">,</span> <span class="s2">&quot;&quot;</span><span class="p">)</span>
<span class="k">try</span><span class="p">:</span>
<span class="c1"># Create the Exit</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="o">**</span><span class="n">kwargs</span><span class="p">)</span>
<span class="c1"># Set appropriate locks</span>
<span class="n">lockstring</span> <span class="o">=</span> <span class="n">kwargs</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s2">&quot;locks&quot;</span><span class="p">,</span> <span class="bp">cls</span><span class="o">.</span><span class="n">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">account</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">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="k">if</span> <span class="ow">not</span> <span class="n">locks</span> <span class="ow">and</span> <span class="n">account</span><span class="p">:</span>
<span class="n">locks</span> <span class="o">=</span> <span class="bp">cls</span><span class="o">.</span><span class="n">lockstring</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="o">**</span><span class="p">{</span><span class="s2">&quot;id&quot;</span><span class="p">:</span> <span class="n">account</span><span class="o">.</span><span class="n">id</span><span class="p">})</span>
<span class="k">elif</span> <span class="ow">not</span> <span class="n">locks</span> <span class="ow">and</span> <span class="ow">not</span> <span class="n">account</span><span class="p">:</span>
<span class="n">locks</span> <span class="o">=</span> <span class="bp">cls</span><span class="o">.</span><span class="n">lockstring</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="o">**</span><span class="p">{</span><span class="s2">&quot;id&quot;</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="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">locks</span><span class="p">)</span>
<span class="c1"># Record creator id and creation IP</span>
<span class="k">if</span> <span class="n">ip</span><span class="p">:</span>

View file

@ -114,7 +114,7 @@
<span class="sd"> Get all scripts in the database.</span>
<span class="sd"> Args:</span>
<span class="sd"> key (str, optional): Restrict result to only those</span>
<span class="sd"> key (str or int, optional): Restrict result to only those</span>
<span class="sd"> with matching key or dbref.</span>
<span class="sd"> Returns:</span>
@ -124,12 +124,9 @@
<span class="k">if</span> <span class="n">key</span><span class="p">:</span>
<span class="n">script</span> <span class="o">=</span> <span class="p">[]</span>
<span class="n">dbref</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">dbref</span><span class="p">(</span><span class="n">key</span><span class="p">)</span>
<span class="k">if</span> <span class="n">dbref</span> <span class="ow">or</span> <span class="n">dbref</span> <span class="o">==</span> <span class="mi">0</span><span class="p">:</span>
<span class="c1"># return either [] or a valid list (never [None])</span>
<span class="n">script</span> <span class="o">=</span> <span class="p">[</span><span class="n">res</span> <span class="k">for</span> <span class="n">res</span> <span class="ow">in</span> <span class="p">[</span><span class="bp">self</span><span class="o">.</span><span class="n">dbref_search</span><span class="p">(</span><span class="n">dbref</span><span class="p">)]</span> <span class="k">if</span> <span class="n">res</span><span class="p">]</span>
<span class="k">if</span> <span class="ow">not</span> <span class="n">script</span><span class="p">:</span>
<span class="n">script</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">filter</span><span class="p">(</span><span class="n">db_key</span><span class="o">=</span><span class="n">key</span><span class="p">)</span>
<span class="k">return</span> <span class="n">script</span>
<span class="k">if</span> <span class="n">dbref</span><span class="p">:</span>
<span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">filter</span><span class="p">(</span><span class="nb">id</span><span class="o">=</span><span class="n">dbref</span><span class="p">)</span>
<span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">filter</span><span class="p">(</span><span class="n">db_key__iexact</span><span class="o">=</span><span class="n">key</span><span class="o">.</span><span class="n">strip</span><span class="p">())</span>
<span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">all</span><span class="p">()</span>
<span class="k">def</span> <span class="nf">delete_script</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">dbref</span><span class="p">):</span>
@ -272,7 +269,7 @@
<span class="n">ostring</span> <span class="o">=</span> <span class="n">ostring</span><span class="o">.</span><span class="n">strip</span><span class="p">()</span>
<span class="n">dbref</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">dbref</span><span class="p">(</span><span class="n">ostring</span><span class="p">)</span>
<span class="k">if</span> <span class="n">dbref</span> <span class="ow">or</span> <span class="n">dbref</span> <span class="o">==</span> <span class="mi">0</span><span class="p">:</span>
<span class="k">if</span> <span class="n">dbref</span><span class="p">:</span>
<span class="c1"># this is a dbref, try to find the script directly</span>
<span class="n">dbref_match</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">dbref_search</span><span class="p">(</span><span class="n">dbref</span><span class="p">)</span>
<span class="k">if</span> <span class="n">dbref_match</span> <span class="ow">and</span> <span class="ow">not</span> <span class="p">(</span>

View file

@ -54,6 +54,7 @@
<span class="kn">from</span> <span class="nn">os.path</span> <span class="k">import</span> <span class="n">dirname</span><span class="p">,</span> <span class="n">abspath</span>
<span class="kn">from</span> <span class="nn">twisted.application</span> <span class="k">import</span> <span class="n">internet</span><span class="p">,</span> <span class="n">service</span>
<span class="kn">from</span> <span class="nn">twisted.internet.task</span> <span class="k">import</span> <span class="n">LoopingCall</span>
<span class="kn">from</span> <span class="nn">twisted.internet</span> <span class="k">import</span> <span class="n">protocol</span><span class="p">,</span> <span class="n">reactor</span>
<span class="kn">from</span> <span class="nn">twisted.python.log</span> <span class="k">import</span> <span class="n">ILogObserver</span>
@ -61,6 +62,7 @@
<span class="n">django</span><span class="o">.</span><span class="n">setup</span><span class="p">()</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</span> <span class="k">import</span> <span class="n">connection</span>
<span class="kn">import</span> <span class="nn">evennia</span>
@ -142,10 +144,29 @@
<span class="n">WEB_PLUGINS_MODULE</span> <span class="o">=</span> <span class="kc">None</span>
<span class="n">INFO_DICT</span><span class="p">[</span><span class="s2">&quot;errors&quot;</span><span class="p">]</span> <span class="o">=</span> <span class="p">(</span>
<span class="s2">&quot;WARNING: settings.WEB_PLUGINS_MODULE not found - &quot;</span>
<span class="s2">&quot;copy &#39;evennia/game_template/server/conf/web_plugins.py to mygame/server/conf.&quot;</span>
<span class="s2">&quot;copy &#39;evennia/game_template/server/conf/web_plugins.py to &quot;</span>
<span class="s2">&quot;mygame/server/conf.&quot;</span>
<span class="p">)</span>
<span class="n">_MAINTENANCE_COUNT</span> <span class="o">=</span> <span class="mi">0</span>
<span class="k">def</span> <span class="nf">_portal_maintenance</span><span class="p">():</span>
<span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> Repeated maintenance tasks for the portal.</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="k">global</span> <span class="n">_MAINTENANCE_COUNT</span>
<span class="n">_MAINTENANCE_COUNT</span> <span class="o">+=</span> <span class="mi">1</span>
<span class="k">if</span> <span class="n">_MAINTENANCE_COUNT</span> <span class="o">%</span> <span class="p">(</span><span class="mi">3600</span> <span class="o">*</span> <span class="mi">7</span><span class="p">)</span> <span class="o">==</span> <span class="mi">0</span><span class="p">:</span>
<span class="c1"># drop database connection every 7 hrs to avoid default timeouts on MySQL</span>
<span class="c1"># (see https://github.com/evennia/evennia/issues/1376)</span>
<span class="n">connection</span><span class="o">.</span><span class="n">close</span><span class="p">()</span>
<span class="c1"># -------------------------------------------------------------</span>
<span class="c1"># Portal Service object</span>
<span class="c1"># -------------------------------------------------------------</span>
@ -184,6 +205,9 @@
<span class="bp">self</span><span class="o">.</span><span class="n">start_time</span> <span class="o">=</span> <span class="n">time</span><span class="o">.</span><span class="n">time</span><span class="p">()</span>
<span class="bp">self</span><span class="o">.</span><span class="n">maintenance_task</span> <span class="o">=</span> <span class="n">LoopingCall</span><span class="p">(</span><span class="n">_portal_maintenance</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">maintenance_task</span><span class="o">.</span><span class="n">start</span><span class="p">(</span><span class="mi">60</span><span class="p">,</span> <span class="n">now</span><span class="o">=</span><span class="kc">True</span><span class="p">)</span> <span class="c1"># call every minute</span>
<span class="c1"># in non-interactive portal mode, this gets overwritten by</span>
<span class="c1"># cmdline sent by the evennia launcher</span>
<span class="bp">self</span><span class="o">.</span><span class="n">server_twistd_cmd</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_get_backup_server_twistd_cmd</span><span class="p">()</span>

View file

@ -290,6 +290,8 @@
<span class="k">return</span>
<span class="k">else</span><span class="p">:</span>
<span class="k">return</span>
<span class="c1"># just to be sure</span>
<span class="n">text</span> <span class="o">=</span> <span class="n">to_str</span><span class="p">(</span><span class="n">text</span><span class="p">)</span>
<span class="n">flags</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">protocol_flags</span>

View file

@ -1135,13 +1135,13 @@
<span class="sd"> repeat-calling add when having many Attributes to add.</span>
<span class="sd"> Args:</span>
<span class="sd"> *args (tuple): Tuples of varying length representing the</span>
<span class="sd"> Attribute to add to this object. Supported tuples are</span>
<span class="sd"> - (key, value)</span>
<span class="sd"> - (key, value, category)</span>
<span class="sd"> - (key, value, category, lockstring)</span>
<span class="sd"> - (key, value, category, lockstring, default_access)</span>
<span class="sd"> *args (tuple): Each argument should be a tuples (can be of varying</span>
<span class="sd"> length) representing the Attribute to add to this object.</span>
<span class="sd"> Supported tuples are</span>
<span class="sd"> - `(key, value)`</span>
<span class="sd"> - `(key, value, category)`</span>
<span class="sd"> - `(key, value, category, lockstring)`</span>
<span class="sd"> - `(key, value, category, lockstring, default_access)`</span>
<span class="sd"> Keyword args:</span>
<span class="sd"> strattr (bool): If `True`, value must be a string. This</span>

View file

@ -151,10 +151,38 @@
<span class="n">attrs</span><span class="p">[</span><span class="s2">&quot;typename&quot;</span><span class="p">]</span> <span class="o">=</span> <span class="n">name</span>
<span class="n">attrs</span><span class="p">[</span><span class="s2">&quot;path&quot;</span><span class="p">]</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">attrs</span><span class="p">[</span><span class="s2">&quot;__module__&quot;</span><span class="p">],</span> <span class="n">name</span><span class="p">)</span>
<span class="k">def</span> <span class="nf">_get_dbmodel</span><span class="p">(</span><span class="n">bases</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;Recursively get the dbmodel&quot;&quot;&quot;</span>
<span class="k">if</span> <span class="ow">not</span> <span class="nb">hasattr</span><span class="p">(</span><span class="n">bases</span><span class="p">,</span> <span class="s2">&quot;__iter__&quot;</span><span class="p">):</span>
<span class="n">bases</span> <span class="o">=</span> <span class="p">[</span><span class="n">bases</span><span class="p">]</span>
<span class="k">for</span> <span class="n">base</span> <span class="ow">in</span> <span class="n">bases</span><span class="p">:</span>
<span class="k">try</span><span class="p">:</span>
<span class="k">if</span> <span class="n">base</span><span class="o">.</span><span class="n">_meta</span><span class="o">.</span><span class="n">proxy</span> <span class="ow">or</span> <span class="n">base</span><span class="o">.</span><span class="n">_meta</span><span class="o">.</span><span class="n">abstract</span><span class="p">:</span>
<span class="k">for</span> <span class="n">kls</span> <span class="ow">in</span> <span class="n">base</span><span class="o">.</span><span class="n">_meta</span><span class="o">.</span><span class="n">parents</span><span class="p">:</span>
<span class="k">return</span> <span class="n">_get_dbmodel</span><span class="p">(</span><span class="n">kls</span><span class="p">)</span>
<span class="k">except</span> <span class="ne">AttributeError</span><span class="p">:</span>
<span class="c1"># this happens if trying to parse a non-typeclass mixin parent,</span>
<span class="c1"># without a _meta</span>
<span class="k">continue</span>
<span class="k">else</span><span class="p">:</span>
<span class="k">return</span> <span class="n">base</span>
<span class="k">return</span> <span class="kc">None</span>
<span class="n">dbmodel</span> <span class="o">=</span> <span class="n">_get_dbmodel</span><span class="p">(</span><span class="n">bases</span><span class="p">)</span>
<span class="k">if</span> <span class="ow">not</span> <span class="n">dbmodel</span><span class="p">:</span>
<span class="k">raise</span> <span class="ne">TypeError</span><span class="p">(</span><span class="n">f</span><span class="s2">&quot;</span><span class="si">{name}</span><span class="s2"> does not appear to inherit from a database model.&quot;</span><span class="p">)</span>
<span class="c1"># typeclass proxy setup</span>
<span class="c1"># first check explicit __applabel__ on the typeclass, then figure</span>
<span class="c1"># it out from the dbmodel</span>
<span class="k">if</span> <span class="s2">&quot;__applabel__&quot;</span> <span class="ow">not</span> <span class="ow">in</span> <span class="n">attrs</span><span class="p">:</span>
<span class="c1"># find the app-label in one of the bases, usually the dbmodel</span>
<span class="n">attrs</span><span class="p">[</span><span class="s2">&quot;__applabel__&quot;</span><span class="p">]</span> <span class="o">=</span> <span class="n">dbmodel</span><span class="o">.</span><span class="n">_meta</span><span class="o">.</span><span class="n">app_label</span>
<span class="k">if</span> <span class="s2">&quot;Meta&quot;</span> <span class="ow">not</span> <span class="ow">in</span> <span class="n">attrs</span><span class="p">:</span>
<span class="k">class</span> <span class="nc">Meta</span><span class="p">(</span><span class="nb">object</span><span class="p">):</span>
<span class="k">class</span> <span class="nc">Meta</span><span class="p">:</span>
<span class="n">proxy</span> <span class="o">=</span> <span class="kc">True</span>
<span class="n">app_label</span> <span class="o">=</span> <span class="n">attrs</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s2">&quot;__applabel__&quot;</span><span class="p">,</span> <span class="s2">&quot;typeclasses&quot;</span><span class="p">)</span>
@ -163,6 +191,16 @@
<span class="n">new_class</span> <span class="o">=</span> <span class="n">ModelBase</span><span class="o">.</span><span class="fm">__new__</span><span class="p">(</span><span class="bp">cls</span><span class="p">,</span> <span class="n">name</span><span class="p">,</span> <span class="n">bases</span><span class="p">,</span> <span class="n">attrs</span><span class="p">)</span>
<span class="c1"># django doesn&#39;t support inheriting proxy models so we hack support for</span>
<span class="c1"># it here by injecting `proxy_for_model` to the actual dbmodel.</span>
<span class="c1"># Unfortunately we cannot also set the correct model_name, because this</span>
<span class="c1"># would block multiple-inheritance of typeclasses (Django doesn&#39;t allow</span>
<span class="c1"># multiple bases of the same model).</span>
<span class="k">if</span> <span class="n">dbmodel</span><span class="p">:</span>
<span class="n">new_class</span><span class="o">.</span><span class="n">_meta</span><span class="o">.</span><span class="n">proxy_for_model</span> <span class="o">=</span> <span class="n">dbmodel</span>
<span class="c1"># Maybe Django will eventually handle this in the future:</span>
<span class="c1"># new_class._meta.model_name = dbmodel._meta.model_name</span>
<span class="c1"># attach signals</span>
<span class="n">signals</span><span class="o">.</span><span class="n">post_save</span><span class="o">.</span><span class="n">connect</span><span class="p">(</span><span class="n">call_at_first_save</span><span class="p">,</span> <span class="n">sender</span><span class="o">=</span><span class="n">new_class</span><span class="p">)</span>
<span class="n">signals</span><span class="o">.</span><span class="n">pre_delete</span><span class="o">.</span><span class="n">connect</span><span class="p">(</span><span class="n">remove_attributes_on_delete</span><span class="p">,</span> <span class="n">sender</span><span class="o">=</span><span class="n">new_class</span><span class="p">)</span>

View file

@ -77,7 +77,7 @@
<span class="sd"> indexed for efficient lookup in the database. Tags are shared</span>
<span class="sd"> between objects - a new tag is only created if the key+category</span>
<span class="sd"> combination did not previously exist, making them unsuitable for</span>
<span class="sd"> storing object-related data (for this a full tag should be</span>
<span class="sd"> storing object-related data (for this a regular Attribute should be</span>
<span class="sd"> used).</span>
<span class="sd"> The &#39;db_data&#39; field is intended as a documentation field for the</span>
@ -490,8 +490,8 @@
<span class="sd"> Batch-add tags from a list of tuples.</span>
<span class="sd"> Args:</span>
<span class="sd"> tuples (tuple or str): Any number of `tagstr` keys, `(keystr, category)` or</span>
<span class="sd"> `(keystr, category, data)` tuples.</span>
<span class="sd"> *args (tuple or str): Each argument should be a `tagstr` keys or tuple `(keystr, category)` or</span>
<span class="sd"> `(keystr, category, data)`. It&#39;s possible to mix input types.</span>
<span class="sd"> Notes:</span>
<span class="sd"> This will generate a mimimal number of self.add calls,</span>

View file

@ -345,7 +345,7 @@
<span class="c1">#</span>
<div class="viewcode-block" id="create_help_entry"><a class="viewcode-back" href="../../../api/evennia.utils.create.html#evennia.utils.create.create_help_entry">[docs]</a><span class="k">def</span> <span class="nf">create_help_entry</span><span class="p">(</span><span class="n">key</span><span class="p">,</span> <span class="n">entrytext</span><span class="p">,</span> <span class="n">category</span><span class="o">=</span><span class="s2">&quot;General&quot;</span><span class="p">,</span> <span class="n">locks</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span> <span class="n">aliases</span><span class="o">=</span><span class="kc">None</span><span class="p">):</span>
<div class="viewcode-block" id="create_help_entry"><a class="viewcode-back" href="../../../api/evennia.utils.create.html#evennia.utils.create.create_help_entry">[docs]</a><span class="k">def</span> <span class="nf">create_help_entry</span><span class="p">(</span><span class="n">key</span><span class="p">,</span> <span class="n">entrytext</span><span class="p">,</span> <span class="n">category</span><span class="o">=</span><span class="s2">&quot;General&quot;</span><span class="p">,</span> <span class="n">locks</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span> <span class="n">aliases</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;</span>
<span class="sd"> Create a static help entry in the help database. Note that Command</span>
<span class="sd"> help entries are dynamic and directly taken from the __doc__</span>
@ -358,7 +358,8 @@
<span class="sd"> entrytext (str): The body of te help entry</span>
<span class="sd"> category (str, optional): The help category of the entry.</span>
<span class="sd"> locks (str, optional): A lockstring to restrict access.</span>
<span class="sd"> aliases (list of str): List of alternative (likely shorter) keynames.</span>
<span class="sd"> aliases (list of str, optional): List of alternative (likely shorter) keynames.</span>
<span class="sd"> tags (lst, optional): List of tags or tuples `(tag, category)`.</span>
<span class="sd"> Returns:</span>
<span class="sd"> help (HelpEntry): A newly created help entry.</span>
@ -376,7 +377,9 @@
<span class="k">if</span> <span class="n">locks</span><span class="p">:</span>
<span class="n">new_help</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">locks</span><span class="p">)</span>
<span class="k">if</span> <span class="n">aliases</span><span class="p">:</span>
<span class="n">new_help</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">new_help</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">make_iter</span><span class="p">(</span><span class="n">aliases</span><span class="p">))</span>
<span class="k">if</span> <span class="n">tags</span><span class="p">:</span>
<span class="n">new_help</span><span class="o">.</span><span class="n">tags</span><span class="o">.</span><span class="n">batch_add</span><span class="p">(</span><span class="o">*</span><span class="n">tags</span><span class="p">)</span>
<span class="n">new_help</span><span class="o">.</span><span class="n">save</span><span class="p">()</span>
<span class="k">return</span> <span class="n">new_help</span>
<span class="k">except</span> <span class="n">IntegrityError</span><span class="p">:</span>
@ -398,7 +401,9 @@
<span class="c1"># Comm system methods</span>
<div class="viewcode-block" id="create_message"><a class="viewcode-back" href="../../../api/evennia.utils.create.html#evennia.utils.create.create_message">[docs]</a><span class="k">def</span> <span class="nf">create_message</span><span class="p">(</span><span class="n">senderobj</span><span class="p">,</span> <span class="n">message</span><span class="p">,</span> <span class="n">channels</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span> <span class="n">receivers</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span> <span class="n">locks</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span> <span class="n">header</span><span class="o">=</span><span class="kc">None</span><span class="p">):</span>
<div class="viewcode-block" id="create_message"><a class="viewcode-back" href="../../../api/evennia.utils.create.html#evennia.utils.create.create_message">[docs]</a><span class="k">def</span> <span class="nf">create_message</span><span class="p">(</span>
<span class="n">senderobj</span><span class="p">,</span> <span class="n">message</span><span class="p">,</span> <span class="n">channels</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span> <span class="n">receivers</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span> <span class="n">locks</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="n">header</span><span class="o">=</span><span class="kc">None</span>
<span class="p">):</span>
<span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> Create a new communication Msg. Msgs represent a unit of</span>
<span class="sd"> database-persistent communication between entites.</span>
@ -414,6 +419,7 @@
<span class="sd"> receivers (Object, Account, str or list): An Account/Object to send</span>
<span class="sd"> to, or a list of them. May be Account objects or accountnames.</span>
<span class="sd"> locks (str): Lock definition string.</span>
<span class="sd"> tags (list): A list of tags or tuples `(tag, category)`.</span>
<span class="sd"> header (str): Mime-type or other optional information for the message</span>
<span class="sd"> Notes:</span>
@ -440,6 +446,9 @@
<span class="n">new_message</span><span class="o">.</span><span class="n">receivers</span> <span class="o">=</span> <span class="n">receiver</span>
<span class="k">if</span> <span class="n">locks</span><span class="p">:</span>
<span class="n">new_message</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">locks</span><span class="p">)</span>
<span class="k">if</span> <span class="n">tags</span><span class="p">:</span>
<span class="n">new_message</span><span class="o">.</span><span class="n">tags</span><span class="o">.</span><span class="n">batch_add</span><span class="p">(</span><span class="o">*</span><span class="n">tags</span><span class="p">)</span>
<span class="n">new_message</span><span class="o">.</span><span class="n">save</span><span class="p">()</span>
<span class="k">return</span> <span class="n">new_message</span></div>
@ -448,7 +457,9 @@
<span class="n">create_msg</span> <span class="o">=</span> <span class="n">create_message</span>
<div class="viewcode-block" id="create_channel"><a class="viewcode-back" href="../../../api/evennia.utils.create.html#evennia.utils.create.create_channel">[docs]</a><span class="k">def</span> <span class="nf">create_channel</span><span class="p">(</span><span class="n">key</span><span class="p">,</span> <span class="n">aliases</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span> <span class="n">desc</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span> <span class="n">locks</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span> <span class="n">keep_log</span><span class="o">=</span><span class="kc">True</span><span class="p">,</span> <span class="n">typeclass</span><span class="o">=</span><span class="kc">None</span><span class="p">):</span>
<div class="viewcode-block" id="create_channel"><a class="viewcode-back" href="../../../api/evennia.utils.create.html#evennia.utils.create.create_channel">[docs]</a><span class="k">def</span> <span class="nf">create_channel</span><span class="p">(</span>
<span class="n">key</span><span class="p">,</span> <span class="n">aliases</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span> <span class="n">desc</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span> <span class="n">locks</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span> <span class="n">keep_log</span><span class="o">=</span><span class="kc">True</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="n">tags</span><span class="o">=</span><span class="kc">None</span>
<span class="p">):</span>
<span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> Create A communication Channel. A Channel serves as a central hub</span>
<span class="sd"> for distributing Msgs to groups of people without specifying the</span>
@ -467,6 +478,7 @@
<span class="sd"> keep_log (bool): Log channel throughput.</span>
<span class="sd"> typeclass (str or class): The typeclass of the Channel (not</span>
<span class="sd"> often used).</span>
<span class="sd"> tags (list): A list of tags or tuples `(tag, category)`.</span>
<span class="sd"> Returns:</span>
<span class="sd"> channel (Channel): A newly created channel.</span>
@ -483,7 +495,7 @@
<span class="c1"># store call signature for the signal</span>
<span class="n">new_channel</span><span class="o">.</span><span class="n">_createdict</span> <span class="o">=</span> <span class="nb">dict</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">aliases</span><span class="o">=</span><span class="n">aliases</span><span class="p">,</span> <span class="n">desc</span><span class="o">=</span><span class="n">desc</span><span class="p">,</span> <span class="n">locks</span><span class="o">=</span><span class="n">locks</span><span class="p">,</span> <span class="n">keep_log</span><span class="o">=</span><span class="n">keep_log</span>
<span class="n">key</span><span class="o">=</span><span class="n">key</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">desc</span><span class="o">=</span><span class="n">desc</span><span class="p">,</span> <span class="n">locks</span><span class="o">=</span><span class="n">locks</span><span class="p">,</span> <span class="n">keep_log</span><span class="o">=</span><span class="n">keep_log</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="c1"># this will trigger the save signal which in turn calls the</span>

View file

@ -270,6 +270,12 @@
<span class="k">def</span> <span class="nf">__ne__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">other</span><span class="p">):</span>
<span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">_data</span> <span class="o">!=</span> <span class="n">other</span>
<span class="k">def</span> <span class="nf">__lt__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">other</span><span class="p">):</span>
<span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">_data</span> <span class="o">&lt;</span> <span class="n">other</span>
<span class="k">def</span> <span class="nf">__gt__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">other</span><span class="p">):</span>
<span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">_data</span> <span class="o">&gt;</span> <span class="n">other</span>
<span class="nd">@_save</span>
<span class="k">def</span> <span class="nf">__setitem__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">key</span><span class="p">,</span> <span class="n">value</span><span class="p">):</span>
<span class="bp">self</span><span class="o">.</span><span class="n">_data</span><span class="o">.</span><span class="fm">__setitem__</span><span class="p">(</span><span class="n">key</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">_convert_mutables</span><span class="p">(</span><span class="n">value</span><span class="p">))</span>
@ -315,6 +321,13 @@
<span class="k">def</span> <span class="nf">index</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">args</span><span class="p">):</span>
<span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">_data</span><span class="o">.</span><span class="n">index</span><span class="p">(</span><span class="n">value</span><span class="p">,</span> <span class="o">*</span><span class="n">args</span><span class="p">)</span>
<span class="nd">@_save</span>
<span class="k">def</span> <span class="nf">sort</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="o">*</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">reverse</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">_data</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="n">key</span><span class="p">,</span> <span class="n">reverse</span><span class="o">=</span><span class="n">reverse</span><span class="p">)</span>
<span class="k">def</span> <span class="nf">copy</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">_data</span><span class="o">.</span><span class="n">copy</span><span class="p">()</span>
<span class="k">class</span> <span class="nc">_SaverDict</span><span class="p">(</span><span class="n">_SaverMutable</span><span class="p">,</span> <span class="n">MutableMapping</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;</span>

View file

@ -158,7 +158,7 @@
<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">textwrap</span> <span class="k">import</span> <span class="n">TextWrapper</span>
<span class="kn">from</span> <span class="nn">copy</span> <span class="k">import</span> <span class="n">deepcopy</span><span class="p">,</span> <span class="n">copy</span>
<span class="kn">from</span> <span class="nn">evennia.utils.utils</span> <span class="k">import</span> <span class="n">m_len</span><span class="p">,</span> <span class="n">is_iter</span>
<span class="kn">from</span> <span class="nn">evennia.utils.utils</span> <span class="k">import</span> <span class="n">is_iter</span><span class="p">,</span> <span class="n">display_len</span> <span class="k">as</span> <span class="n">d_len</span>
<span class="kn">from</span> <span class="nn">evennia.utils.ansi</span> <span class="k">import</span> <span class="n">ANSIString</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>
@ -272,7 +272,7 @@
<span class="n">indent</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">initial_indent</span>
<span class="c1"># Maximum width for this line.</span>
<span class="n">width</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">width</span> <span class="o">-</span> <span class="n">m_len</span><span class="p">(</span><span class="n">indent</span><span class="p">)</span>
<span class="n">width</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">width</span> <span class="o">-</span> <span class="n">d_len</span><span class="p">(</span><span class="n">indent</span><span class="p">)</span>
<span class="c1"># First chunk on line is whitespace -- drop it, unless this</span>
<span class="c1"># is the very beginning of the text (ie. no lines started yet).</span>
@ -280,7 +280,7 @@
<span class="k">del</span> <span class="n">chunks</span><span class="p">[</span><span class="o">-</span><span class="mi">1</span><span class="p">]</span>
<span class="k">while</span> <span class="n">chunks</span><span class="p">:</span>
<span class="n">l</span> <span class="o">=</span> <span class="n">m_len</span><span class="p">(</span><span class="n">chunks</span><span class="p">[</span><span class="o">-</span><span class="mi">1</span><span class="p">])</span>
<span class="n">l</span> <span class="o">=</span> <span class="n">d_len</span><span class="p">(</span><span class="n">chunks</span><span class="p">[</span><span class="o">-</span><span class="mi">1</span><span class="p">])</span>
<span class="c1"># Can at least squeeze this chunk onto the current line.</span>
<span class="k">if</span> <span class="n">cur_len</span> <span class="o">+</span> <span class="n">l</span> <span class="o">&lt;=</span> <span class="n">width</span><span class="p">:</span>
@ -293,7 +293,7 @@
<span class="c1"># The current line is full, and the next chunk is too big to</span>
<span class="c1"># fit on *any* line (not just this one).</span>
<span class="k">if</span> <span class="n">chunks</span> <span class="ow">and</span> <span class="n">m_len</span><span class="p">(</span><span class="n">chunks</span><span class="p">[</span><span class="o">-</span><span class="mi">1</span><span class="p">])</span> <span class="o">&gt;</span> <span class="n">width</span><span class="p">:</span>
<span class="k">if</span> <span class="n">chunks</span> <span class="ow">and</span> <span class="n">d_len</span><span class="p">(</span><span class="n">chunks</span><span class="p">[</span><span class="o">-</span><span class="mi">1</span><span class="p">])</span> <span class="o">&gt;</span> <span class="n">width</span><span class="p">:</span>
<span class="bp">self</span><span class="o">.</span><span class="n">_handle_long_word</span><span class="p">(</span><span class="n">chunks</span><span class="p">,</span> <span class="n">cur_line</span><span class="p">,</span> <span class="n">cur_len</span><span class="p">,</span> <span class="n">width</span><span class="p">)</span>
<span class="c1"># If the last chunk on this line is all whitespace, drop it.</span>
@ -483,7 +483,7 @@
<span class="bp">self</span><span class="o">.</span><span class="n">valign</span> <span class="o">=</span> <span class="n">kwargs</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s2">&quot;valign&quot;</span><span class="p">,</span> <span class="s2">&quot;c&quot;</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">data</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_split_lines</span><span class="p">(</span><span class="n">_to_ansi</span><span class="p">(</span><span class="n">data</span><span class="p">))</span>
<span class="bp">self</span><span class="o">.</span><span class="n">raw_width</span> <span class="o">=</span> <span class="nb">max</span><span class="p">(</span><span class="n">m_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="bp">self</span><span class="o">.</span><span class="n">data</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">raw_width</span> <span class="o">=</span> <span class="nb">max</span><span class="p">(</span><span class="n">d_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="bp">self</span><span class="o">.</span><span class="n">data</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">raw_height</span> <span class="o">=</span> <span class="nb">len</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">data</span><span class="p">)</span>
<span class="c1"># this is extra trimming required for cels in the middle of a table only</span>
@ -522,9 +522,9 @@
<span class="sd"> width (int): The width to crop `text` to.</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="k">if</span> <span class="n">m_len</span><span class="p">(</span><span class="n">text</span><span class="p">)</span> <span class="o">&gt;</span> <span class="n">width</span><span class="p">:</span>
<span class="k">if</span> <span class="n">d_len</span><span class="p">(</span><span class="n">text</span><span class="p">)</span> <span class="o">&gt;</span> <span class="n">width</span><span class="p">:</span>
<span class="n">crop_string</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">crop_string</span>
<span class="k">return</span> <span class="n">text</span><span class="p">[:</span> <span class="n">width</span> <span class="o">-</span> <span class="n">m_len</span><span class="p">(</span><span class="n">crop_string</span><span class="p">)]</span> <span class="o">+</span> <span class="n">crop_string</span>
<span class="k">return</span> <span class="n">text</span><span class="p">[:</span> <span class="n">width</span> <span class="o">-</span> <span class="n">d_len</span><span class="p">(</span><span class="n">crop_string</span><span class="p">)]</span> <span class="o">+</span> <span class="n">crop_string</span>
<span class="k">return</span> <span class="n">text</span>
<span class="k">def</span> <span class="nf">_reformat</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
@ -565,7 +565,7 @@
<span class="n">width</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">width</span>
<span class="n">adjusted_data</span> <span class="o">=</span> <span class="p">[]</span>
<span class="k">for</span> <span class="n">line</span> <span class="ow">in</span> <span class="n">data</span><span class="p">:</span>
<span class="k">if</span> <span class="mi">0</span> <span class="o">&lt;</span> <span class="n">width</span> <span class="o">&lt;</span> <span class="n">m_len</span><span class="p">(</span><span class="n">line</span><span class="p">):</span>
<span class="k">if</span> <span class="mi">0</span> <span class="o">&lt;</span> <span class="n">width</span> <span class="o">&lt;</span> <span class="n">d_len</span><span class="p">(</span><span class="n">line</span><span class="p">):</span>
<span class="c1"># replace_whitespace=False, expand_tabs=False is a</span>
<span class="c1"># fix for ANSIString not supporting expand_tabs/translate</span>
<span class="n">adjusted_data</span><span class="o">.</span><span class="n">extend</span><span class="p">(</span>
@ -608,7 +608,7 @@
<span class="sd"> text (str): Centered text.</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="n">excess</span> <span class="o">=</span> <span class="n">width</span> <span class="o">-</span> <span class="n">m_len</span><span class="p">(</span><span class="n">text</span><span class="p">)</span>
<span class="n">excess</span> <span class="o">=</span> <span class="n">width</span> <span class="o">-</span> <span class="n">d_len</span><span class="p">(</span><span class="n">text</span><span class="p">)</span>
<span class="k">if</span> <span class="n">excess</span> <span class="o">&lt;=</span> <span class="mi">0</span><span class="p">:</span>
<span class="k">return</span> <span class="n">text</span>
<span class="k">if</span> <span class="n">excess</span> <span class="o">%</span> <span class="mi">2</span><span class="p">:</span>
@ -647,13 +647,13 @@
<span class="k">if</span> <span class="n">line</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">and</span> <span class="ow">not</span> <span class="n">line</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="n">line</span>
<span class="p">)</span>
<span class="o">+</span> <span class="n">hfill_char</span> <span class="o">*</span> <span class="p">(</span><span class="n">width</span> <span class="o">-</span> <span class="n">m_len</span><span class="p">(</span><span class="n">line</span><span class="p">))</span>
<span class="o">+</span> <span class="n">hfill_char</span> <span class="o">*</span> <span class="p">(</span><span class="n">width</span> <span class="o">-</span> <span class="n">d_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">data</span>
<span class="p">]</span>
<span class="k">return</span> <span class="n">lines</span>
<span class="k">elif</span> <span class="n">align</span> <span class="o">==</span> <span class="s2">&quot;r&quot;</span><span class="p">:</span>
<span class="k">return</span> <span class="p">[</span>
<span class="n">hfill_char</span> <span class="o">*</span> <span class="p">(</span><span class="n">width</span> <span class="o">-</span> <span class="n">m_len</span><span class="p">(</span><span class="n">line</span><span class="p">))</span>
<span class="n">hfill_char</span> <span class="o">*</span> <span class="p">(</span><span class="n">width</span> <span class="o">-</span> <span class="n">d_len</span><span class="p">(</span><span class="n">line</span><span class="p">))</span>
<span class="o">+</span> <span class="p">(</span>
<span class="s2">&quot; &quot;</span> <span class="o">+</span> <span class="n">line</span><span class="o">.</span><span class="n">rstrip</span><span class="p">(</span><span class="s2">&quot; &quot;</span><span class="p">)</span>
<span class="k">if</span> <span class="n">line</span><span class="o">.</span><span class="n">endswith</span><span class="p">(</span><span class="s2">&quot; &quot;</span><span class="p">)</span> <span class="ow">and</span> <span class="ow">not</span> <span class="n">line</span><span class="o">.</span><span class="n">endswith</span><span class="p">(</span><span class="s2">&quot; &quot;</span><span class="p">)</span>
@ -794,7 +794,7 @@
<span class="sd"> natural_width (int): Width of cell.</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="k">return</span> <span class="n">m_len</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">formatted</span><span class="p">[</span><span class="mi">0</span><span class="p">])</span> <span class="c1"># if self.formatted else 0</span></div>
<span class="k">return</span> <span class="n">d_len</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">formatted</span><span class="p">[</span><span class="mi">0</span><span class="p">])</span> <span class="c1"># if self.formatted else 0</span></div>
<div class="viewcode-block" id="EvCell.replace_data"><a class="viewcode-back" href="../../../api/evennia.utils.evtable.html#evennia.utils.evtable.EvCell.replace_data">[docs]</a> <span class="k">def</span> <span class="nf">replace_data</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">data</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;</span>
@ -809,7 +809,7 @@
<span class="sd"> &quot;&quot;&quot;</span>
<span class="bp">self</span><span class="o">.</span><span class="n">data</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_split_lines</span><span class="p">(</span><span class="n">_to_ansi</span><span class="p">(</span><span class="n">data</span><span class="p">))</span>
<span class="bp">self</span><span class="o">.</span><span class="n">raw_width</span> <span class="o">=</span> <span class="nb">max</span><span class="p">(</span><span class="n">m_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="bp">self</span><span class="o">.</span><span class="n">data</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">raw_width</span> <span class="o">=</span> <span class="nb">max</span><span class="p">(</span><span class="n">d_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="bp">self</span><span class="o">.</span><span class="n">data</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">raw_height</span> <span class="o">=</span> <span class="nb">len</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">data</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">reformat</span><span class="p">(</span><span class="o">**</span><span class="n">kwargs</span><span class="p">)</span></div>

View file

@ -106,14 +106,66 @@
<span class="kn">import</span> <span class="nn">re</span>
<span class="kn">import</span> <span class="nn">fnmatch</span>
<span class="kn">import</span> <span class="nn">random</span> <span class="k">as</span> <span class="nn">base_random</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">evennia.utils</span> <span class="k">import</span> <span class="n">utils</span><span class="p">,</span> <span class="n">logger</span>
<span class="c1"># The stack size is a security measure. Set to &lt;=0 to disable.</span>
<span class="n">_STACK_MAXSIZE</span> <span class="o">=</span> <span class="n">settings</span><span class="o">.</span><span class="n">INLINEFUNC_STACK_MAXSIZE</span>
<span class="c1"># example/testing inline functions</span>
<div class="viewcode-block" id="random"><a class="viewcode-back" href="../../../api/evennia.utils.inlinefuncs.html#evennia.utils.inlinefuncs.random">[docs]</a><span class="k">def</span> <span class="nf">random</span><span class="p">(</span><span class="o">*</span><span class="n">args</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> Inlinefunc. Returns a random number between</span>
<span class="sd"> 0 and 1, from 0 to a maximum value, or within a given range (inclusive).</span>
<span class="sd"> Args:</span>
<span class="sd"> minval (str, optional): Minimum value. If not given, assumed 0.</span>
<span class="sd"> maxval (str, optional): Maximum value.</span>
<span class="sd"> Keyword argumuents:</span>
<span class="sd"> session (Session): Session getting the string.</span>
<span class="sd"> Notes:</span>
<span class="sd"> If either of the min/maxvalue has a &#39;.&#39; in it, a floating-point random</span>
<span class="sd"> value will be returned. Otherwise it will be an integer value in the</span>
<span class="sd"> given range.</span>
<span class="sd"> Example:</span>
<span class="sd"> `$random()`</span>
<span class="sd"> `$random(5)`</span>
<span class="sd"> `$random(5, 10)`</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="n">nargs</span> <span class="o">=</span> <span class="nb">len</span><span class="p">(</span><span class="n">args</span><span class="p">)</span>
<span class="k">if</span> <span class="n">nargs</span> <span class="o">==</span> <span class="mi">1</span><span class="p">:</span>
<span class="c1"># only maxval given</span>
<span class="n">minval</span><span class="p">,</span> <span class="n">maxval</span> <span class="o">=</span> <span class="s2">&quot;0&quot;</span><span class="p">,</span> <span class="n">args</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span>
<span class="k">elif</span> <span class="n">nargs</span> <span class="o">&gt;</span> <span class="mi">1</span><span class="p">:</span>
<span class="n">minval</span><span class="p">,</span> <span class="n">maxval</span> <span class="o">=</span> <span class="n">args</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">minval</span><span class="p">,</span> <span class="n">maxval</span> <span class="o">=</span> <span class="p">(</span><span class="s2">&quot;0&quot;</span><span class="p">,</span> <span class="s2">&quot;1&quot;</span><span class="p">)</span>
<span class="k">if</span> <span class="s2">&quot;.&quot;</span> <span class="ow">in</span> <span class="n">minval</span> <span class="ow">or</span> <span class="s2">&quot;.&quot;</span> <span class="ow">in</span> <span class="n">maxval</span><span class="p">:</span>
<span class="c1"># float mode</span>
<span class="k">try</span><span class="p">:</span>
<span class="n">minval</span><span class="p">,</span> <span class="n">maxval</span> <span class="o">=</span> <span class="nb">float</span><span class="p">(</span><span class="n">minval</span><span class="p">),</span> <span class="nb">float</span><span class="p">(</span><span class="n">maxval</span><span class="p">)</span>
<span class="k">except</span> <span class="ne">ValueError</span><span class="p">:</span>
<span class="n">minval</span><span class="p">,</span> <span class="n">maxval</span> <span class="o">=</span> <span class="mi">0</span><span class="p">,</span> <span class="mi">1</span>
<span class="k">return</span> <span class="s2">&quot;</span><span class="si">{:.2f}</span><span class="s2">&quot;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">minval</span> <span class="o">+</span> <span class="n">maxval</span> <span class="o">*</span> <span class="n">base_random</span><span class="o">.</span><span class="n">random</span><span class="p">())</span>
<span class="k">else</span><span class="p">:</span>
<span class="c1"># int mode</span>
<span class="k">try</span><span class="p">:</span>
<span class="n">minval</span><span class="p">,</span> <span class="n">maxval</span> <span class="o">=</span> <span class="nb">int</span><span class="p">(</span><span class="n">minval</span><span class="p">),</span> <span class="nb">int</span><span class="p">(</span><span class="n">maxval</span><span class="p">)</span>
<span class="k">except</span> <span class="ne">ValueError</span><span class="p">:</span>
<span class="n">minval</span><span class="p">,</span> <span class="n">maxval</span> <span class="o">=</span> <span class="mi">0</span><span class="p">,</span> <span class="mi">1</span>
<span class="k">return</span> <span class="nb">str</span><span class="p">(</span><span class="n">base_random</span><span class="o">.</span><span class="n">randint</span><span class="p">(</span><span class="n">minval</span><span class="p">,</span> <span class="n">maxval</span><span class="p">))</span></div>
<div class="viewcode-block" id="pad"><a class="viewcode-back" href="../../../api/evennia.utils.inlinefuncs.html#evennia.utils.inlinefuncs.pad">[docs]</a><span class="k">def</span> <span class="nf">pad</span><span class="p">(</span><span class="o">*</span><span class="n">args</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> Inlinefunc. Pads text to given width.</span>
@ -123,7 +175,8 @@
<span class="sd"> width (str, optional): Will be converted to integer. Width</span>
<span class="sd"> of padding.</span>
<span class="sd"> align (str, optional): Alignment of padding; one of &#39;c&#39;, &#39;l&#39; or &#39;r&#39;.</span>
<span class="sd"> fillchar (str, optional): Character used for padding. Defaults to a space.</span>
<span class="sd"> fillchar (str, optional): Character used for padding. Defaults to a</span>
<span class="sd"> space.</span>
<span class="sd"> Keyword args:</span>
<span class="sd"> session (Session): Session performing the pad.</span>
@ -271,12 +324,6 @@
<span class="k">raise</span>
<span class="c1"># The stack size is a security measure. Set to &lt;=0 to disable.</span>
<span class="k">try</span><span class="p">:</span>
<span class="n">_STACK_MAXSIZE</span> <span class="o">=</span> <span class="n">settings</span><span class="o">.</span><span class="n">INLINEFUNC_STACK_MAXSIZE</span>
<span class="k">except</span> <span class="ne">AttributeError</span><span class="p">:</span>
<span class="n">_STACK_MAXSIZE</span> <span class="o">=</span> <span class="mi">20</span>
<span class="c1"># regex definitions</span>
<span class="n">_RE_STARTTOKEN</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;(?&lt;!</span><span class="se">\\</span><span class="s2">)\$(\w+)\(&quot;</span><span class="p">)</span> <span class="c1"># unescaped $funcname( (start of function call)</span>
@ -509,6 +556,20 @@
<span class="k">return</span> <span class="n">retval</span></div>
<div class="viewcode-block" id="raw"><a class="viewcode-back" href="../../../api/evennia.utils.inlinefuncs.html#evennia.utils.inlinefuncs.raw">[docs]</a><span class="k">def</span> <span class="nf">raw</span><span class="p">(</span><span class="n">string</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> Escape all inlinefuncs in a string so they won&#39;t get parsed.</span>
<span class="sd"> Args:</span>
<span class="sd"> string (str): String with inlinefuncs to escape.</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="k">def</span> <span class="nf">_escape</span><span class="p">(</span><span class="n">match</span><span class="p">):</span>
<span class="k">return</span> <span class="s2">&quot;</span><span class="se">\\</span><span class="s2">&quot;</span> <span class="o">+</span> <span class="n">match</span><span class="o">.</span><span class="n">group</span><span class="p">(</span><span class="mi">0</span><span class="p">)</span>
<span class="k">return</span> <span class="n">_RE_STARTTOKEN</span><span class="o">.</span><span class="n">sub</span><span class="p">(</span><span class="n">_escape</span><span class="p">,</span> <span class="n">string</span><span class="p">)</span></div>
<span class="c1">#</span>
<span class="c1"># Nick templating</span>
<span class="c1">#</span>

View file

@ -72,7 +72,7 @@
<span class="kn">from</span> <span class="nn">ast</span> <span class="k">import</span> <span class="n">literal_eval</span>
<span class="kn">from</span> <span class="nn">datetime</span> <span class="k">import</span> <span class="n">datetime</span>
<span class="kn">from</span> <span class="nn">copy</span> <span class="k">import</span> <span class="n">deepcopy</span>
<span class="kn">from</span> <span class="nn">copy</span> <span class="k">import</span> <span class="n">deepcopy</span><span class="p">,</span> <span class="n">Error</span> <span class="k">as</span> <span class="n">CopyError</span>
<span class="kn">from</span> <span class="nn">base64</span> <span class="k">import</span> <span class="n">b64encode</span><span class="p">,</span> <span class="n">b64decode</span>
<span class="kn">from</span> <span class="nn">zlib</span> <span class="k">import</span> <span class="n">compress</span><span class="p">,</span> <span class="n">decompress</span>
@ -85,6 +85,7 @@
<span class="kn">from</span> <span class="nn">pickle</span> <span class="k">import</span> <span class="n">loads</span><span class="p">,</span> <span class="n">dumps</span>
<span class="kn">from</span> <span class="nn">django.utils.encoding</span> <span class="k">import</span> <span class="n">force_str</span>
<span class="kn">from</span> <span class="nn">evennia.utils.dbserialize</span> <span class="k">import</span> <span class="n">pack_dbobj</span>
<span class="n">DEFAULT_PROTOCOL</span> <span class="o">=</span> <span class="mi">4</span>
@ -133,7 +134,15 @@
<span class="c1"># The reason this is important is because we do all of our lookups as</span>
<span class="c1"># simple string matches, thus the character streams must be the same</span>
<span class="c1"># for the lookups to work properly. See tests.py for more information.</span>
<span class="n">value</span> <span class="o">=</span> <span class="n">dumps</span><span class="p">(</span><span class="n">deepcopy</span><span class="p">(</span><span class="n">value</span><span class="p">),</span> <span class="n">protocol</span><span class="o">=</span><span class="n">pickle_protocol</span><span class="p">)</span>
<span class="k">try</span><span class="p">:</span>
<span class="n">value</span> <span class="o">=</span> <span class="n">deepcopy</span><span class="p">(</span><span class="n">value</span><span class="p">)</span>
<span class="k">except</span> <span class="n">CopyError</span><span class="p">:</span>
<span class="c1"># this can happen on a manager query where the search query string is a</span>
<span class="c1"># database model.</span>
<span class="n">value</span> <span class="o">=</span> <span class="n">pack_dbobj</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">dumps</span><span class="p">(</span><span class="n">value</span><span class="p">,</span> <span class="n">protocol</span><span class="o">=</span><span class="n">pickle_protocol</span><span class="p">)</span>
<span class="k">if</span> <span class="n">compress_object</span><span class="p">:</span>
<span class="n">value</span> <span class="o">=</span> <span class="n">compress</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">b64encode</span><span class="p">(</span><span class="n">value</span><span class="p">)</span><span class="o">.</span><span class="n">decode</span><span class="p">()</span> <span class="c1"># decode bytes to str</span>

View file

@ -50,6 +50,7 @@
<span class="kn">import</span> <span class="nn">os</span>
<span class="kn">import</span> <span class="nn">gc</span>
<span class="kn">import</span> <span class="nn">sys</span>
<span class="kn">import</span> <span class="nn">copy</span>
<span class="kn">import</span> <span class="nn">types</span>
<span class="kn">import</span> <span class="nn">math</span>
<span class="kn">import</span> <span class="nn">re</span>
@ -60,6 +61,7 @@
<span class="kn">import</span> <span class="nn">importlib</span>
<span class="kn">import</span> <span class="nn">importlib.util</span>
<span class="kn">import</span> <span class="nn">importlib.machinery</span>
<span class="kn">from</span> <span class="nn">unicodedata</span> <span class="k">import</span> <span class="n">east_asian_width</span>
<span class="kn">from</span> <span class="nn">twisted.internet.task</span> <span class="k">import</span> <span class="n">deferLater</span>
<span class="kn">from</span> <span class="nn">twisted.internet.defer</span> <span class="k">import</span> <span class="n">returnValue</span> <span class="c1"># noqa - used as import target</span>
<span class="kn">from</span> <span class="nn">os.path</span> <span class="k">import</span> <span class="n">join</span> <span class="k">as</span> <span class="n">osjoin</span>
@ -70,6 +72,8 @@
<span class="kn">from</span> <span class="nn">django.utils</span> <span class="k">import</span> <span class="n">timezone</span>
<span class="kn">from</span> <span class="nn">django.utils.translation</span> <span class="k">import</span> <span class="n">gettext</span> <span class="k">as</span> <span class="n">_</span>
<span class="kn">from</span> <span class="nn">django.apps</span> <span class="k">import</span> <span class="n">apps</span>
<span class="kn">from</span> <span class="nn">django.core.validators</span> <span class="k">import</span> <span class="n">validate_email</span> <span class="k">as</span> <span class="n">django_validate_email</span>
<span class="kn">from</span> <span class="nn">django.core.exceptions</span> <span class="k">import</span> <span class="n">ValidationError</span> <span class="k">as</span> <span class="n">DjangoValidationError</span>
<span class="kn">from</span> <span class="nn">evennia.utils</span> <span class="k">import</span> <span class="n">logger</span>
<span class="n">_MULTIMATCH_TEMPLATE</span> <span class="o">=</span> <span class="n">settings</span><span class="o">.</span><span class="n">SEARCH_MULTIMATCH_TEMPLATE</span>
@ -381,14 +385,16 @@
<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">rows</span><span class="p">)</span></div>
<div class="viewcode-block" id="list_to_string"><a class="viewcode-back" href="../../../api/evennia.utils.utils.html#evennia.utils.utils.list_to_string">[docs]</a><span class="k">def</span> <span class="nf">list_to_string</span><span class="p">(</span><span class="n">inlist</span><span class="p">,</span> <span class="n">endsep</span><span class="o">=</span><span class="s2">&quot;and&quot;</span><span class="p">,</span> <span class="n">addquote</span><span class="o">=</span><span class="kc">False</span><span class="p">):</span>
<div class="viewcode-block" id="iter_to_string"><a class="viewcode-back" href="../../../api/evennia.utils.utils.html#evennia.utils.utils.iter_to_string">[docs]</a><span class="k">def</span> <span class="nf">iter_to_string</span><span class="p">(</span><span class="n">initer</span><span class="p">,</span> <span class="n">endsep</span><span class="o">=</span><span class="s2">&quot;and&quot;</span><span class="p">,</span> <span class="n">addquote</span><span class="o">=</span><span class="kc">False</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> This pretty-formats a list as string output, adding an optional</span>
<span class="sd"> This pretty-formats an iterable list as string output, adding an optional</span>
<span class="sd"> alternative separator to the second to last entry. If `addquote`</span>
<span class="sd"> is `True`, the outgoing strings will be surrounded by quotes.</span>
<span class="sd"> Args:</span>
<span class="sd"> inlist (list): The list to print.</span>
<span class="sd"> initer (any): Usually an iterable to print. Each element must be possible to</span>
<span class="sd"> present with a string. Note that if this is a generator, it will be</span>
<span class="sd"> consumed by this operation.</span>
<span class="sd"> endsep (str, optional): If set, the last item separator will</span>
<span class="sd"> be replaced with this value.</span>
<span class="sd"> addquote (bool, optional): This will surround all outgoing</span>
@ -413,16 +419,21 @@
<span class="n">endsep</span> <span class="o">=</span> <span class="s2">&quot;,&quot;</span>
<span class="k">else</span><span class="p">:</span>
<span class="n">endsep</span> <span class="o">=</span> <span class="s2">&quot; &quot;</span> <span class="o">+</span> <span class="n">endsep</span>
<span class="k">if</span> <span class="ow">not</span> <span class="n">inlist</span><span class="p">:</span>
<span class="k">if</span> <span class="ow">not</span> <span class="n">initer</span><span class="p">:</span>
<span class="k">return</span> <span class="s2">&quot;&quot;</span>
<span class="n">initer</span> <span class="o">=</span> <span class="nb">tuple</span><span class="p">(</span><span class="nb">str</span><span class="p">(</span><span class="n">val</span><span class="p">)</span> <span class="k">for</span> <span class="n">val</span> <span class="ow">in</span> <span class="n">make_iter</span><span class="p">(</span><span class="n">initer</span><span class="p">))</span>
<span class="k">if</span> <span class="n">addquote</span><span class="p">:</span>
<span class="k">if</span> <span class="nb">len</span><span class="p">(</span><span class="n">inlist</span><span class="p">)</span> <span class="o">==</span> <span class="mi">1</span><span class="p">:</span>
<span class="k">return</span> <span class="s1">&#39;&quot;</span><span class="si">%s</span><span class="s1">&quot;&#39;</span> <span class="o">%</span> <span class="n">inlist</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span>
<span class="k">return</span> <span class="s2">&quot;, &quot;</span><span class="o">.</span><span class="n">join</span><span class="p">(</span><span class="s1">&#39;&quot;</span><span class="si">%s</span><span class="s1">&quot;&#39;</span> <span class="o">%</span> <span class="n">v</span> <span class="k">for</span> <span class="n">v</span> <span class="ow">in</span> <span class="n">inlist</span><span class="p">[:</span><span class="o">-</span><span class="mi">1</span><span class="p">])</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">endsep</span><span class="p">,</span> <span class="s1">&#39;&quot;</span><span class="si">%s</span><span class="s1">&quot;&#39;</span> <span class="o">%</span> <span class="n">inlist</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="nb">len</span><span class="p">(</span><span class="n">initer</span><span class="p">)</span> <span class="o">==</span> <span class="mi">1</span><span class="p">:</span>
<span class="k">return</span> <span class="s1">&#39;&quot;</span><span class="si">%s</span><span class="s1">&quot;&#39;</span> <span class="o">%</span> <span class="n">initer</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span>
<span class="k">return</span> <span class="s2">&quot;, &quot;</span><span class="o">.</span><span class="n">join</span><span class="p">(</span><span class="s1">&#39;&quot;</span><span class="si">%s</span><span class="s1">&quot;&#39;</span> <span class="o">%</span> <span class="n">v</span> <span class="k">for</span> <span class="n">v</span> <span class="ow">in</span> <span class="n">initer</span><span class="p">[:</span><span class="o">-</span><span class="mi">1</span><span class="p">])</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">endsep</span><span class="p">,</span> <span class="s1">&#39;&quot;</span><span class="si">%s</span><span class="s1">&quot;&#39;</span> <span class="o">%</span> <span class="n">initer</span><span class="p">[</span><span class="o">-</span><span class="mi">1</span><span class="p">])</span>
<span class="k">else</span><span class="p">:</span>
<span class="k">if</span> <span class="nb">len</span><span class="p">(</span><span class="n">inlist</span><span class="p">)</span> <span class="o">==</span> <span class="mi">1</span><span class="p">:</span>
<span class="k">return</span> <span class="nb">str</span><span class="p">(</span><span class="n">inlist</span><span class="p">[</span><span class="mi">0</span><span class="p">])</span>
<span class="k">return</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">v</span><span class="p">)</span> <span class="k">for</span> <span class="n">v</span> <span class="ow">in</span> <span class="n">inlist</span><span class="p">[:</span><span class="o">-</span><span class="mi">1</span><span class="p">])</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">endsep</span><span class="p">,</span> <span class="n">inlist</span><span class="p">[</span><span class="o">-</span><span class="mi">1</span><span class="p">])</span></div>
<span class="k">if</span> <span class="nb">len</span><span class="p">(</span><span class="n">initer</span><span class="p">)</span> <span class="o">==</span> <span class="mi">1</span><span class="p">:</span>
<span class="k">return</span> <span class="nb">str</span><span class="p">(</span><span class="n">initer</span><span class="p">[</span><span class="mi">0</span><span class="p">])</span>
<span class="k">return</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">v</span><span class="p">)</span> <span class="k">for</span> <span class="n">v</span> <span class="ow">in</span> <span class="n">initer</span><span class="p">[:</span><span class="o">-</span><span class="mi">1</span><span class="p">])</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">endsep</span><span class="p">,</span> <span class="n">initer</span><span class="p">[</span><span class="o">-</span><span class="mi">1</span><span class="p">])</span></div>
<span class="c1"># legacy alias</span>
<span class="n">list_to_string</span> <span class="o">=</span> <span class="n">iter_to_string</span>
<div class="viewcode-block" id="wildcard_to_regexp"><a class="viewcode-back" href="../../../api/evennia.utils.utils.html#evennia.utils.utils.wildcard_to_regexp">[docs]</a><span class="k">def</span> <span class="nf">wildcard_to_regexp</span><span class="p">(</span><span class="n">instring</span><span class="p">):</span>
@ -947,69 +958,25 @@
<div class="viewcode-block" id="validate_email_address"><a class="viewcode-back" href="../../../api/evennia.utils.utils.html#evennia.utils.utils.validate_email_address">[docs]</a><span class="k">def</span> <span class="nf">validate_email_address</span><span class="p">(</span><span class="n">emailaddress</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> Checks if an email address is syntactically correct.</span>
<span class="sd"> Checks if an email address is syntactically correct. Makes use</span>
<span class="sd"> of the django email-validator for consistency.</span>
<span class="sd"> Args:</span>
<span class="sd"> emailaddress (str): Email address to validate.</span>
<span class="sd"> Returns:</span>
<span class="sd"> is_valid (bool): If this is a valid email or not.</span>
<span class="sd"> Notes.</span>
<span class="sd"> (This snippet was adapted from</span>
<span class="sd"> http://commandline.org.uk/python/email-syntax-check.)</span>
<span class="sd"> bool: If this is a valid email or not.</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="n">emailaddress</span> <span class="o">=</span> <span class="sa">r</span><span class="s2">&quot;</span><span class="si">%s</span><span class="s2">&quot;</span> <span class="o">%</span> <span class="n">emailaddress</span>
<span class="n">domains</span> <span class="o">=</span> <span class="p">(</span>
<span class="s2">&quot;aero&quot;</span><span class="p">,</span>
<span class="s2">&quot;asia&quot;</span><span class="p">,</span>
<span class="s2">&quot;biz&quot;</span><span class="p">,</span>
<span class="s2">&quot;cat&quot;</span><span class="p">,</span>
<span class="s2">&quot;com&quot;</span><span class="p">,</span>
<span class="s2">&quot;coop&quot;</span><span class="p">,</span>
<span class="s2">&quot;edu&quot;</span><span class="p">,</span>
<span class="s2">&quot;gov&quot;</span><span class="p">,</span>
<span class="s2">&quot;info&quot;</span><span class="p">,</span>
<span class="s2">&quot;int&quot;</span><span class="p">,</span>
<span class="s2">&quot;jobs&quot;</span><span class="p">,</span>
<span class="s2">&quot;mil&quot;</span><span class="p">,</span>
<span class="s2">&quot;mobi&quot;</span><span class="p">,</span>
<span class="s2">&quot;museum&quot;</span><span class="p">,</span>
<span class="s2">&quot;name&quot;</span><span class="p">,</span>
<span class="s2">&quot;net&quot;</span><span class="p">,</span>
<span class="s2">&quot;org&quot;</span><span class="p">,</span>
<span class="s2">&quot;pro&quot;</span><span class="p">,</span>
<span class="s2">&quot;tel&quot;</span><span class="p">,</span>
<span class="s2">&quot;travel&quot;</span><span class="p">,</span>
<span class="p">)</span>
<span class="c1"># Email address must be more than 7 characters in total.</span>
<span class="k">if</span> <span class="nb">len</span><span class="p">(</span><span class="n">emailaddress</span><span class="p">)</span> <span class="o">&lt;</span> <span class="mi">7</span><span class="p">:</span>
<span class="k">return</span> <span class="kc">False</span> <span class="c1"># Address too short.</span>
<span class="c1"># Split up email address into parts.</span>
<span class="k">try</span><span class="p">:</span>
<span class="n">localpart</span><span class="p">,</span> <span class="n">domainname</span> <span class="o">=</span> <span class="n">emailaddress</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">host</span><span class="p">,</span> <span class="n">toplevel</span> <span class="o">=</span> <span class="n">domainname</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">except</span> <span class="ne">ValueError</span><span class="p">:</span>
<span class="k">return</span> <span class="kc">False</span> <span class="c1"># Address does not have enough parts.</span>
<span class="c1"># Check for Country code or Generic Domain.</span>
<span class="k">if</span> <span class="nb">len</span><span class="p">(</span><span class="n">toplevel</span><span class="p">)</span> <span class="o">!=</span> <span class="mi">2</span> <span class="ow">and</span> <span class="n">toplevel</span> <span class="ow">not</span> <span class="ow">in</span> <span class="n">domains</span><span class="p">:</span>
<span class="k">return</span> <span class="kc">False</span> <span class="c1"># Not a domain name.</span>
<span class="k">for</span> <span class="n">i</span> <span class="ow">in</span> <span class="s2">&quot;-_.%+.&quot;</span><span class="p">:</span>
<span class="n">localpart</span> <span class="o">=</span> <span class="n">localpart</span><span class="o">.</span><span class="n">replace</span><span class="p">(</span><span class="n">i</span><span class="p">,</span> <span class="s2">&quot;&quot;</span><span class="p">)</span>
<span class="k">for</span> <span class="n">i</span> <span class="ow">in</span> <span class="s2">&quot;-_.&quot;</span><span class="p">:</span>
<span class="n">host</span> <span class="o">=</span> <span class="n">host</span><span class="o">.</span><span class="n">replace</span><span class="p">(</span><span class="n">i</span><span class="p">,</span> <span class="s2">&quot;&quot;</span><span class="p">)</span>
<span class="k">if</span> <span class="n">localpart</span><span class="o">.</span><span class="n">isalnum</span><span class="p">()</span> <span class="ow">and</span> <span class="n">host</span><span class="o">.</span><span class="n">isalnum</span><span class="p">():</span>
<span class="k">return</span> <span class="kc">True</span> <span class="c1"># Email address is fine.</span>
<span class="n">django_validate_email</span><span class="p">(</span><span class="nb">str</span><span class="p">(</span><span class="n">emailaddress</span><span class="p">))</span>
<span class="k">except</span> <span class="n">DjangoValidationError</span><span class="p">:</span>
<span class="k">return</span> <span class="kc">False</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="k">return</span> <span class="kc">False</span>
<span class="k">else</span><span class="p">:</span>
<span class="k">return</span> <span class="kc">False</span> <span class="c1"># Email address has funny characters.</span></div>
<span class="k">return</span> <span class="kc">True</span></div>
<div class="viewcode-block" id="inherits_from"><a class="viewcode-back" href="../../../api/evennia.utils.utils.html#evennia.utils.utils.inherits_from">[docs]</a><span class="k">def</span> <span class="nf">inherits_from</span><span class="p">(</span><span class="n">obj</span><span class="p">,</span> <span class="n">parent</span><span class="p">):</span>
@ -2078,7 +2045,7 @@
<span class="sd"> back to normal len for other objects.</span>
<span class="sd"> Args:</span>
<span class="sd"> target (string): A string with potential MXP components</span>
<span class="sd"> target (str): A string with potential MXP components</span>
<span class="sd"> to search.</span>
<span class="sd"> Returns:</span>
@ -2093,6 +2060,33 @@
<span class="k">return</span> <span class="nb">len</span><span class="p">(</span><span class="n">target</span><span class="p">)</span></div>
<div class="viewcode-block" id="display_len"><a class="viewcode-back" href="../../../api/evennia.utils.utils.html#evennia.utils.utils.display_len">[docs]</a><span class="k">def</span> <span class="nf">display_len</span><span class="p">(</span><span class="n">target</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> Calculate the &#39;visible width&#39; of text. This is not necessarily the same as the</span>
<span class="sd"> number of characters in the case of certain asian characters. This will also</span>
<span class="sd"> strip MXP patterns.</span>
<span class="sd"> Args:</span>
<span class="sd"> target (any): Something to measure the length of. If a string, it will be</span>
<span class="sd"> measured keeping asian-character and MXP links in mind.</span>
<span class="sd"> Return:</span>
<span class="sd"> int: The visible width of the target.</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="c1"># Would create circular import if in module root.</span>
<span class="kn">from</span> <span class="nn">evennia.utils.ansi</span> <span class="k">import</span> <span class="n">ANSI_PARSER</span>
<span class="k">if</span> <span class="n">inherits_from</span><span class="p">(</span><span class="n">target</span><span class="p">,</span> <span class="nb">str</span><span class="p">):</span>
<span class="c1"># str or ANSIString</span>
<span class="n">target</span> <span class="o">=</span> <span class="n">ANSI_PARSER</span><span class="o">.</span><span class="n">strip_mxp</span><span class="p">(</span><span class="n">target</span><span class="p">)</span>
<span class="n">target</span> <span class="o">=</span> <span class="n">ANSI_PARSER</span><span class="o">.</span><span class="n">parse_ansi</span><span class="p">(</span><span class="n">target</span><span class="p">,</span> <span class="n">strip_ansi</span><span class="o">=</span><span class="kc">True</span><span class="p">)</span>
<span class="n">extra_wide</span> <span class="o">=</span> <span class="p">(</span><span class="s2">&quot;F&quot;</span><span class="p">,</span> <span class="s2">&quot;W&quot;</span><span class="p">)</span>
<span class="k">return</span> <span class="nb">sum</span><span class="p">(</span><span class="mi">2</span> <span class="k">if</span> <span class="n">east_asian_width</span><span class="p">(</span><span class="n">char</span><span class="p">)</span> <span class="ow">in</span> <span class="n">extra_wide</span> <span class="k">else</span> <span class="mi">1</span> <span class="k">for</span> <span class="n">char</span> <span class="ow">in</span> <span class="n">target</span><span class="p">)</span>
<span class="k">else</span><span class="p">:</span>
<span class="k">return</span> <span class="nb">len</span><span class="p">(</span><span class="n">target</span><span class="p">)</span></div>
<span class="c1"># -------------------------------------------------------------------</span>
<span class="c1"># Search handler function</span>
<span class="c1"># -------------------------------------------------------------------</span>

View file

@ -52,10 +52,8 @@
<span class="kn">import</span> <span class="nn">re</span> <span class="k">as</span> <span class="nn">_re</span>
<span class="kn">import</span> <span class="nn">pytz</span> <span class="k">as</span> <span class="nn">_pytz</span>
<span class="kn">import</span> <span class="nn">datetime</span> <span class="k">as</span> <span class="nn">_dt</span>
<span class="kn">from</span> <span class="nn">django.core.exceptions</span> <span class="k">import</span> <span class="n">ValidationError</span> <span class="k">as</span> <span class="n">_error</span>
<span class="kn">from</span> <span class="nn">django.core.validators</span> <span class="k">import</span> <span class="n">validate_email</span> <span class="k">as</span> <span class="n">_val_email</span>
<span class="kn">from</span> <span class="nn">evennia.utils.ansi</span> <span class="k">import</span> <span class="n">strip_ansi</span>
<span class="kn">from</span> <span class="nn">evennia.utils.utils</span> <span class="k">import</span> <span class="n">string_partial_matching</span> <span class="k">as</span> <span class="n">_partial</span>
<span class="kn">from</span> <span class="nn">evennia.utils.utils</span> <span class="k">import</span> <span class="n">string_partial_matching</span> <span class="k">as</span> <span class="n">_partial</span><span class="p">,</span> <span class="n">validate_email_address</span>
<span class="kn">from</span> <span class="nn">django.utils.translation</span> <span class="k">import</span> <span class="n">gettext</span> <span class="k">as</span> <span class="n">_</span>
<span class="n">_TZ_DICT</span> <span class="o">=</span> <span class="p">{</span><span class="nb">str</span><span class="p">(</span><span class="n">tz</span><span class="p">):</span> <span class="n">_pytz</span><span class="o">.</span><span class="n">timezone</span><span class="p">(</span><span class="n">tz</span><span class="p">)</span> <span class="k">for</span> <span class="n">tz</span> <span class="ow">in</span> <span class="n">_pytz</span><span class="o">.</span><span class="n">common_timezones</span><span class="p">}</span>
@ -255,9 +253,8 @@
<div class="viewcode-block" id="email"><a class="viewcode-back" href="../../../api/evennia.utils.validatorfuncs.html#evennia.utils.validatorfuncs.email">[docs]</a><span class="k">def</span> <span class="nf">email</span><span class="p">(</span><span class="n">entry</span><span class="p">,</span> <span class="n">option_key</span><span class="o">=</span><span class="s2">&quot;Email Address&quot;</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">):</span>
<span class="k">if</span> <span class="ow">not</span> <span class="n">entry</span><span class="p">:</span>
<span class="k">raise</span> <span class="ne">ValueError</span><span class="p">(</span><span class="s2">&quot;Email address field empty!&quot;</span><span class="p">)</span>
<span class="k">try</span><span class="p">:</span>
<span class="n">_val_email</span><span class="p">(</span><span class="nb">str</span><span class="p">(</span><span class="n">entry</span><span class="p">))</span> <span class="c1"># offloading the hard work to Django!</span>
<span class="k">except</span> <span class="n">_error</span><span class="p">:</span>
<span class="n">valid</span> <span class="o">=</span> <span class="n">validate_email_address</span><span class="p">(</span><span class="n">entry</span><span class="p">)</span>
<span class="k">if</span> <span class="ow">not</span> <span class="n">valid</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;That isn&#39;t a valid </span><span class="si">{option_key}</span><span class="s2">!&quot;</span><span class="p">)</span>
<span class="k">return</span> <span class="n">entry</span></div>

View file

@ -439,6 +439,29 @@ error (ValidationError, None): Any validation error(s) raised. Multiple</p>
would mean old passwords in the database (pre validation checks) could get invalidated.</p>
</dd></dl>
<dl class="py method">
<dt id="evennia.accounts.accounts.DefaultAccount.create_character">
<code class="sig-name descname">create_character</code><span class="sig-paren">(</span><em class="sig-param"><span class="o">*</span><span class="n">args</span></em>, <em class="sig-param"><span class="o">**</span><span class="n">kwargs</span></em><span class="sig-paren">)</span><a class="reference internal" href="../_modules/evennia/accounts/accounts.html#DefaultAccount.create_character"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#evennia.accounts.accounts.DefaultAccount.create_character" title="Permalink to this definition"></a></dt>
<dd><p>Create a character linked to this account.</p>
<dl class="field-list simple">
<dt class="field-odd">Parameters</dt>
<dd class="field-odd"><ul class="simple">
<li><p><strong>key</strong> (<em>str</em><em>, </em><em>optional</em>) If not given, use the same name as the account.</p></li>
<li><p><strong>typeclass</strong> (<em>str</em><em>, </em><em>optional</em>) Typeclass to use for this character. If
not given, use settings.BASE_CHARACTER_TYPECLASS.</p></li>
<li><p><strong>permissions</strong> (<em>list</em><em>, </em><em>optional</em>) If not given, use the accounts permissions.</p></li>
<li><p><strong>ip</strong> (<em>str</em><em>, </em><em>optiona</em>) The client IP creating this character. Will fall back to the
one stored for the account if not given.</p></li>
<li><p><strong>kwargs</strong> (<em>any</em>) Other kwargs will be used in the create_call.</p></li>
</ul>
</dd>
<dt class="field-even">Returns</dt>
<dd class="field-even"><p><em>Object</em> A new character of the <strong>character_typeclass</strong> type. None on an error.
list or None: A list of errors, or None.</p>
</dd>
</dl>
</dd></dl>
<dl class="py method">
<dt id="evennia.accounts.accounts.DefaultAccount.create">
<em class="property">classmethod </em><code class="sig-name descname">create</code><span class="sig-paren">(</span><em class="sig-param"><span class="o">*</span><span class="n">args</span></em>, <em class="sig-param"><span class="o">**</span><span class="n">kwargs</span></em><span class="sig-paren">)</span><a class="reference internal" href="../_modules/evennia/accounts/accounts.html#DefaultAccount.create"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#evennia.accounts.accounts.DefaultAccount.create" title="Permalink to this definition"></a></dt>
@ -532,7 +555,7 @@ commands at run-time.</p>
<dl class="py method">
<dt id="evennia.accounts.accounts.DefaultAccount.search">
<code class="sig-name descname">search</code><span class="sig-paren">(</span><em class="sig-param"><span class="n">searchdata</span></em>, <em class="sig-param"><span class="n">return_puppet</span><span class="o">=</span><span class="default_value">False</span></em>, <em class="sig-param"><span class="n">search_object</span><span class="o">=</span><span class="default_value">False</span></em>, <em class="sig-param"><span class="n">typeclass</span><span class="o">=</span><span class="default_value">None</span></em>, <em class="sig-param"><span class="n">nofound_string</span><span class="o">=</span><span class="default_value">None</span></em>, <em class="sig-param"><span class="n">multimatch_string</span><span class="o">=</span><span class="default_value">None</span></em>, <em class="sig-param"><span class="n">use_nicks</span><span class="o">=</span><span class="default_value">True</span></em>, <em class="sig-param"><span class="o">**</span><span class="n">kwargs</span></em><span class="sig-paren">)</span><a class="reference internal" href="../_modules/evennia/accounts/accounts.html#DefaultAccount.search"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#evennia.accounts.accounts.DefaultAccount.search" title="Permalink to this definition"></a></dt>
<code class="sig-name descname">search</code><span class="sig-paren">(</span><em class="sig-param"><span class="n">searchdata</span></em>, <em class="sig-param"><span class="n">return_puppet</span><span class="o">=</span><span class="default_value">False</span></em>, <em class="sig-param"><span class="n">search_object</span><span class="o">=</span><span class="default_value">False</span></em>, <em class="sig-param"><span class="n">typeclass</span><span class="o">=</span><span class="default_value">None</span></em>, <em class="sig-param"><span class="n">nofound_string</span><span class="o">=</span><span class="default_value">None</span></em>, <em class="sig-param"><span class="n">multimatch_string</span><span class="o">=</span><span class="default_value">None</span></em>, <em class="sig-param"><span class="n">use_nicks</span><span class="o">=</span><span class="default_value">True</span></em>, <em class="sig-param"><span class="n">quiet</span><span class="o">=</span><span class="default_value">False</span></em>, <em class="sig-param"><span class="o">**</span><span class="n">kwargs</span></em><span class="sig-paren">)</span><a class="reference internal" href="../_modules/evennia/accounts/accounts.html#DefaultAccount.search"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#evennia.accounts.accounts.DefaultAccount.search" title="Permalink to this definition"></a></dt>
<dd><p>This is similar to <strong>DefaultObject.search</strong> but defaults to searching
for Accounts only.</p>
<dl class="field-list simple">
@ -557,10 +580,13 @@ will fall back to the default handler.</p></li>
message to echo if <strong>searchdata</strong> leads to multiple matches.
If not given, will fall back to the default handler.</p></li>
<li><p><strong>use_nicks</strong> (<em>bool</em><em>, </em><em>optional</em>) Use account-level nick replacement.</p></li>
<li><p><strong>quiet</strong> (<em>bool</em><em>, </em><em>optional</em>) If set, will not show any error to the user,
and will also lead to returning a list of matches.</p></li>
</ul>
</dd>
<dt class="field-even">Returns</dt>
<dd class="field-even"><p><em>match (Account, Object or None)</em> A single Account or Object match.</p>
<dd class="field-even"><p><em>match (Account, Object or None)</em> A single Account or Object match.
list: If <strong>quiet=True</strong> this is a list of 0, 1 or more Account or Object matches.</p>
</dd>
</dl>
<p class="rubric">Notes</p>

View file

@ -150,6 +150,11 @@
<code class="sig-name descname">fields</code><em class="property"> = '__all__'</em><a class="headerlink" href="#evennia.accounts.admin.AccountForm.Meta.fields" title="Permalink to this definition"></a></dt>
<dd></dd></dl>
<dl class="py attribute">
<dt id="evennia.accounts.admin.AccountForm.Meta.app_label">
<code class="sig-name descname">app_label</code><em class="property"> = 'accounts'</em><a class="headerlink" href="#evennia.accounts.admin.AccountForm.Meta.app_label" title="Permalink to this definition"></a></dt>
<dd></dd></dl>
</dd></dl>
<dl class="py attribute">
@ -297,6 +302,11 @@
<code class="sig-name descname">add_fieldsets</code><em class="property"> = ((None, {'fields': ('username', 'password1', 'password2', 'email'), 'description': '&lt;i&gt;These account details are shared by the admin system and the game.&lt;/i&gt;'}),)</em><a class="headerlink" href="#evennia.accounts.admin.AccountDBAdmin.add_fieldsets" title="Permalink to this definition"></a></dt>
<dd></dd></dl>
<dl class="py method">
<dt id="evennia.accounts.admin.AccountDBAdmin.user_change_password">
<code class="sig-name descname">user_change_password</code><span class="sig-paren">(</span><em class="sig-param"><span class="o">*</span><span class="n">args</span></em>, <em class="sig-param"><span class="o">**</span><span class="n">kwargs</span></em><span class="sig-paren">)</span><a class="reference internal" href="../_modules/evennia/accounts/admin.html#AccountDBAdmin.user_change_password"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#evennia.accounts.admin.AccountDBAdmin.user_change_password" title="Permalink to this definition"></a></dt>
<dd></dd></dl>
<dl class="py method">
<dt id="evennia.accounts.admin.AccountDBAdmin.save_model">
<code class="sig-name descname">save_model</code><span class="sig-paren">(</span><em class="sig-param"><span class="n">request</span></em>, <em class="sig-param"><span class="n">obj</span></em>, <em class="sig-param"><span class="n">form</span></em>, <em class="sig-param"><span class="n">change</span></em><span class="sig-paren">)</span><a class="reference internal" href="../_modules/evennia/accounts/admin.html#AccountDBAdmin.save_model"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#evennia.accounts.admin.AccountDBAdmin.save_model" title="Permalink to this definition"></a></dt>

View file

@ -230,15 +230,20 @@ helps if wanting to selectively remov cmdsets.</p></li>
<dl class="py method">
<dt id="evennia.commands.cmdset.CmdSet.add">
<code class="sig-name descname">add</code><span class="sig-paren">(</span><em class="sig-param"><span class="n">cmd</span></em><span class="sig-paren">)</span><a class="reference internal" href="../_modules/evennia/commands/cmdset.html#CmdSet.add"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#evennia.commands.cmdset.CmdSet.add" title="Permalink to this definition"></a></dt>
<dd><p>Add a new command or commands to this CmdSetcommand, a list of
<code class="sig-name descname">add</code><span class="sig-paren">(</span><em class="sig-param"><span class="n">cmd</span></em>, <em class="sig-param"><span class="n">allow_duplicates</span><span class="o">=</span><span class="default_value">False</span></em><span class="sig-paren">)</span><a class="reference internal" href="../_modules/evennia/commands/cmdset.html#CmdSet.add"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#evennia.commands.cmdset.CmdSet.add" title="Permalink to this definition"></a></dt>
<dd><p>Add a new command or commands to this CmdSet, a list of
commands or a cmdset to this cmdset. Note that this is <em>not</em>
a merge operation (that is handled by the + operator).</p>
<dl class="field-list simple">
<dt class="field-odd">Parameters</dt>
<dd class="field-odd"><p><strong>cmd</strong> (<a class="reference internal" href="evennia.commands.command.html#evennia.commands.command.Command" title="evennia.commands.command.Command"><em>Command</em></a><em>, </em><em>list</em><em>, </em><em>Cmdset</em>) This allows for adding one or
<dd class="field-odd"><ul class="simple">
<li><p><strong>cmd</strong> (<a class="reference internal" href="evennia.commands.command.html#evennia.commands.command.Command" title="evennia.commands.command.Command"><em>Command</em></a><em>, </em><em>list</em><em>, </em><em>Cmdset</em>) This allows for adding one or
more commands to this Cmdset in one go. If another Cmdset
is given, all its commands will be added.</p>
is given, all its commands will be added.</p></li>
<li><p><strong>allow_duplicates</strong> (<em>bool</em><em>, </em><em>optional</em>) If set, will not try to remove
duplicate cmds in the set. This is needed during the merge process
to avoid wiping commands coming from cmdsets with duplicate=True.</p></li>
</ul>
</dd>
</dl>
<p class="rubric">Notes</p>

View file

@ -69,7 +69,7 @@ method. Otherwise all text will be returned to all connected sessions.</p>
<dl class="py attribute">
<dt id="evennia.commands.default.account.CmdOOCLook.aliases">
<code class="sig-name descname">aliases</code><em class="property"> = ['l', 'ls']</em><a class="headerlink" href="#evennia.commands.default.account.CmdOOCLook.aliases" title="Permalink to this definition"></a></dt>
<code class="sig-name descname">aliases</code><em class="property"> = ['ls', 'l']</em><a class="headerlink" href="#evennia.commands.default.account.CmdOOCLook.aliases" title="Permalink to this definition"></a></dt>
<dd></dd></dl>
<dl class="py attribute">
@ -100,7 +100,7 @@ method. Otherwise all text will be returned to all connected sessions.</p>
<dl class="py attribute">
<dt id="evennia.commands.default.account.CmdOOCLook.search_index_entry">
<code class="sig-name descname">search_index_entry</code><em class="property"> = {'aliases': 'l ls', 'category': 'general', 'key': 'look', 'tags': '', 'text': '\n look while out-of-character\n\n Usage:\n look\n\n Look in the ooc state.\n '}</em><a class="headerlink" href="#evennia.commands.default.account.CmdOOCLook.search_index_entry" title="Permalink to this definition"></a></dt>
<code class="sig-name descname">search_index_entry</code><em class="property"> = {'aliases': 'ls l', 'category': 'general', 'key': 'look', 'tags': '', 'text': '\n look while out-of-character\n\n Usage:\n look\n\n Look in the ooc state.\n '}</em><a class="headerlink" href="#evennia.commands.default.account.CmdOOCLook.search_index_entry" title="Permalink to this definition"></a></dt>
<dd></dd></dl>
</dd></dl>

View file

@ -253,7 +253,7 @@ to accounts respectively.</p>
<dl class="py attribute">
<dt id="evennia.commands.default.admin.CmdEmit.aliases">
<code class="sig-name descname">aliases</code><em class="property"> = ['pemit', 'remit']</em><a class="headerlink" href="#evennia.commands.default.admin.CmdEmit.aliases" title="Permalink to this definition"></a></dt>
<code class="sig-name descname">aliases</code><em class="property"> = ['remit', 'pemit']</em><a class="headerlink" href="#evennia.commands.default.admin.CmdEmit.aliases" title="Permalink to this definition"></a></dt>
<dd></dd></dl>
<dl class="py attribute">
@ -284,7 +284,7 @@ to accounts respectively.</p>
<dl class="py attribute">
<dt id="evennia.commands.default.admin.CmdEmit.search_index_entry">
<code class="sig-name descname">search_index_entry</code><em class="property"> = {'aliases': 'pemit remit', 'category': 'admin', 'key': 'emit', 'tags': '', 'text': '\n admin command for emitting message to multiple objects\n\n Usage:\n emit[/switches] [&lt;obj&gt;, &lt;obj&gt;, ... =] &lt;message&gt;\n remit [&lt;obj&gt;, &lt;obj&gt;, ... =] &lt;message&gt;\n pemit [&lt;obj&gt;, &lt;obj&gt;, ... =] &lt;message&gt;\n\n Switches:\n room - limit emits to rooms only (default)\n accounts - limit emits to accounts only\n contents - send to the contents of matched objects too\n\n Emits a message to the selected objects or to\n your immediate surroundings. If the object is a room,\n send to its contents. remit and pemit are just\n limited forms of emit, for sending to rooms and\n to accounts respectively.\n '}</em><a class="headerlink" href="#evennia.commands.default.admin.CmdEmit.search_index_entry" title="Permalink to this definition"></a></dt>
<code class="sig-name descname">search_index_entry</code><em class="property"> = {'aliases': 'remit pemit', 'category': 'admin', 'key': 'emit', 'tags': '', 'text': '\n admin command for emitting message to multiple objects\n\n Usage:\n emit[/switches] [&lt;obj&gt;, &lt;obj&gt;, ... =] &lt;message&gt;\n remit [&lt;obj&gt;, &lt;obj&gt;, ... =] &lt;message&gt;\n pemit [&lt;obj&gt;, &lt;obj&gt;, ... =] &lt;message&gt;\n\n Switches:\n room - limit emits to rooms only (default)\n accounts - limit emits to accounts only\n contents - send to the contents of matched objects too\n\n Emits a message to the selected objects or to\n your immediate surroundings. If the object is a room,\n send to its contents. remit and pemit are just\n limited forms of emit, for sending to rooms and\n to accounts respectively.\n '}</em><a class="headerlink" href="#evennia.commands.default.admin.CmdEmit.search_index_entry" title="Permalink to this definition"></a></dt>
<dd></dd></dl>
</dd></dl>

View file

@ -1018,6 +1018,11 @@ unique.</p>
<code class="sig-name descname">help_category</code><em class="property"> = 'building'</em><a class="headerlink" href="#evennia.commands.default.building.CmdOpen.help_category" title="Permalink to this definition"></a></dt>
<dd></dd></dl>
<dl class="py attribute">
<dt id="evennia.commands.default.building.CmdOpen.new_obj_lockstring">
<code class="sig-name descname">new_obj_lockstring</code><em class="property"> = 'control:id({id}) or perm(Admin);delete:id({id}) or perm(Admin)'</em><a class="headerlink" href="#evennia.commands.default.building.CmdOpen.new_obj_lockstring" title="Permalink to this definition"></a></dt>
<dd></dd></dl>
<dl class="py method">
<dt id="evennia.commands.default.building.CmdOpen.create_exit">
<code class="sig-name descname">create_exit</code><span class="sig-paren">(</span><em class="sig-param"><span class="n">exit_name</span></em>, <em class="sig-param"><span class="n">location</span></em>, <em class="sig-param"><span class="n">destination</span></em>, <em class="sig-param"><span class="n">exit_aliases</span><span class="o">=</span><span class="default_value">None</span></em>, <em class="sig-param"><span class="n">typeclass</span><span class="o">=</span><span class="default_value">None</span></em><span class="sig-paren">)</span><a class="reference internal" href="../_modules/evennia/commands/default/building.html#CmdOpen.create_exit"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#evennia.commands.default.building.CmdOpen.create_exit" title="Permalink to this definition"></a></dt>
@ -1262,7 +1267,7 @@ server settings.</p>
<dl class="py attribute">
<dt id="evennia.commands.default.building.CmdTypeclass.aliases">
<code class="sig-name descname">aliases</code><em class="property"> = ['parent', 'swap', 'update', 'type']</em><a class="headerlink" href="#evennia.commands.default.building.CmdTypeclass.aliases" title="Permalink to this definition"></a></dt>
<code class="sig-name descname">aliases</code><em class="property"> = ['parent', 'swap', 'type', 'update']</em><a class="headerlink" href="#evennia.commands.default.building.CmdTypeclass.aliases" title="Permalink to this definition"></a></dt>
<dd></dd></dl>
<dl class="py attribute">
@ -1293,7 +1298,7 @@ server settings.</p>
<dl class="py attribute">
<dt id="evennia.commands.default.building.CmdTypeclass.search_index_entry">
<code class="sig-name descname">search_index_entry</code><em class="property"> = {'aliases': 'parent swap update type', 'category': 'building', 'key': 'typeclass', 'tags': '', 'text': &quot;\n set or change an object's typeclass\n\n Usage:\n typeclass[/switch] &lt;object&gt; [= typeclass.path]\n typeclass/prototype &lt;object&gt; = prototype_key\n\n typeclass/list/show [typeclass.path]\n swap - this is a shorthand for using /force/reset flags.\n update - this is a shorthand for using the /force/reload flag.\n\n Switch:\n show, examine - display the current typeclass of object (default) or, if\n given a typeclass path, show the docstring of that typeclass.\n update - *only* re-run at_object_creation on this object\n meaning locks or other properties set later may remain.\n reset - clean out *all* the attributes and properties on the\n object - basically making this a new clean object.\n force - change to the typeclass also if the object\n already has a typeclass of the same name.\n list - show available typeclasses. Only typeclasses in modules actually\n imported or used from somewhere in the code will show up here\n (those typeclasses are still available if you know the path)\n prototype - clean and overwrite the object with the specified\n prototype key - effectively making a whole new object.\n\n Example:\n type button = examples.red_button.RedButton\n type/prototype button=a red button\n\n If the typeclass_path is not given, the current object's typeclass is\n assumed.\n\n View or set an object's typeclass. If setting, the creation hooks of the\n new typeclass will be run on the object. If you have clashing properties on\n the old class, use /reset. By default you are protected from changing to a\n typeclass of the same name as the one you already have - use /force to\n override this protection.\n\n The given typeclass must be identified by its location using python\n dot-notation pointing to the correct module and class. If no typeclass is\n given (or a wrong typeclass is given). Errors in the path or new typeclass\n will lead to the old typeclass being kept. The location of the typeclass\n module is searched from the default typeclass directory, as defined in the\n server settings.\n\n &quot;}</em><a class="headerlink" href="#evennia.commands.default.building.CmdTypeclass.search_index_entry" title="Permalink to this definition"></a></dt>
<code class="sig-name descname">search_index_entry</code><em class="property"> = {'aliases': 'parent swap type update', 'category': 'building', 'key': 'typeclass', 'tags': '', 'text': &quot;\n set or change an object's typeclass\n\n Usage:\n typeclass[/switch] &lt;object&gt; [= typeclass.path]\n typeclass/prototype &lt;object&gt; = prototype_key\n\n typeclass/list/show [typeclass.path]\n swap - this is a shorthand for using /force/reset flags.\n update - this is a shorthand for using the /force/reload flag.\n\n Switch:\n show, examine - display the current typeclass of object (default) or, if\n given a typeclass path, show the docstring of that typeclass.\n update - *only* re-run at_object_creation on this object\n meaning locks or other properties set later may remain.\n reset - clean out *all* the attributes and properties on the\n object - basically making this a new clean object.\n force - change to the typeclass also if the object\n already has a typeclass of the same name.\n list - show available typeclasses. Only typeclasses in modules actually\n imported or used from somewhere in the code will show up here\n (those typeclasses are still available if you know the path)\n prototype - clean and overwrite the object with the specified\n prototype key - effectively making a whole new object.\n\n Example:\n type button = examples.red_button.RedButton\n type/prototype button=a red button\n\n If the typeclass_path is not given, the current object's typeclass is\n assumed.\n\n View or set an object's typeclass. If setting, the creation hooks of the\n new typeclass will be run on the object. If you have clashing properties on\n the old class, use /reset. By default you are protected from changing to a\n typeclass of the same name as the one you already have - use /force to\n override this protection.\n\n The given typeclass must be identified by its location using python\n dot-notation pointing to the correct module and class. If no typeclass is\n given (or a wrong typeclass is given). Errors in the path or new typeclass\n will lead to the old typeclass being kept. The location of the typeclass\n module is searched from the default typeclass directory, as defined in the\n server settings.\n\n &quot;}</em><a class="headerlink" href="#evennia.commands.default.building.CmdTypeclass.search_index_entry" title="Permalink to this definition"></a></dt>
<dd></dd></dl>
</dd></dl>
@ -1446,7 +1451,7 @@ If object is not specified, the current location is examined.</p>
<dl class="py attribute">
<dt id="evennia.commands.default.building.CmdExamine.aliases">
<code class="sig-name descname">aliases</code><em class="property"> = ['exam', 'ex']</em><a class="headerlink" href="#evennia.commands.default.building.CmdExamine.aliases" title="Permalink to this definition"></a></dt>
<code class="sig-name descname">aliases</code><em class="property"> = ['ex', 'exam']</em><a class="headerlink" href="#evennia.commands.default.building.CmdExamine.aliases" title="Permalink to this definition"></a></dt>
<dd></dd></dl>
<dl class="py attribute">
@ -1469,10 +1474,41 @@ If object is not specified, the current location is examined.</p>
<code class="sig-name descname">account_mode</code><em class="property"> = False</em><a class="headerlink" href="#evennia.commands.default.building.CmdExamine.account_mode" title="Permalink to this definition"></a></dt>
<dd></dd></dl>
<dl class="py attribute">
<dt id="evennia.commands.default.building.CmdExamine.detail_color">
<code class="sig-name descname">detail_color</code><em class="property"> = '|c'</em><a class="headerlink" href="#evennia.commands.default.building.CmdExamine.detail_color" title="Permalink to this definition"></a></dt>
<dd></dd></dl>
<dl class="py attribute">
<dt id="evennia.commands.default.building.CmdExamine.header_color">
<code class="sig-name descname">header_color</code><em class="property"> = '|w'</em><a class="headerlink" href="#evennia.commands.default.building.CmdExamine.header_color" title="Permalink to this definition"></a></dt>
<dd></dd></dl>
<dl class="py attribute">
<dt id="evennia.commands.default.building.CmdExamine.quell_color">
<code class="sig-name descname">quell_color</code><em class="property"> = '|r'</em><a class="headerlink" href="#evennia.commands.default.building.CmdExamine.quell_color" title="Permalink to this definition"></a></dt>
<dd></dd></dl>
<dl class="py attribute">
<dt id="evennia.commands.default.building.CmdExamine.separator">
<code class="sig-name descname">separator</code><em class="property"> = '-'</em><a class="headerlink" href="#evennia.commands.default.building.CmdExamine.separator" title="Permalink to this definition"></a></dt>
<dd></dd></dl>
<dl class="py method">
<dt id="evennia.commands.default.building.CmdExamine.list_attribute">
<code class="sig-name descname">list_attribute</code><span class="sig-paren">(</span><em class="sig-param"><span class="n">crop</span></em>, <em class="sig-param"><span class="n">attr</span></em>, <em class="sig-param"><span class="n">category</span></em>, <em class="sig-param"><span class="n">value</span></em><span class="sig-paren">)</span><a class="reference internal" href="../_modules/evennia/commands/default/building.html#CmdExamine.list_attribute"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#evennia.commands.default.building.CmdExamine.list_attribute" title="Permalink to this definition"></a></dt>
<dd><p>Formats a single attribute line.</p>
<dl class="field-list simple">
<dt class="field-odd">Parameters</dt>
<dd class="field-odd"><ul class="simple">
<li><p><strong>crop</strong> (<em>bool</em>) If output should be cropped if too long.</p></li>
<li><p><strong>attr</strong> (<em>str</em>) Attribute key.</p></li>
<li><p><strong>category</strong> (<em>str</em>) Attribute category.</p></li>
<li><p><strong>value</strong> (<em>any</em>) Attribute value.</p></li>
</ul>
</dd>
</dl>
<p>Returns:</p>
</dd></dl>
<dl class="py method">
@ -1486,7 +1522,17 @@ non-persistent data stored on object</p>
<dt id="evennia.commands.default.building.CmdExamine.format_output">
<code class="sig-name descname">format_output</code><span class="sig-paren">(</span><em class="sig-param"><span class="n">obj</span></em>, <em class="sig-param"><span class="n">avail_cmdset</span></em><span class="sig-paren">)</span><a class="reference internal" href="../_modules/evennia/commands/default/building.html#CmdExamine.format_output"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#evennia.commands.default.building.CmdExamine.format_output" title="Permalink to this definition"></a></dt>
<dd><p>Helper function that creates a nice report about an object.</p>
<p>returns a string.</p>
<dl class="field-list simple">
<dt class="field-odd">Parameters</dt>
<dd class="field-odd"><ul class="simple">
<li><p><strong>obj</strong> (<em>any</em>) Object to analyze.</p></li>
<li><p><strong>avail_cmdset</strong> (<a class="reference internal" href="evennia.commands.cmdset.html#evennia.commands.cmdset.CmdSet" title="evennia.commands.cmdset.CmdSet"><em>CmdSet</em></a>) Current cmdset for object.</p></li>
</ul>
</dd>
<dt class="field-even">Returns</dt>
<dd class="field-even"><p><em>str</em> The formatted string.</p>
</dd>
</dl>
</dd></dl>
<dl class="py method">
@ -1502,7 +1548,7 @@ non-persistent data stored on object</p>
<dl class="py attribute">
<dt id="evennia.commands.default.building.CmdExamine.search_index_entry">
<code class="sig-name descname">search_index_entry</code><em class="property"> = {'aliases': 'exam ex', 'category': 'building', 'key': 'examine', 'tags': '', 'text': '\n get detailed information about an object\n\n Usage:\n examine [&lt;object&gt;[/attrname]]\n examine [*&lt;account&gt;[/attrname]]\n\n Switch:\n account - examine an Account (same as adding *)\n object - examine an Object (useful when OOC)\n\n The examine command shows detailed game info about an\n object and optionally a specific attribute on it.\n If object is not specified, the current location is examined.\n\n Append a * before the search string to examine an account.\n\n '}</em><a class="headerlink" href="#evennia.commands.default.building.CmdExamine.search_index_entry" title="Permalink to this definition"></a></dt>
<code class="sig-name descname">search_index_entry</code><em class="property"> = {'aliases': 'ex exam', 'category': 'building', 'key': 'examine', 'tags': '', 'text': '\n get detailed information about an object\n\n Usage:\n examine [&lt;object&gt;[/attrname]]\n examine [*&lt;account&gt;[/attrname]]\n\n Switch:\n account - examine an Account (same as adding *)\n object - examine an Object (useful when OOC)\n\n The examine command shows detailed game info about an\n object and optionally a specific attribute on it.\n If object is not specified, the current location is examined.\n\n Append a * before the search string to examine an account.\n\n '}</em><a class="headerlink" href="#evennia.commands.default.building.CmdExamine.search_index_entry" title="Permalink to this definition"></a></dt>
<dd></dd></dl>
</dd></dl>
@ -1536,7 +1582,7 @@ one is given.</p>
<dl class="py attribute">
<dt id="evennia.commands.default.building.CmdFind.aliases">
<code class="sig-name descname">aliases</code><em class="property"> = ['locate', 'search']</em><a class="headerlink" href="#evennia.commands.default.building.CmdFind.aliases" title="Permalink to this definition"></a></dt>
<code class="sig-name descname">aliases</code><em class="property"> = ['search', 'locate']</em><a class="headerlink" href="#evennia.commands.default.building.CmdFind.aliases" title="Permalink to this definition"></a></dt>
<dd></dd></dl>
<dl class="py attribute">
@ -1567,7 +1613,7 @@ one is given.</p>
<dl class="py attribute">
<dt id="evennia.commands.default.building.CmdFind.search_index_entry">
<code class="sig-name descname">search_index_entry</code><em class="property"> = {'aliases': 'locate search', 'category': 'building', 'key': 'find', 'tags': '', 'text': '\n search the database for objects\n\n Usage:\n find[/switches] &lt;name or dbref or *account&gt; [= dbrefmin[-dbrefmax]]\n locate - this is a shorthand for using the /loc switch.\n\n Switches:\n room - only look for rooms (location=None)\n exit - only look for exits (destination!=None)\n char - only look for characters (BASE_CHARACTER_TYPECLASS)\n exact - only exact matches are returned.\n loc - display object location if exists and match has one result\n startswith - search for names starting with the string, rather than containing\n\n Searches the database for an object of a particular name or exact #dbref.\n Use *accountname to search for an account. The switches allows for\n limiting object matches to certain game entities. Dbrefmin and dbrefmax\n limits matches to within the given dbrefs range, or above/below if only\n one is given.\n '}</em><a class="headerlink" href="#evennia.commands.default.building.CmdFind.search_index_entry" title="Permalink to this definition"></a></dt>
<code class="sig-name descname">search_index_entry</code><em class="property"> = {'aliases': 'search locate', 'category': 'building', 'key': 'find', 'tags': '', 'text': '\n search the database for objects\n\n Usage:\n find[/switches] &lt;name or dbref or *account&gt; [= dbrefmin[-dbrefmax]]\n locate - this is a shorthand for using the /loc switch.\n\n Switches:\n room - only look for rooms (location=None)\n exit - only look for exits (destination!=None)\n char - only look for characters (BASE_CHARACTER_TYPECLASS)\n exact - only exact matches are returned.\n loc - display object location if exists and match has one result\n startswith - search for names starting with the string, rather than containing\n\n Searches the database for an object of a particular name or exact #dbref.\n Use *accountname to search for an account. The switches allows for\n limiting object matches to certain game entities. Dbrefmin and dbrefmax\n limits matches to within the given dbrefs range, or above/below if only\n one is given.\n '}</em><a class="headerlink" href="#evennia.commands.default.building.CmdFind.search_index_entry" title="Permalink to this definition"></a></dt>
<dd></dd></dl>
</dd></dl>

View file

@ -233,7 +233,7 @@ Use addcom/delcom to join and leave channels</p>
<dl class="py attribute">
<dt id="evennia.commands.default.comms.CmdChannels.aliases">
<code class="sig-name descname">aliases</code><em class="property"> = ['comlist', 'clist', 'chanlist', 'all channels', 'channellist']</em><a class="headerlink" href="#evennia.commands.default.comms.CmdChannels.aliases" title="Permalink to this definition"></a></dt>
<code class="sig-name descname">aliases</code><em class="property"> = ['clist', 'all channels', 'channellist', 'chanlist', 'comlist']</em><a class="headerlink" href="#evennia.commands.default.comms.CmdChannels.aliases" title="Permalink to this definition"></a></dt>
<dd></dd></dl>
<dl class="py attribute">
@ -264,7 +264,7 @@ Use addcom/delcom to join and leave channels</p>
<dl class="py attribute">
<dt id="evennia.commands.default.comms.CmdChannels.search_index_entry">
<code class="sig-name descname">search_index_entry</code><em class="property"> = {'aliases': 'comlist clist chanlist all channels channellist', 'category': 'comms', 'key': 'channels', 'tags': '', 'text': &quot;\n list all channels available to you\n\n Usage:\n channels\n clist\n comlist\n\n Lists all channels available to you, whether you listen to them or not.\n Use 'comlist' to only view your current channel subscriptions.\n Use addcom/delcom to join and leave channels\n &quot;}</em><a class="headerlink" href="#evennia.commands.default.comms.CmdChannels.search_index_entry" title="Permalink to this definition"></a></dt>
<code class="sig-name descname">search_index_entry</code><em class="property"> = {'aliases': 'clist all channels channellist chanlist comlist', 'category': 'comms', 'key': 'channels', 'tags': '', 'text': &quot;\n list all channels available to you\n\n Usage:\n channels\n clist\n comlist\n\n Lists all channels available to you, whether you listen to them or not.\n Use 'comlist' to only view your current channel subscriptions.\n Use addcom/delcom to join and leave channels\n &quot;}</em><a class="headerlink" href="#evennia.commands.default.comms.CmdChannels.search_index_entry" title="Permalink to this definition"></a></dt>
<dd></dd></dl>
</dd></dl>

View file

@ -111,7 +111,7 @@ look <a href="#id1"><span class="problematic" id="id2">*</span></a>&lt;account&g
<dl class="py attribute">
<dt id="evennia.commands.default.general.CmdLook.aliases">
<code class="sig-name descname">aliases</code><em class="property"> = ['l', 'ls']</em><a class="headerlink" href="#evennia.commands.default.general.CmdLook.aliases" title="Permalink to this definition"></a></dt>
<code class="sig-name descname">aliases</code><em class="property"> = ['ls', 'l']</em><a class="headerlink" href="#evennia.commands.default.general.CmdLook.aliases" title="Permalink to this definition"></a></dt>
<dd></dd></dl>
<dl class="py attribute">
@ -142,7 +142,7 @@ look <a href="#id1"><span class="problematic" id="id2">*</span></a>&lt;account&g
<dl class="py attribute">
<dt id="evennia.commands.default.general.CmdLook.search_index_entry">
<code class="sig-name descname">search_index_entry</code><em class="property"> = {'aliases': 'l ls', 'category': 'general', 'key': 'look', 'tags': '', 'text': '\n look at location or object\n\n Usage:\n look\n look &lt;obj&gt;\n look *&lt;account&gt;\n\n Observes your location or objects in your vicinity.\n '}</em><a class="headerlink" href="#evennia.commands.default.general.CmdLook.search_index_entry" title="Permalink to this definition"></a></dt>
<code class="sig-name descname">search_index_entry</code><em class="property"> = {'aliases': 'ls l', 'category': 'general', 'key': 'look', 'tags': '', 'text': '\n look at location or object\n\n Usage:\n look\n look &lt;obj&gt;\n look *&lt;account&gt;\n\n Observes your location or objects in your vicinity.\n '}</em><a class="headerlink" href="#evennia.commands.default.general.CmdLook.search_index_entry" title="Permalink to this definition"></a></dt>
<dd></dd></dl>
</dd></dl>
@ -259,7 +259,7 @@ inv</p>
<dl class="py attribute">
<dt id="evennia.commands.default.general.CmdInventory.aliases">
<code class="sig-name descname">aliases</code><em class="property"> = ['inv', 'i']</em><a class="headerlink" href="#evennia.commands.default.general.CmdInventory.aliases" title="Permalink to this definition"></a></dt>
<code class="sig-name descname">aliases</code><em class="property"> = ['i', 'inv']</em><a class="headerlink" href="#evennia.commands.default.general.CmdInventory.aliases" title="Permalink to this definition"></a></dt>
<dd></dd></dl>
<dl class="py attribute">
@ -290,7 +290,7 @@ inv</p>
<dl class="py attribute">
<dt id="evennia.commands.default.general.CmdInventory.search_index_entry">
<code class="sig-name descname">search_index_entry</code><em class="property"> = {'aliases': 'inv i', 'category': 'general', 'key': 'inventory', 'tags': '', 'text': '\n view inventory\n\n Usage:\n inventory\n inv\n\n Shows your inventory.\n '}</em><a class="headerlink" href="#evennia.commands.default.general.CmdInventory.search_index_entry" title="Permalink to this definition"></a></dt>
<code class="sig-name descname">search_index_entry</code><em class="property"> = {'aliases': 'i inv', 'category': 'general', 'key': 'inventory', 'tags': '', 'text': '\n view inventory\n\n Usage:\n inventory\n inv\n\n Shows your inventory.\n '}</em><a class="headerlink" href="#evennia.commands.default.general.CmdInventory.search_index_entry" title="Permalink to this definition"></a></dt>
<dd></dd></dl>
</dd></dl>
@ -534,7 +534,7 @@ placing it in their inventory.</p>
<dl class="py attribute">
<dt id="evennia.commands.default.general.CmdSay.aliases">
<code class="sig-name descname">aliases</code><em class="property"> = [&quot;'&quot;, '&quot;']</em><a class="headerlink" href="#evennia.commands.default.general.CmdSay.aliases" title="Permalink to this definition"></a></dt>
<code class="sig-name descname">aliases</code><em class="property"> = ['&quot;', &quot;'&quot;]</em><a class="headerlink" href="#evennia.commands.default.general.CmdSay.aliases" title="Permalink to this definition"></a></dt>
<dd></dd></dl>
<dl class="py attribute">
@ -560,7 +560,7 @@ placing it in their inventory.</p>
<dl class="py attribute">
<dt id="evennia.commands.default.general.CmdSay.search_index_entry">
<code class="sig-name descname">search_index_entry</code><em class="property"> = {'aliases': '\' &quot;', 'category': 'general', 'key': 'say', 'tags': '', 'text': '\n speak as your character\n\n Usage:\n say &lt;message&gt;\n\n Talk to those in your current location.\n '}</em><a class="headerlink" href="#evennia.commands.default.general.CmdSay.search_index_entry" title="Permalink to this definition"></a></dt>
<code class="sig-name descname">search_index_entry</code><em class="property"> = {'aliases': '&quot; \'', 'category': 'general', 'key': 'say', 'tags': '', 'text': '\n speak as your character\n\n Usage:\n say &lt;message&gt;\n\n Talk to those in your current location.\n '}</em><a class="headerlink" href="#evennia.commands.default.general.CmdSay.search_index_entry" title="Permalink to this definition"></a></dt>
<dd></dd></dl>
</dd></dl>
@ -699,7 +699,7 @@ which permission groups you are a member of.</p>
<dl class="py attribute">
<dt id="evennia.commands.default.general.CmdAccess.aliases">
<code class="sig-name descname">aliases</code><em class="property"> = ['hierarchy', 'groups']</em><a class="headerlink" href="#evennia.commands.default.general.CmdAccess.aliases" title="Permalink to this definition"></a></dt>
<code class="sig-name descname">aliases</code><em class="property"> = ['groups', 'hierarchy']</em><a class="headerlink" href="#evennia.commands.default.general.CmdAccess.aliases" title="Permalink to this definition"></a></dt>
<dd></dd></dl>
<dl class="py attribute">
@ -730,7 +730,7 @@ which permission groups you are a member of.</p>
<dl class="py attribute">
<dt id="evennia.commands.default.general.CmdAccess.search_index_entry">
<code class="sig-name descname">search_index_entry</code><em class="property"> = {'aliases': 'hierarchy groups', 'category': 'general', 'key': 'access', 'tags': '', 'text': '\n show your current game access\n\n Usage:\n access\n\n This command shows you the permission hierarchy and\n which permission groups you are a member of.\n '}</em><a class="headerlink" href="#evennia.commands.default.general.CmdAccess.search_index_entry" title="Permalink to this definition"></a></dt>
<code class="sig-name descname">search_index_entry</code><em class="property"> = {'aliases': 'groups hierarchy', 'category': 'general', 'key': 'access', 'tags': '', 'text': '\n show your current game access\n\n Usage:\n access\n\n This command shows you the permission hierarchy and\n which permission groups you are a member of.\n '}</em><a class="headerlink" href="#evennia.commands.default.general.CmdAccess.search_index_entry" title="Permalink to this definition"></a></dt>
<dd></dd></dl>
</dd></dl>

View file

@ -373,7 +373,7 @@ given, &lt;nr&gt; defaults to 10.</p>
<dl class="py attribute">
<dt id="evennia.commands.default.system.CmdObjects.aliases">
<code class="sig-name descname">aliases</code><em class="property"> = ['db', 'listobjs', 'stats', 'listobjects']</em><a class="headerlink" href="#evennia.commands.default.system.CmdObjects.aliases" title="Permalink to this definition"></a></dt>
<code class="sig-name descname">aliases</code><em class="property"> = ['db', 'stats', 'listobjs', 'listobjects']</em><a class="headerlink" href="#evennia.commands.default.system.CmdObjects.aliases" title="Permalink to this definition"></a></dt>
<dd></dd></dl>
<dl class="py attribute">
@ -399,7 +399,7 @@ given, &lt;nr&gt; defaults to 10.</p>
<dl class="py attribute">
<dt id="evennia.commands.default.system.CmdObjects.search_index_entry">
<code class="sig-name descname">search_index_entry</code><em class="property"> = {'aliases': 'db listobjs stats listobjects', 'category': 'system', 'key': 'objects', 'tags': '', 'text': '\n statistics on objects in the database\n\n Usage:\n objects [&lt;nr&gt;]\n\n Gives statictics on objects in database as well as\n a list of &lt;nr&gt; latest objects in database. If not\n given, &lt;nr&gt; defaults to 10.\n '}</em><a class="headerlink" href="#evennia.commands.default.system.CmdObjects.search_index_entry" title="Permalink to this definition"></a></dt>
<code class="sig-name descname">search_index_entry</code><em class="property"> = {'aliases': 'db stats listobjs listobjects', 'category': 'system', 'key': 'objects', 'tags': '', 'text': '\n statistics on objects in the database\n\n Usage:\n objects [&lt;nr&gt;]\n\n Gives statictics on objects in database as well as\n a list of &lt;nr&gt; latest objects in database. If not\n given, &lt;nr&gt; defaults to 10.\n '}</em><a class="headerlink" href="#evennia.commands.default.system.CmdObjects.search_index_entry" title="Permalink to this definition"></a></dt>
<dd></dd></dl>
</dd></dl>

View file

@ -243,6 +243,16 @@ output sent to caller.msg in the game</p>
<code class="sig-name descname">test_ic</code><span class="sig-paren">(</span><span class="sig-paren">)</span><a class="reference internal" href="../_modules/evennia/commands/default/tests.html#TestAccount.test_ic"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#evennia.commands.default.tests.TestAccount.test_ic" title="Permalink to this definition"></a></dt>
<dd></dd></dl>
<dl class="py method">
<dt id="evennia.commands.default.tests.TestAccount.test_ic__other_object">
<code class="sig-name descname">test_ic__other_object</code><span class="sig-paren">(</span><span class="sig-paren">)</span><a class="reference internal" href="../_modules/evennia/commands/default/tests.html#TestAccount.test_ic__other_object"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#evennia.commands.default.tests.TestAccount.test_ic__other_object" title="Permalink to this definition"></a></dt>
<dd></dd></dl>
<dl class="py method">
<dt id="evennia.commands.default.tests.TestAccount.test_ic__nonaccess">
<code class="sig-name descname">test_ic__nonaccess</code><span class="sig-paren">(</span><span class="sig-paren">)</span><a class="reference internal" href="../_modules/evennia/commands/default/tests.html#TestAccount.test_ic__nonaccess"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#evennia.commands.default.tests.TestAccount.test_ic__nonaccess" title="Permalink to this definition"></a></dt>
<dd></dd></dl>
<dl class="py method">
<dt id="evennia.commands.default.tests.TestAccount.test_password">
<code class="sig-name descname">test_password</code><span class="sig-paren">(</span><span class="sig-paren">)</span><a class="reference internal" href="../_modules/evennia/commands/default/tests.html#TestAccount.test_password"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#evennia.commands.default.tests.TestAccount.test_password" title="Permalink to this definition"></a></dt>

View file

@ -58,7 +58,7 @@ connect “account name” “pass word”</p>
<dl class="py attribute">
<dt id="evennia.commands.default.unloggedin.CmdUnconnectedConnect.aliases">
<code class="sig-name descname">aliases</code><em class="property"> = ['con', 'conn', 'co']</em><a class="headerlink" href="#evennia.commands.default.unloggedin.CmdUnconnectedConnect.aliases" title="Permalink to this definition"></a></dt>
<code class="sig-name descname">aliases</code><em class="property"> = ['conn', 'co', 'con']</em><a class="headerlink" href="#evennia.commands.default.unloggedin.CmdUnconnectedConnect.aliases" title="Permalink to this definition"></a></dt>
<dd></dd></dl>
<dl class="py attribute">
@ -93,7 +93,7 @@ there is no object yet before the account has logged in)</p>
<dl class="py attribute">
<dt id="evennia.commands.default.unloggedin.CmdUnconnectedConnect.search_index_entry">
<code class="sig-name descname">search_index_entry</code><em class="property"> = {'aliases': 'con conn co', 'category': 'general', 'key': 'connect', 'tags': '', 'text': '\n connect to the game\n\n Usage (at login screen):\n connect accountname password\n connect &quot;account name&quot; &quot;pass word&quot;\n\n Use the create command to first create an account before logging in.\n\n If you have spaces in your name, enclose it in double quotes.\n '}</em><a class="headerlink" href="#evennia.commands.default.unloggedin.CmdUnconnectedConnect.search_index_entry" title="Permalink to this definition"></a></dt>
<code class="sig-name descname">search_index_entry</code><em class="property"> = {'aliases': 'conn co con', 'category': 'general', 'key': 'connect', 'tags': '', 'text': '\n connect to the game\n\n Usage (at login screen):\n connect accountname password\n connect &quot;account name&quot; &quot;pass word&quot;\n\n Use the create command to first create an account before logging in.\n\n If you have spaces in your name, enclose it in double quotes.\n '}</em><a class="headerlink" href="#evennia.commands.default.unloggedin.CmdUnconnectedConnect.search_index_entry" title="Permalink to this definition"></a></dt>
<dd></dd></dl>
</dd></dl>
@ -222,7 +222,7 @@ All it does is display the connect screen.</p>
<dl class="py attribute">
<dt id="evennia.commands.default.unloggedin.CmdUnconnectedLook.aliases">
<code class="sig-name descname">aliases</code><em class="property"> = ['l', 'look']</em><a class="headerlink" href="#evennia.commands.default.unloggedin.CmdUnconnectedLook.aliases" title="Permalink to this definition"></a></dt>
<code class="sig-name descname">aliases</code><em class="property"> = ['look', 'l']</em><a class="headerlink" href="#evennia.commands.default.unloggedin.CmdUnconnectedLook.aliases" title="Permalink to this definition"></a></dt>
<dd></dd></dl>
<dl class="py attribute">
@ -248,7 +248,7 @@ All it does is display the connect screen.</p>
<dl class="py attribute">
<dt id="evennia.commands.default.unloggedin.CmdUnconnectedLook.search_index_entry">
<code class="sig-name descname">search_index_entry</code><em class="property"> = {'aliases': 'l look', 'category': 'general', 'key': '__unloggedin_look_command', 'tags': '', 'text': '\n look when in unlogged-in state\n\n Usage:\n look\n\n This is an unconnected version of the look command for simplicity.\n\n This is called by the server and kicks everything in gear.\n All it does is display the connect screen.\n '}</em><a class="headerlink" href="#evennia.commands.default.unloggedin.CmdUnconnectedLook.search_index_entry" title="Permalink to this definition"></a></dt>
<code class="sig-name descname">search_index_entry</code><em class="property"> = {'aliases': 'look l', 'category': 'general', 'key': '__unloggedin_look_command', 'tags': '', 'text': '\n look when in unlogged-in state\n\n Usage:\n look\n\n This is an unconnected version of the look command for simplicity.\n\n This is called by the server and kicks everything in gear.\n All it does is display the connect screen.\n '}</em><a class="headerlink" href="#evennia.commands.default.unloggedin.CmdUnconnectedLook.search_index_entry" title="Permalink to this definition"></a></dt>
<dd></dd></dl>
</dd></dl>
@ -271,7 +271,7 @@ for simplicity. It shows a pane of info.</p>
<dl class="py attribute">
<dt id="evennia.commands.default.unloggedin.CmdUnconnectedHelp.aliases">
<code class="sig-name descname">aliases</code><em class="property"> = ['?', 'h']</em><a class="headerlink" href="#evennia.commands.default.unloggedin.CmdUnconnectedHelp.aliases" title="Permalink to this definition"></a></dt>
<code class="sig-name descname">aliases</code><em class="property"> = ['h', '?']</em><a class="headerlink" href="#evennia.commands.default.unloggedin.CmdUnconnectedHelp.aliases" title="Permalink to this definition"></a></dt>
<dd></dd></dl>
<dl class="py attribute">
@ -297,7 +297,7 @@ for simplicity. It shows a pane of info.</p>
<dl class="py attribute">
<dt id="evennia.commands.default.unloggedin.CmdUnconnectedHelp.search_index_entry">
<code class="sig-name descname">search_index_entry</code><em class="property"> = {'aliases': '? h', 'category': 'general', 'key': 'help', 'tags': '', 'text': '\n get help when in unconnected-in state\n\n Usage:\n help\n\n This is an unconnected version of the help command,\n for simplicity. It shows a pane of info.\n '}</em><a class="headerlink" href="#evennia.commands.default.unloggedin.CmdUnconnectedHelp.search_index_entry" title="Permalink to this definition"></a></dt>
<code class="sig-name descname">search_index_entry</code><em class="property"> = {'aliases': 'h ?', 'category': 'general', 'key': 'help', 'tags': '', 'text': '\n get help when in unconnected-in state\n\n Usage:\n help\n\n This is an unconnected version of the help command,\n for simplicity. It shows a pane of info.\n '}</em><a class="headerlink" href="#evennia.commands.default.unloggedin.CmdUnconnectedHelp.search_index_entry" title="Permalink to this definition"></a></dt>
<dd></dd></dl>
</dd></dl>

View file

@ -304,7 +304,8 @@ and <strong>senders</strong> keywords to create a Msg instance on the fly.</p></
to build senders for the message.</p></li>
<li><p><strong>sender_strings</strong> (<em>list</em><em>, </em><em>optional</em>) Name strings of senders. Used for external
connections where the sender is not an account or object.
When this is defined, external will be assumed.</p></li>
When this is defined, external will be assumed. The list will be
filtered so each sender-string only occurs once.</p></li>
<li><p><strong>keep_log</strong> (<em>bool</em><em> or </em><em>None</em><em>, </em><em>optional</em>) This allows to temporarily change the logging status of
this channel message. If <strong>None</strong>, the Channels <strong>keep_log</strong> Attribute will
be used. If <strong>True</strong> or <strong>False</strong>, that logging status will be used for this

View file

@ -680,7 +680,7 @@ try to influence the other part in the deal.</p>
<dl class="py attribute">
<dt id="evennia.contrib.barter.CmdStatus.aliases">
<code class="sig-name descname">aliases</code><em class="property"> = ['offers', 'deal']</em><a class="headerlink" href="#evennia.contrib.barter.CmdStatus.aliases" title="Permalink to this definition"></a></dt>
<code class="sig-name descname">aliases</code><em class="property"> = ['deal', 'offers']</em><a class="headerlink" href="#evennia.contrib.barter.CmdStatus.aliases" title="Permalink to this definition"></a></dt>
<dd></dd></dl>
<dl class="py attribute">
@ -706,7 +706,7 @@ try to influence the other part in the deal.</p>
<dl class="py attribute">
<dt id="evennia.contrib.barter.CmdStatus.search_index_entry">
<code class="sig-name descname">search_index_entry</code><em class="property"> = {'aliases': 'offers deal', 'category': 'trading', 'key': 'status', 'tags': '', 'text': &quot;\n show a list of the current deal\n\n Usage:\n status\n deal\n offers\n\n Shows the currently suggested offers on each sides of the deal. To\n accept the current deal, use the 'accept' command. Use 'offer' to\n change your deal. You might also want to use 'say', 'emote' etc to\n try to influence the other part in the deal.\n &quot;}</em><a class="headerlink" href="#evennia.contrib.barter.CmdStatus.search_index_entry" title="Permalink to this definition"></a></dt>
<code class="sig-name descname">search_index_entry</code><em class="property"> = {'aliases': 'deal offers', 'category': 'trading', 'key': 'status', 'tags': '', 'text': &quot;\n show a list of the current deal\n\n Usage:\n status\n deal\n offers\n\n Shows the currently suggested offers on each sides of the deal. To\n accept the current deal, use the 'accept' command. Use 'offer' to\n change your deal. You might also want to use 'say', 'emote' etc to\n try to influence the other part in the deal.\n &quot;}</em><a class="headerlink" href="#evennia.contrib.barter.CmdStatus.search_index_entry" title="Permalink to this definition"></a></dt>
<dd></dd></dl>
</dd></dl>

View file

@ -76,7 +76,7 @@ at them with this command.</p>
<dl class="py attribute">
<dt id="evennia.contrib.chargen.CmdOOCLook.aliases">
<code class="sig-name descname">aliases</code><em class="property"> = ['l', 'ls']</em><a class="headerlink" href="#evennia.contrib.chargen.CmdOOCLook.aliases" title="Permalink to this definition"></a></dt>
<code class="sig-name descname">aliases</code><em class="property"> = ['ls', 'l']</em><a class="headerlink" href="#evennia.contrib.chargen.CmdOOCLook.aliases" title="Permalink to this definition"></a></dt>
<dd></dd></dl>
<dl class="py attribute">
@ -108,7 +108,7 @@ that is checked by the &#64;ic command directly.</p>
<dl class="py attribute">
<dt id="evennia.contrib.chargen.CmdOOCLook.search_index_entry">
<code class="sig-name descname">search_index_entry</code><em class="property"> = {'aliases': 'l ls', 'category': 'general', 'key': 'look', 'tags': '', 'text': '\n ooc look\n\n Usage:\n look\n look &lt;character&gt;\n\n This is an OOC version of the look command. Since an Account doesn\'t\n have an in-game existence, there is no concept of location or\n &quot;self&quot;.\n\n If any characters are available for you to control, you may look\n at them with this command.\n '}</em><a class="headerlink" href="#evennia.contrib.chargen.CmdOOCLook.search_index_entry" title="Permalink to this definition"></a></dt>
<code class="sig-name descname">search_index_entry</code><em class="property"> = {'aliases': 'ls l', 'category': 'general', 'key': 'look', 'tags': '', 'text': '\n ooc look\n\n Usage:\n look\n look &lt;character&gt;\n\n This is an OOC version of the look command. Since an Account doesn\'t\n have an in-game existence, there is no concept of location or\n &quot;self&quot;.\n\n If any characters are available for you to control, you may look\n at them with this command.\n '}</em><a class="headerlink" href="#evennia.contrib.chargen.CmdOOCLook.search_index_entry" title="Permalink to this definition"></a></dt>
<dd></dd></dl>
</dd></dl>

View file

@ -627,7 +627,7 @@ inv</p>
<dl class="py attribute">
<dt id="evennia.contrib.clothing.CmdInventory.aliases">
<code class="sig-name descname">aliases</code><em class="property"> = ['inv', 'i']</em><a class="headerlink" href="#evennia.contrib.clothing.CmdInventory.aliases" title="Permalink to this definition"></a></dt>
<code class="sig-name descname">aliases</code><em class="property"> = ['i', 'inv']</em><a class="headerlink" href="#evennia.contrib.clothing.CmdInventory.aliases" title="Permalink to this definition"></a></dt>
<dd></dd></dl>
<dl class="py attribute">
@ -658,7 +658,7 @@ inv</p>
<dl class="py attribute">
<dt id="evennia.contrib.clothing.CmdInventory.search_index_entry">
<code class="sig-name descname">search_index_entry</code><em class="property"> = {'aliases': 'inv i', 'category': 'general', 'key': 'inventory', 'tags': '', 'text': '\n view inventory\n\n Usage:\n inventory\n inv\n\n Shows your inventory.\n '}</em><a class="headerlink" href="#evennia.contrib.clothing.CmdInventory.search_index_entry" title="Permalink to this definition"></a></dt>
<code class="sig-name descname">search_index_entry</code><em class="property"> = {'aliases': 'i inv', 'category': 'general', 'key': 'inventory', 'tags': '', 'text': '\n view inventory\n\n Usage:\n inventory\n inv\n\n Shows your inventory.\n '}</em><a class="headerlink" href="#evennia.contrib.clothing.CmdInventory.search_index_entry" title="Permalink to this definition"></a></dt>
<dd></dd></dl>
</dd></dl>

View file

@ -148,7 +148,7 @@ everyone but the person rolling.</p>
<dl class="py attribute">
<dt id="evennia.contrib.dice.CmdDice.aliases">
<code class="sig-name descname">aliases</code><em class="property"> = ['&#64;dice', 'roll']</em><a class="headerlink" href="#evennia.contrib.dice.CmdDice.aliases" title="Permalink to this definition"></a></dt>
<code class="sig-name descname">aliases</code><em class="property"> = ['roll', '&#64;dice']</em><a class="headerlink" href="#evennia.contrib.dice.CmdDice.aliases" title="Permalink to this definition"></a></dt>
<dd></dd></dl>
<dl class="py attribute">
@ -174,7 +174,7 @@ everyone but the person rolling.</p>
<dl class="py attribute">
<dt id="evennia.contrib.dice.CmdDice.search_index_entry">
<code class="sig-name descname">search_index_entry</code><em class="property"> = {'aliases': '&#64;dice roll', 'category': 'general', 'key': 'dice', 'tags': '', 'text': &quot;\n roll dice\n\n Usage:\n dice[/switch] &lt;nr&gt;d&lt;sides&gt; [modifier] [success condition]\n\n Switch:\n hidden - tell the room the roll is being done, but don't show the result\n secret - don't inform the room about neither roll nor result\n\n Examples:\n dice 3d6 + 4\n dice 1d100 - 2 &lt; 50\n\n This will roll the given number of dice with given sides and modifiers.\n So e.g. 2d6 + 3 means to 'roll a 6-sided die 2 times and add the result,\n then add 3 to the total'.\n Accepted modifiers are +, -, * and /.\n A success condition is given as normal Python conditionals\n (&lt;,&gt;,&lt;=,&gt;=,==,!=). So e.g. 2d6 + 3 &gt; 10 means that the roll will succeed\n only if the final result is above 8. If a success condition is given, the\n outcome (pass/fail) will be echoed along with how much it succeeded/failed\n with. The hidden/secret switches will hide all or parts of the roll from\n everyone but the person rolling.\n &quot;}</em><a class="headerlink" href="#evennia.contrib.dice.CmdDice.search_index_entry" title="Permalink to this definition"></a></dt>
<code class="sig-name descname">search_index_entry</code><em class="property"> = {'aliases': 'roll &#64;dice', 'category': 'general', 'key': 'dice', 'tags': '', 'text': &quot;\n roll dice\n\n Usage:\n dice[/switch] &lt;nr&gt;d&lt;sides&gt; [modifier] [success condition]\n\n Switch:\n hidden - tell the room the roll is being done, but don't show the result\n secret - don't inform the room about neither roll nor result\n\n Examples:\n dice 3d6 + 4\n dice 1d100 - 2 &lt; 50\n\n This will roll the given number of dice with given sides and modifiers.\n So e.g. 2d6 + 3 means to 'roll a 6-sided die 2 times and add the result,\n then add 3 to the total'.\n Accepted modifiers are +, -, * and /.\n A success condition is given as normal Python conditionals\n (&lt;,&gt;,&lt;=,&gt;=,==,!=). So e.g. 2d6 + 3 &gt; 10 means that the roll will succeed\n only if the final result is above 8. If a success condition is given, the\n outcome (pass/fail) will be echoed along with how much it succeeded/failed\n with. The hidden/secret switches will hide all or parts of the roll from\n everyone but the person rolling.\n &quot;}</em><a class="headerlink" href="#evennia.contrib.dice.CmdDice.search_index_entry" title="Permalink to this definition"></a></dt>
<dd></dd></dl>
</dd></dl>

View file

@ -73,7 +73,7 @@ the module given by settings.CONNECTION_SCREEN_MODULE.</p>
<dl class="py attribute">
<dt id="evennia.contrib.email_login.CmdUnconnectedConnect.aliases">
<code class="sig-name descname">aliases</code><em class="property"> = ['con', 'conn', 'co']</em><a class="headerlink" href="#evennia.contrib.email_login.CmdUnconnectedConnect.aliases" title="Permalink to this definition"></a></dt>
<code class="sig-name descname">aliases</code><em class="property"> = ['conn', 'co', 'con']</em><a class="headerlink" href="#evennia.contrib.email_login.CmdUnconnectedConnect.aliases" title="Permalink to this definition"></a></dt>
<dd></dd></dl>
<dl class="py attribute">
@ -103,7 +103,7 @@ there is no object yet before the account has logged in)</p>
<dl class="py attribute">
<dt id="evennia.contrib.email_login.CmdUnconnectedConnect.search_index_entry">
<code class="sig-name descname">search_index_entry</code><em class="property"> = {'aliases': 'con conn co', 'category': 'general', 'key': 'connect', 'tags': '', 'text': '\n Connect to the game.\n\n Usage (at login screen):\n connect &lt;email&gt; &lt;password&gt;\n\n Use the create command to first create an account before logging in.\n '}</em><a class="headerlink" href="#evennia.contrib.email_login.CmdUnconnectedConnect.search_index_entry" title="Permalink to this definition"></a></dt>
<code class="sig-name descname">search_index_entry</code><em class="property"> = {'aliases': 'conn co con', 'category': 'general', 'key': 'connect', 'tags': '', 'text': '\n Connect to the game.\n\n Usage (at login screen):\n connect &lt;email&gt; &lt;password&gt;\n\n Use the create command to first create an account before logging in.\n '}</em><a class="headerlink" href="#evennia.contrib.email_login.CmdUnconnectedConnect.search_index_entry" title="Permalink to this definition"></a></dt>
<dd></dd></dl>
</dd></dl>
@ -225,7 +225,7 @@ All it does is display the connect screen.</p>
<dl class="py attribute">
<dt id="evennia.contrib.email_login.CmdUnconnectedLook.aliases">
<code class="sig-name descname">aliases</code><em class="property"> = ['l', 'look']</em><a class="headerlink" href="#evennia.contrib.email_login.CmdUnconnectedLook.aliases" title="Permalink to this definition"></a></dt>
<code class="sig-name descname">aliases</code><em class="property"> = ['look', 'l']</em><a class="headerlink" href="#evennia.contrib.email_login.CmdUnconnectedLook.aliases" title="Permalink to this definition"></a></dt>
<dd></dd></dl>
<dl class="py attribute">
@ -251,7 +251,7 @@ All it does is display the connect screen.</p>
<dl class="py attribute">
<dt id="evennia.contrib.email_login.CmdUnconnectedLook.search_index_entry">
<code class="sig-name descname">search_index_entry</code><em class="property"> = {'aliases': 'l look', 'category': 'general', 'key': '__unloggedin_look_command', 'tags': '', 'text': '\n This is an unconnected version of the `look` command for simplicity.\n\n This is called by the server and kicks everything in gear.\n All it does is display the connect screen.\n '}</em><a class="headerlink" href="#evennia.contrib.email_login.CmdUnconnectedLook.search_index_entry" title="Permalink to this definition"></a></dt>
<code class="sig-name descname">search_index_entry</code><em class="property"> = {'aliases': 'look l', 'category': 'general', 'key': '__unloggedin_look_command', 'tags': '', 'text': '\n This is an unconnected version of the `look` command for simplicity.\n\n This is called by the server and kicks everything in gear.\n All it does is display the connect screen.\n '}</em><a class="headerlink" href="#evennia.contrib.email_login.CmdUnconnectedLook.search_index_entry" title="Permalink to this definition"></a></dt>
<dd></dd></dl>
</dd></dl>
@ -269,7 +269,7 @@ for simplicity. It shows a pane of info.</p>
<dl class="py attribute">
<dt id="evennia.contrib.email_login.CmdUnconnectedHelp.aliases">
<code class="sig-name descname">aliases</code><em class="property"> = ['?', 'h']</em><a class="headerlink" href="#evennia.contrib.email_login.CmdUnconnectedHelp.aliases" title="Permalink to this definition"></a></dt>
<code class="sig-name descname">aliases</code><em class="property"> = ['h', '?']</em><a class="headerlink" href="#evennia.contrib.email_login.CmdUnconnectedHelp.aliases" title="Permalink to this definition"></a></dt>
<dd></dd></dl>
<dl class="py attribute">
@ -295,7 +295,7 @@ for simplicity. It shows a pane of info.</p>
<dl class="py attribute">
<dt id="evennia.contrib.email_login.CmdUnconnectedHelp.search_index_entry">
<code class="sig-name descname">search_index_entry</code><em class="property"> = {'aliases': '? h', 'category': 'general', 'key': 'help', 'tags': '', 'text': '\n This is an unconnected version of the help command,\n for simplicity. It shows a pane of info.\n '}</em><a class="headerlink" href="#evennia.contrib.email_login.CmdUnconnectedHelp.search_index_entry" title="Permalink to this definition"></a></dt>
<code class="sig-name descname">search_index_entry</code><em class="property"> = {'aliases': 'h ?', 'category': 'general', 'key': 'help', 'tags': '', 'text': '\n This is an unconnected version of the help command,\n for simplicity. It shows a pane of info.\n '}</em><a class="headerlink" href="#evennia.contrib.email_login.CmdUnconnectedHelp.search_index_entry" title="Permalink to this definition"></a></dt>
<dd></dd></dl>
</dd></dl>

View file

@ -275,7 +275,7 @@ look <a href="#id1"><span class="problematic" id="id2">*</span></a>&lt;account&g
<dl class="py attribute">
<dt id="evennia.contrib.extended_room.CmdExtendedRoomLook.aliases">
<code class="sig-name descname">aliases</code><em class="property"> = ['l', 'ls']</em><a class="headerlink" href="#evennia.contrib.extended_room.CmdExtendedRoomLook.aliases" title="Permalink to this definition"></a></dt>
<code class="sig-name descname">aliases</code><em class="property"> = ['ls', 'l']</em><a class="headerlink" href="#evennia.contrib.extended_room.CmdExtendedRoomLook.aliases" title="Permalink to this definition"></a></dt>
<dd></dd></dl>
<dl class="py attribute">
@ -295,7 +295,7 @@ look <a href="#id1"><span class="problematic" id="id2">*</span></a>&lt;account&g
<dl class="py attribute">
<dt id="evennia.contrib.extended_room.CmdExtendedRoomLook.search_index_entry">
<code class="sig-name descname">search_index_entry</code><em class="property"> = {'aliases': 'l ls', 'category': 'general', 'key': 'look', 'tags': '', 'text': '\n look\n\n Usage:\n look\n look &lt;obj&gt;\n look &lt;room detail&gt;\n look *&lt;account&gt;\n\n Observes your location, details at your location or objects in your vicinity.\n '}</em><a class="headerlink" href="#evennia.contrib.extended_room.CmdExtendedRoomLook.search_index_entry" title="Permalink to this definition"></a></dt>
<code class="sig-name descname">search_index_entry</code><em class="property"> = {'aliases': 'ls l', 'category': 'general', 'key': 'look', 'tags': '', 'text': '\n look\n\n Usage:\n look\n look &lt;obj&gt;\n look &lt;room detail&gt;\n look *&lt;account&gt;\n\n Observes your location, details at your location or objects in your vicinity.\n '}</em><a class="headerlink" href="#evennia.contrib.extended_room.CmdExtendedRoomLook.search_index_entry" title="Permalink to this definition"></a></dt>
<dd></dd></dl>
</dd></dl>

View file

@ -51,7 +51,7 @@
<dl class="py attribute">
<dt id="evennia.contrib.ingame_python.commands.CmdCallback.aliases">
<code class="sig-name descname">aliases</code><em class="property"> = ['&#64;callback', '&#64;calls', '&#64;callbacks']</em><a class="headerlink" href="#evennia.contrib.ingame_python.commands.CmdCallback.aliases" title="Permalink to this definition"></a></dt>
<code class="sig-name descname">aliases</code><em class="property"> = ['&#64;calls', '&#64;callback', '&#64;callbacks']</em><a class="headerlink" href="#evennia.contrib.ingame_python.commands.CmdCallback.aliases" title="Permalink to this definition"></a></dt>
<dd></dd></dl>
<dl class="py attribute">
@ -132,7 +132,7 @@ on user permission.</p>
<dl class="py attribute">
<dt id="evennia.contrib.ingame_python.commands.CmdCallback.search_index_entry">
<code class="sig-name descname">search_index_entry</code><em class="property"> = {'aliases': '&#64;callback &#64;calls &#64;callbacks', 'category': 'building', 'key': '&#64;call', 'tags': '', 'text': '\n Command to edit callbacks.\n '}</em><a class="headerlink" href="#evennia.contrib.ingame_python.commands.CmdCallback.search_index_entry" title="Permalink to this definition"></a></dt>
<code class="sig-name descname">search_index_entry</code><em class="property"> = {'aliases': '&#64;calls &#64;callback &#64;callbacks', 'category': 'building', 'key': '&#64;call', 'tags': '', 'text': '\n Command to edit callbacks.\n '}</em><a class="headerlink" href="#evennia.contrib.ingame_python.commands.CmdCallback.search_index_entry" title="Permalink to this definition"></a></dt>
<dd></dd></dl>
</dd></dl>

View file

@ -635,7 +635,7 @@ a different language.</p>
<dl class="py attribute">
<dt id="evennia.contrib.rpsystem.CmdSay.aliases">
<code class="sig-name descname">aliases</code><em class="property"> = [&quot;'&quot;, '&quot;']</em><a class="headerlink" href="#evennia.contrib.rpsystem.CmdSay.aliases" title="Permalink to this definition"></a></dt>
<code class="sig-name descname">aliases</code><em class="property"> = ['&quot;', &quot;'&quot;]</em><a class="headerlink" href="#evennia.contrib.rpsystem.CmdSay.aliases" title="Permalink to this definition"></a></dt>
<dd></dd></dl>
<dl class="py attribute">
@ -661,7 +661,7 @@ a different language.</p>
<dl class="py attribute">
<dt id="evennia.contrib.rpsystem.CmdSay.search_index_entry">
<code class="sig-name descname">search_index_entry</code><em class="property"> = {'aliases': '\' &quot;', 'category': 'general', 'key': 'say', 'tags': '', 'text': '\n speak as your character\n\n Usage:\n say &lt;message&gt;\n\n Talk to those in your current location.\n '}</em><a class="headerlink" href="#evennia.contrib.rpsystem.CmdSay.search_index_entry" title="Permalink to this definition"></a></dt>
<code class="sig-name descname">search_index_entry</code><em class="property"> = {'aliases': '&quot; \'', 'category': 'general', 'key': 'say', 'tags': '', 'text': '\n speak as your character\n\n Usage:\n say &lt;message&gt;\n\n Talk to those in your current location.\n '}</em><a class="headerlink" href="#evennia.contrib.rpsystem.CmdSay.search_index_entry" title="Permalink to this definition"></a></dt>
<dd></dd></dl>
</dd></dl>

View file

@ -437,7 +437,8 @@ to its roster and then sorts them into a turn order. There can only be one
fight going on in a single room at a time, so the script is assigned to a
room as its object.</p>
<p>Fights persist until only one participant is left with any HP or all
remaining participants choose to end the combat with the disengage command.</p>
remaining participants choose to end the combat with the disengage
command.</p>
<dl class="py method">
<dt id="evennia.contrib.turnbattle.tb_range.TBRangeTurnHandler.at_script_creation">
<code class="sig-name descname">at_script_creation</code><span class="sig-paren">(</span><span class="sig-paren">)</span><a class="reference internal" href="../_modules/evennia/contrib/turnbattle/tb_range.html#TBRangeTurnHandler.at_script_creation"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#evennia.contrib.turnbattle.tb_range.TBRangeTurnHandler.at_script_creation" title="Permalink to this definition"></a></dt>

View file

@ -109,7 +109,7 @@ push the lid of the button away.</p>
<dl class="py attribute">
<dt id="evennia.contrib.tutorial_examples.cmdset_red_button.CmdPush.aliases">
<code class="sig-name descname">aliases</code><em class="property"> = ['push', 'press', 'press button']</em><a class="headerlink" href="#evennia.contrib.tutorial_examples.cmdset_red_button.CmdPush.aliases" title="Permalink to this definition"></a></dt>
<code class="sig-name descname">aliases</code><em class="property"> = ['press button', 'push', 'press']</em><a class="headerlink" href="#evennia.contrib.tutorial_examples.cmdset_red_button.CmdPush.aliases" title="Permalink to this definition"></a></dt>
<dd></dd></dl>
<dl class="py attribute">
@ -140,7 +140,7 @@ lid-state respectively.</p>
<dl class="py attribute">
<dt id="evennia.contrib.tutorial_examples.cmdset_red_button.CmdPush.search_index_entry">
<code class="sig-name descname">search_index_entry</code><em class="property"> = {'aliases': 'push press press button', 'category': 'general', 'key': 'push button', 'tags': '', 'text': '\n Push the red button\n\n Usage:\n push button\n\n '}</em><a class="headerlink" href="#evennia.contrib.tutorial_examples.cmdset_red_button.CmdPush.search_index_entry" title="Permalink to this definition"></a></dt>
<code class="sig-name descname">search_index_entry</code><em class="property"> = {'aliases': 'press button push press', 'category': 'general', 'key': 'push button', 'tags': '', 'text': '\n Push the red button\n\n Usage:\n push button\n\n '}</em><a class="headerlink" href="#evennia.contrib.tutorial_examples.cmdset_red_button.CmdPush.search_index_entry" title="Permalink to this definition"></a></dt>
<dd></dd></dl>
</dd></dl>
@ -210,7 +210,7 @@ of causing the lamp to break.</p>
<dl class="py attribute">
<dt id="evennia.contrib.tutorial_examples.cmdset_red_button.CmdOpenLid.aliases">
<code class="sig-name descname">aliases</code><em class="property"> = ['open button', 'open']</em><a class="headerlink" href="#evennia.contrib.tutorial_examples.cmdset_red_button.CmdOpenLid.aliases" title="Permalink to this definition"></a></dt>
<code class="sig-name descname">aliases</code><em class="property"> = ['open', 'open button']</em><a class="headerlink" href="#evennia.contrib.tutorial_examples.cmdset_red_button.CmdOpenLid.aliases" title="Permalink to this definition"></a></dt>
<dd></dd></dl>
<dl class="py attribute">
@ -236,7 +236,7 @@ of causing the lamp to break.</p>
<dl class="py attribute">
<dt id="evennia.contrib.tutorial_examples.cmdset_red_button.CmdOpenLid.search_index_entry">
<code class="sig-name descname">search_index_entry</code><em class="property"> = {'aliases': 'open button open', 'category': 'general', 'key': 'open lid', 'tags': '', 'text': '\n open lid\n\n Usage:\n open lid\n\n '}</em><a class="headerlink" href="#evennia.contrib.tutorial_examples.cmdset_red_button.CmdOpenLid.search_index_entry" title="Permalink to this definition"></a></dt>
<code class="sig-name descname">search_index_entry</code><em class="property"> = {'aliases': 'open open button', 'category': 'general', 'key': 'open lid', 'tags': '', 'text': '\n open lid\n\n Usage:\n open lid\n\n '}</em><a class="headerlink" href="#evennia.contrib.tutorial_examples.cmdset_red_button.CmdOpenLid.search_index_entry" title="Permalink to this definition"></a></dt>
<dd></dd></dl>
</dd></dl>
@ -306,7 +306,7 @@ of causing the lamp to break.</p>
<dl class="py attribute">
<dt id="evennia.contrib.tutorial_examples.cmdset_red_button.CmdBlindLook.aliases">
<code class="sig-name descname">aliases</code><em class="property"> = ['examine', 'l', 'get', 'listen', 'feel', 'ex']</em><a class="headerlink" href="#evennia.contrib.tutorial_examples.cmdset_red_button.CmdBlindLook.aliases" title="Permalink to this definition"></a></dt>
<code class="sig-name descname">aliases</code><em class="property"> = ['feel', 'examine', 'ex', 'l', 'listen', 'get']</em><a class="headerlink" href="#evennia.contrib.tutorial_examples.cmdset_red_button.CmdBlindLook.aliases" title="Permalink to this definition"></a></dt>
<dd></dd></dl>
<dl class="py attribute">
@ -332,7 +332,7 @@ of causing the lamp to break.</p>
<dl class="py attribute">
<dt id="evennia.contrib.tutorial_examples.cmdset_red_button.CmdBlindLook.search_index_entry">
<code class="sig-name descname">search_index_entry</code><em class="property"> = {'aliases': 'examine l get listen feel ex', 'category': 'general', 'key': 'look', 'tags': '', 'text': &quot;\n Looking around in darkness\n\n Usage:\n look &lt;obj&gt;\n\n ... not that there's much to see in the dark.\n\n &quot;}</em><a class="headerlink" href="#evennia.contrib.tutorial_examples.cmdset_red_button.CmdBlindLook.search_index_entry" title="Permalink to this definition"></a></dt>
<code class="sig-name descname">search_index_entry</code><em class="property"> = {'aliases': 'feel examine ex l listen get', 'category': 'general', 'key': 'look', 'tags': '', 'text': &quot;\n Looking around in darkness\n\n Usage:\n look &lt;obj&gt;\n\n ... not that there's much to see in the dark.\n\n &quot;}</em><a class="headerlink" href="#evennia.contrib.tutorial_examples.cmdset_red_button.CmdBlindLook.search_index_entry" title="Permalink to this definition"></a></dt>
<dd></dd></dl>
</dd></dl>

View file

@ -360,7 +360,7 @@ of the object. We overload it with our own version.</p>
<dl class="py attribute">
<dt id="evennia.contrib.tutorial_world.objects.CmdLight.aliases">
<code class="sig-name descname">aliases</code><em class="property"> = ['burn', 'light']</em><a class="headerlink" href="#evennia.contrib.tutorial_world.objects.CmdLight.aliases" title="Permalink to this definition"></a></dt>
<code class="sig-name descname">aliases</code><em class="property"> = ['light', 'burn']</em><a class="headerlink" href="#evennia.contrib.tutorial_world.objects.CmdLight.aliases" title="Permalink to this definition"></a></dt>
<dd></dd></dl>
<dl class="py attribute">
@ -387,7 +387,7 @@ to sit on a “lightable” object, we operate only on self.obj.</p>
<dl class="py attribute">
<dt id="evennia.contrib.tutorial_world.objects.CmdLight.search_index_entry">
<code class="sig-name descname">search_index_entry</code><em class="property"> = {'aliases': 'burn light', 'category': 'tutorialworld', 'key': 'on', 'tags': '', 'text': '\n Creates light where there was none. Something to burn.\n '}</em><a class="headerlink" href="#evennia.contrib.tutorial_world.objects.CmdLight.search_index_entry" title="Permalink to this definition"></a></dt>
<code class="sig-name descname">search_index_entry</code><em class="property"> = {'aliases': 'light burn', 'category': 'tutorialworld', 'key': 'on', 'tags': '', 'text': '\n Creates light where there was none. Something to burn.\n '}</em><a class="headerlink" href="#evennia.contrib.tutorial_world.objects.CmdLight.search_index_entry" title="Permalink to this definition"></a></dt>
<dd></dd></dl>
</dd></dl>
@ -491,7 +491,7 @@ shift green root up/down</p>
<dl class="py attribute">
<dt id="evennia.contrib.tutorial_world.objects.CmdShiftRoot.aliases">
<code class="sig-name descname">aliases</code><em class="property"> = ['shiftroot', 'push', 'pull', 'move']</em><a class="headerlink" href="#evennia.contrib.tutorial_world.objects.CmdShiftRoot.aliases" title="Permalink to this definition"></a></dt>
<code class="sig-name descname">aliases</code><em class="property"> = ['shiftroot', 'push', 'move', 'pull']</em><a class="headerlink" href="#evennia.contrib.tutorial_world.objects.CmdShiftRoot.aliases" title="Permalink to this definition"></a></dt>
<dd></dd></dl>
<dl class="py attribute">
@ -527,7 +527,7 @@ yellow/green - horizontal roots</p>
<dl class="py attribute">
<dt id="evennia.contrib.tutorial_world.objects.CmdShiftRoot.search_index_entry">
<code class="sig-name descname">search_index_entry</code><em class="property"> = {'aliases': 'shiftroot push pull move', 'category': 'tutorialworld', 'key': 'shift', 'tags': '', 'text': '\n Shifts roots around.\n\n Usage:\n shift blue root left/right\n shift red root left/right\n shift yellow root up/down\n shift green root up/down\n\n '}</em><a class="headerlink" href="#evennia.contrib.tutorial_world.objects.CmdShiftRoot.search_index_entry" title="Permalink to this definition"></a></dt>
<code class="sig-name descname">search_index_entry</code><em class="property"> = {'aliases': 'shiftroot push move pull', 'category': 'tutorialworld', 'key': 'shift', 'tags': '', 'text': '\n Shifts roots around.\n\n Usage:\n shift blue root left/right\n shift red root left/right\n shift yellow root up/down\n shift green root up/down\n\n '}</em><a class="headerlink" href="#evennia.contrib.tutorial_world.objects.CmdShiftRoot.search_index_entry" title="Permalink to this definition"></a></dt>
<dd></dd></dl>
</dd></dl>
@ -544,7 +544,7 @@ yellow/green - horizontal roots</p>
<dl class="py attribute">
<dt id="evennia.contrib.tutorial_world.objects.CmdPressButton.aliases">
<code class="sig-name descname">aliases</code><em class="property"> = ['push button', 'button', 'press button']</em><a class="headerlink" href="#evennia.contrib.tutorial_world.objects.CmdPressButton.aliases" title="Permalink to this definition"></a></dt>
<code class="sig-name descname">aliases</code><em class="property"> = ['button', 'press button', 'push button']</em><a class="headerlink" href="#evennia.contrib.tutorial_world.objects.CmdPressButton.aliases" title="Permalink to this definition"></a></dt>
<dd></dd></dl>
<dl class="py attribute">
@ -570,7 +570,7 @@ yellow/green - horizontal roots</p>
<dl class="py attribute">
<dt id="evennia.contrib.tutorial_world.objects.CmdPressButton.search_index_entry">
<code class="sig-name descname">search_index_entry</code><em class="property"> = {'aliases': 'push button button press button', 'category': 'tutorialworld', 'key': 'press', 'tags': '', 'text': '\n Presses a button.\n '}</em><a class="headerlink" href="#evennia.contrib.tutorial_world.objects.CmdPressButton.search_index_entry" title="Permalink to this definition"></a></dt>
<code class="sig-name descname">search_index_entry</code><em class="property"> = {'aliases': 'button press button push button', 'category': 'tutorialworld', 'key': 'press', 'tags': '', 'text': '\n Presses a button.\n '}</em><a class="headerlink" href="#evennia.contrib.tutorial_world.objects.CmdPressButton.search_index_entry" title="Permalink to this definition"></a></dt>
<dd></dd></dl>
</dd></dl>
@ -714,7 +714,7 @@ parry - forgoes your attack but will make you harder to hit on next</p>
<dl class="py attribute">
<dt id="evennia.contrib.tutorial_world.objects.CmdAttack.aliases">
<code class="sig-name descname">aliases</code><em class="property"> = ['thrust', 'defend', 'parry', 'pierce', 'slash', 'fight', 'kill', 'hit', 'stab', 'chop']</em><a class="headerlink" href="#evennia.contrib.tutorial_world.objects.CmdAttack.aliases" title="Permalink to this definition"></a></dt>
<code class="sig-name descname">aliases</code><em class="property"> = ['pierce', 'kill', 'hit', 'slash', 'fight', 'thrust', 'stab', 'parry', 'chop', 'defend']</em><a class="headerlink" href="#evennia.contrib.tutorial_world.objects.CmdAttack.aliases" title="Permalink to this definition"></a></dt>
<dd></dd></dl>
<dl class="py attribute">
@ -740,7 +740,7 @@ parry - forgoes your attack but will make you harder to hit on next</p>
<dl class="py attribute">
<dt id="evennia.contrib.tutorial_world.objects.CmdAttack.search_index_entry">
<code class="sig-name descname">search_index_entry</code><em class="property"> = {'aliases': 'thrust defend parry pierce slash fight kill hit stab chop', 'category': 'tutorialworld', 'key': 'attack', 'tags': '', 'text': '\n Attack the enemy. Commands:\n\n stab &lt;enemy&gt;\n slash &lt;enemy&gt;\n parry\n\n stab - (thrust) makes a lot of damage but is harder to hit with.\n slash - is easier to land, but does not make as much damage.\n parry - forgoes your attack but will make you harder to hit on next\n enemy attack.\n\n '}</em><a class="headerlink" href="#evennia.contrib.tutorial_world.objects.CmdAttack.search_index_entry" title="Permalink to this definition"></a></dt>
<code class="sig-name descname">search_index_entry</code><em class="property"> = {'aliases': 'pierce kill hit slash fight thrust stab parry chop defend', 'category': 'tutorialworld', 'key': 'attack', 'tags': '', 'text': '\n Attack the enemy. Commands:\n\n stab &lt;enemy&gt;\n slash &lt;enemy&gt;\n parry\n\n stab - (thrust) makes a lot of damage but is harder to hit with.\n slash - is easier to land, but does not make as much damage.\n parry - forgoes your attack but will make you harder to hit on next\n enemy attack.\n\n '}</em><a class="headerlink" href="#evennia.contrib.tutorial_world.objects.CmdAttack.search_index_entry" title="Permalink to this definition"></a></dt>
<dd></dd></dl>
</dd></dl>

View file

@ -183,7 +183,7 @@ code except for adding in the details.</p>
<dl class="py attribute">
<dt id="evennia.contrib.tutorial_world.rooms.CmdTutorialLook.aliases">
<code class="sig-name descname">aliases</code><em class="property"> = ['l', 'ls']</em><a class="headerlink" href="#evennia.contrib.tutorial_world.rooms.CmdTutorialLook.aliases" title="Permalink to this definition"></a></dt>
<code class="sig-name descname">aliases</code><em class="property"> = ['ls', 'l']</em><a class="headerlink" href="#evennia.contrib.tutorial_world.rooms.CmdTutorialLook.aliases" title="Permalink to this definition"></a></dt>
<dd></dd></dl>
<dl class="py attribute">
@ -198,7 +198,7 @@ code except for adding in the details.</p>
<dl class="py attribute">
<dt id="evennia.contrib.tutorial_world.rooms.CmdTutorialLook.search_index_entry">
<code class="sig-name descname">search_index_entry</code><em class="property"> = {'aliases': 'l ls', 'category': 'tutorialworld', 'key': 'look', 'tags': '', 'text': '\n looks at the room and on details\n\n Usage:\n look &lt;obj&gt;\n look &lt;room detail&gt;\n look *&lt;account&gt;\n\n Observes your location, details at your location or objects\n in your vicinity.\n\n Tutorial: This is a child of the default Look command, that also\n allows us to look at &quot;details&quot; in the room. These details are\n things to examine and offers some extra description without\n actually having to be actual database objects. It uses the\n return_detail() hook on TutorialRooms for this.\n '}</em><a class="headerlink" href="#evennia.contrib.tutorial_world.rooms.CmdTutorialLook.search_index_entry" title="Permalink to this definition"></a></dt>
<code class="sig-name descname">search_index_entry</code><em class="property"> = {'aliases': 'ls l', 'category': 'tutorialworld', 'key': 'look', 'tags': '', 'text': '\n looks at the room and on details\n\n Usage:\n look &lt;obj&gt;\n look &lt;room detail&gt;\n look *&lt;account&gt;\n\n Observes your location, details at your location or objects\n in your vicinity.\n\n Tutorial: This is a child of the default Look command, that also\n allows us to look at &quot;details&quot; in the room. These details are\n things to examine and offers some extra description without\n actually having to be actual database objects. It uses the\n return_detail() hook on TutorialRooms for this.\n '}</em><a class="headerlink" href="#evennia.contrib.tutorial_world.rooms.CmdTutorialLook.search_index_entry" title="Permalink to this definition"></a></dt>
<dd></dd></dl>
</dd></dl>
@ -602,7 +602,7 @@ if they fall off the bridge.</p>
<dl class="py attribute">
<dt id="evennia.contrib.tutorial_world.rooms.CmdBridgeHelp.aliases">
<code class="sig-name descname">aliases</code><em class="property"> = ['?', 'h']</em><a class="headerlink" href="#evennia.contrib.tutorial_world.rooms.CmdBridgeHelp.aliases" title="Permalink to this definition"></a></dt>
<code class="sig-name descname">aliases</code><em class="property"> = ['h', '?']</em><a class="headerlink" href="#evennia.contrib.tutorial_world.rooms.CmdBridgeHelp.aliases" title="Permalink to this definition"></a></dt>
<dd></dd></dl>
<dl class="py attribute">
@ -628,7 +628,7 @@ if they fall off the bridge.</p>
<dl class="py attribute">
<dt id="evennia.contrib.tutorial_world.rooms.CmdBridgeHelp.search_index_entry">
<code class="sig-name descname">search_index_entry</code><em class="property"> = {'aliases': '? h', 'category': 'tutorial world', 'key': 'help', 'tags': '', 'text': '\n Overwritten help command while on the bridge.\n '}</em><a class="headerlink" href="#evennia.contrib.tutorial_world.rooms.CmdBridgeHelp.search_index_entry" title="Permalink to this definition"></a></dt>
<code class="sig-name descname">search_index_entry</code><em class="property"> = {'aliases': 'h ?', 'category': 'tutorial world', 'key': 'help', 'tags': '', 'text': '\n Overwritten help command while on the bridge.\n '}</em><a class="headerlink" href="#evennia.contrib.tutorial_world.rooms.CmdBridgeHelp.search_index_entry" title="Permalink to this definition"></a></dt>
<dd></dd></dl>
</dd></dl>
@ -754,7 +754,7 @@ to find something.</p>
<dl class="py attribute">
<dt id="evennia.contrib.tutorial_world.rooms.CmdLookDark.aliases">
<code class="sig-name descname">aliases</code><em class="property"> = ['fiddle', 'search', 'l', 'feel around', 'feel']</em><a class="headerlink" href="#evennia.contrib.tutorial_world.rooms.CmdLookDark.aliases" title="Permalink to this definition"></a></dt>
<code class="sig-name descname">aliases</code><em class="property"> = ['feel', 'search', 'feel around', 'l', 'fiddle']</em><a class="headerlink" href="#evennia.contrib.tutorial_world.rooms.CmdLookDark.aliases" title="Permalink to this definition"></a></dt>
<dd></dd></dl>
<dl class="py attribute">
@ -782,7 +782,7 @@ random chance of eventually finding a light source.</p>
<dl class="py attribute">
<dt id="evennia.contrib.tutorial_world.rooms.CmdLookDark.search_index_entry">
<code class="sig-name descname">search_index_entry</code><em class="property"> = {'aliases': 'fiddle search l feel around feel', 'category': 'tutorialworld', 'key': 'look', 'tags': '', 'text': '\n Look around in darkness\n\n Usage:\n look\n\n Look around in the darkness, trying\n to find something.\n '}</em><a class="headerlink" href="#evennia.contrib.tutorial_world.rooms.CmdLookDark.search_index_entry" title="Permalink to this definition"></a></dt>
<code class="sig-name descname">search_index_entry</code><em class="property"> = {'aliases': 'feel search feel around l fiddle', 'category': 'tutorialworld', 'key': 'look', 'tags': '', 'text': '\n Look around in darkness\n\n Usage:\n look\n\n Look around in the darkness, trying\n to find something.\n '}</em><a class="headerlink" href="#evennia.contrib.tutorial_world.rooms.CmdLookDark.search_index_entry" title="Permalink to this definition"></a></dt>
<dd></dd></dl>
</dd></dl>

View file

@ -335,8 +335,7 @@ the keyword attribute_name specifies otherwise.
</li>
</ul>
</p></li>
<li><p><strong>global_search</strong> (<em>bool</em>) Search all objects globally. This is overruled
by <strong>location</strong> keyword.</p></li>
<li><p><strong>global_search</strong> (<em>bool</em>) Search all objects globally. This overrules location data.</p></li>
<li><p><strong>use_nicks</strong> (<em>bool</em>) Use nickname-replace (nicktype “object”) on <strong>searchdata</strong>.</p></li>
<li><p><strong>typeclass</strong> (<em>str</em><em> or </em><em>Typeclass</em><em>, or </em><em>list of either</em>) Limit search only
to <strong>Objects</strong> with this typeclass. May be a list of typeclasses
@ -1477,7 +1476,7 @@ a character avatar controlled by an account.</p>
<dl class="py method">
<dt id="evennia.objects.objects.DefaultCharacter.create">
<em class="property">classmethod </em><code class="sig-name descname">create</code><span class="sig-paren">(</span><em class="sig-param"><span class="n">key</span></em>, <em class="sig-param"><span class="n">account</span></em>, <em class="sig-param"><span class="o">**</span><span class="n">kwargs</span></em><span class="sig-paren">)</span><a class="reference internal" href="../_modules/evennia/objects/objects.html#DefaultCharacter.create"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#evennia.objects.objects.DefaultCharacter.create" title="Permalink to this definition"></a></dt>
<em class="property">classmethod </em><code class="sig-name descname">create</code><span class="sig-paren">(</span><em class="sig-param"><span class="n">key</span></em>, <em class="sig-param"><span class="n">account</span><span class="o">=</span><span class="default_value">None</span></em>, <em class="sig-param"><span class="o">**</span><span class="n">kwargs</span></em><span class="sig-paren">)</span><a class="reference internal" href="../_modules/evennia/objects/objects.html#DefaultCharacter.create"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#evennia.objects.objects.DefaultCharacter.create" title="Permalink to this definition"></a></dt>
<dd><p>Creates a basic Character with default parameters, unless otherwise
specified or extended.</p>
<p>Provides a friendlier interface to the utils.create_character() function.</p>
@ -1485,8 +1484,8 @@ specified or extended.</p>
<dt class="field-odd">Parameters</dt>
<dd class="field-odd"><ul class="simple">
<li><p><strong>key</strong> (<em>str</em>) Name of the new Character.</p></li>
<li><p><strong>account</strong> (<em>obj</em>) Account to associate this Character with. Required as
an argument, but one can fake it out by supplying None it will
<li><p><strong>account</strong> (<em>obj</em><em>, </em><em>optional</em>) Account to associate this Character with.
If unset supplying None it will
change the default lockset and skip creator attribution.</p></li>
</ul>
</dd>
@ -1651,7 +1650,7 @@ location is always <strong>None</strong>.</p>
<dl class="py method">
<dt id="evennia.objects.objects.DefaultRoom.create">
<em class="property">classmethod </em><code class="sig-name descname">create</code><span class="sig-paren">(</span><em class="sig-param"><span class="n">key</span></em>, <em class="sig-param"><span class="n">account</span></em>, <em class="sig-param"><span class="o">**</span><span class="n">kwargs</span></em><span class="sig-paren">)</span><a class="reference internal" href="../_modules/evennia/objects/objects.html#DefaultRoom.create"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#evennia.objects.objects.DefaultRoom.create" title="Permalink to this definition"></a></dt>
<em class="property">classmethod </em><code class="sig-name descname">create</code><span class="sig-paren">(</span><em class="sig-param"><span class="n">key</span></em>, <em class="sig-param"><span class="n">account</span><span class="o">=</span><span class="default_value">None</span></em>, <em class="sig-param"><span class="o">**</span><span class="n">kwargs</span></em><span class="sig-paren">)</span><a class="reference internal" href="../_modules/evennia/objects/objects.html#DefaultRoom.create"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#evennia.objects.objects.DefaultRoom.create" title="Permalink to this definition"></a></dt>
<dd><p>Creates a basic Room with default parameters, unless otherwise
specified or extended.</p>
<p>Provides a friendlier interface to the utils.create_object() function.</p>
@ -1659,7 +1658,9 @@ specified or extended.</p>
<dt class="field-odd">Parameters</dt>
<dd class="field-odd"><ul class="simple">
<li><p><strong>key</strong> (<em>str</em>) Name of the new Room.</p></li>
<li><p><strong>account</strong> (<em>obj</em>) Account to associate this Room with.</p></li>
<li><p><strong>account</strong> (<em>obj</em><em>, </em><em>optional</em>) Account to associate this Room with. If
given, it will be given specific control/edit permissions to this
object (along with normal Admin perms). If not given, default</p></li>
</ul>
</dd>
<dt class="field-even">Keyword Arguments</dt>
@ -1811,7 +1812,7 @@ exits name, triggering the movement between rooms.</p>
<dl class="py method">
<dt id="evennia.objects.objects.DefaultExit.create">
<em class="property">classmethod </em><code class="sig-name descname">create</code><span class="sig-paren">(</span><em class="sig-param"><span class="n">key</span></em>, <em class="sig-param"><span class="n">account</span></em>, <em class="sig-param"><span class="n">source</span></em>, <em class="sig-param"><span class="n">dest</span></em>, <em class="sig-param"><span class="o">**</span><span class="n">kwargs</span></em><span class="sig-paren">)</span><a class="reference internal" href="../_modules/evennia/objects/objects.html#DefaultExit.create"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#evennia.objects.objects.DefaultExit.create" title="Permalink to this definition"></a></dt>
<em class="property">classmethod </em><code class="sig-name descname">create</code><span class="sig-paren">(</span><em class="sig-param"><span class="n">key</span></em>, <em class="sig-param"><span class="n">source</span></em>, <em class="sig-param"><span class="n">dest</span></em>, <em class="sig-param"><span class="n">account</span><span class="o">=</span><span class="default_value">None</span></em>, <em class="sig-param"><span class="o">**</span><span class="n">kwargs</span></em><span class="sig-paren">)</span><a class="reference internal" href="../_modules/evennia/objects/objects.html#DefaultExit.create"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#evennia.objects.objects.DefaultExit.create" title="Permalink to this definition"></a></dt>
<dd><p>Creates a basic Exit with default parameters, unless otherwise
specified or extended.</p>
<p>Provides a friendlier interface to the utils.create_object() function.</p>

View file

@ -1041,14 +1041,17 @@ will be exited.</p></li>
repeat-calling add when having many Attributes to add.</p>
<dl class="field-list simple">
<dt class="field-odd">Parameters</dt>
<dd class="field-odd"><p><strong>*args</strong> (<em>tuple</em>) <p>Tuples of varying length representing the
Attribute to add to this object. Supported tuples are</p>
<ul class="simple">
<li><p>(key, value)</p></li>
<li><p>(key, value, category)</p></li>
<li><p>(key, value, category, lockstring)</p></li>
<li><p>(key, value, category, lockstring, default_access)</p></li>
<dd class="field-odd"><p><strong>*args</strong> (<em>tuple</em>) <p>Each argument should be a tuples (can be of varying
length) representing the Attribute to add to this object.
Supported tuples are</p>
<blockquote>
<div><ul class="simple">
<li><p><strong>(key, value)</strong></p></li>
<li><p><strong>(key, value, category)</strong></p></li>
<li><p><strong>(key, value, category, lockstring)</strong></p></li>
<li><p><strong>(key, value, category, lockstring, default_access)</strong></p></li>
</ul>
</div></blockquote>
</p>
</dd>
<dt class="field-even">Keyword Arguments</dt>

View file

@ -58,7 +58,7 @@ limited in what data it can hold, and the tag key+category is
indexed for efficient lookup in the database. Tags are shared
between objects - a new tag is only created if the key+category
combination did not previously exist, making them unsuitable for
storing object-related data (for this a full tag should be
storing object-related data (for this a regular Attribute should be
used).</p>
<p>The db_data field is intended as a documentation field for the
tag itself, such as to document what this tag+category stands for
@ -363,8 +363,8 @@ tuples <strong>[(key, category), …]</strong>.</p></li>
<dd><p>Batch-add tags from a list of tuples.</p>
<dl class="field-list simple">
<dt class="field-odd">Parameters</dt>
<dd class="field-odd"><p><strong>tuples</strong> (<em>tuple</em><em> or </em><em>str</em>) Any number of <strong>tagstr</strong> keys, <strong>(keystr, category)</strong> or
<strong>(keystr, category, data)</strong> tuples.</p>
<dd class="field-odd"><p><strong>*args</strong> (<em>tuple</em><em> or </em><em>str</em>) Each argument should be a <strong>tagstr</strong> keys or tuple <strong>(keystr, category)</strong> or
<strong>(keystr, category, data)</strong>. Its possible to mix input types.</p>
</dd>
</dl>
<p class="rubric">Notes</p>

View file

@ -132,7 +132,7 @@ scripts in the database.</p>
<dl class="py function">
<dt id="evennia.utils.create.create_help_entry">
<code class="sig-prename descclassname">evennia.utils.create.</code><code class="sig-name descname">create_help_entry</code><span class="sig-paren">(</span><em class="sig-param"><span class="n">key</span></em>, <em class="sig-param"><span class="n">entrytext</span></em>, <em class="sig-param"><span class="n">category</span><span class="o">=</span><span class="default_value">'General'</span></em>, <em class="sig-param"><span class="n">locks</span><span class="o">=</span><span class="default_value">None</span></em>, <em class="sig-param"><span class="n">aliases</span><span class="o">=</span><span class="default_value">None</span></em><span class="sig-paren">)</span><a class="reference internal" href="../_modules/evennia/utils/create.html#create_help_entry"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#evennia.utils.create.create_help_entry" title="Permalink to this definition"></a></dt>
<code class="sig-prename descclassname">evennia.utils.create.</code><code class="sig-name descname">create_help_entry</code><span class="sig-paren">(</span><em class="sig-param"><span class="n">key</span></em>, <em class="sig-param"><span class="n">entrytext</span></em>, <em class="sig-param"><span class="n">category</span><span class="o">=</span><span class="default_value">'General'</span></em>, <em class="sig-param"><span class="n">locks</span><span class="o">=</span><span class="default_value">None</span></em>, <em class="sig-param"><span class="n">aliases</span><span class="o">=</span><span class="default_value">None</span></em>, <em class="sig-param"><span class="n">tags</span><span class="o">=</span><span class="default_value">None</span></em><span class="sig-paren">)</span><a class="reference internal" href="../_modules/evennia/utils/create.html#create_help_entry"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#evennia.utils.create.create_help_entry" title="Permalink to this definition"></a></dt>
<dd><p>Create a static help entry in the help database. Note that Command
help entries are dynamic and directly taken from the __doc__
entries of the command. The database-stored help entries are
@ -145,7 +145,8 @@ in-game setting information and so on.</p>
<li><p><strong>entrytext</strong> (<em>str</em>) The body of te help entry</p></li>
<li><p><strong>category</strong> (<em>str</em><em>, </em><em>optional</em>) The help category of the entry.</p></li>
<li><p><strong>locks</strong> (<em>str</em><em>, </em><em>optional</em>) A lockstring to restrict access.</p></li>
<li><p><strong>aliases</strong> (<em>list of str</em>) List of alternative (likely shorter) keynames.</p></li>
<li><p><strong>aliases</strong> (<em>list of str</em><em>, </em><em>optional</em>) List of alternative (likely shorter) keynames.</p></li>
<li><p><strong>tags</strong> (<em>lst</em><em>, </em><em>optional</em>) List of tags or tuples <strong>(tag, category)</strong>.</p></li>
</ul>
</dd>
<dt class="field-even">Returns</dt>
@ -156,7 +157,7 @@ in-game setting information and so on.</p>
<dl class="py function">
<dt id="evennia.utils.create.create_message">
<code class="sig-prename descclassname">evennia.utils.create.</code><code class="sig-name descname">create_message</code><span class="sig-paren">(</span><em class="sig-param"><span class="n">senderobj</span></em>, <em class="sig-param"><span class="n">message</span></em>, <em class="sig-param"><span class="n">channels</span><span class="o">=</span><span class="default_value">None</span></em>, <em class="sig-param"><span class="n">receivers</span><span class="o">=</span><span class="default_value">None</span></em>, <em class="sig-param"><span class="n">locks</span><span class="o">=</span><span class="default_value">None</span></em>, <em class="sig-param"><span class="n">header</span><span class="o">=</span><span class="default_value">None</span></em><span class="sig-paren">)</span><a class="reference internal" href="../_modules/evennia/utils/create.html#create_message"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#evennia.utils.create.create_message" title="Permalink to this definition"></a></dt>
<code class="sig-prename descclassname">evennia.utils.create.</code><code class="sig-name descname">create_message</code><span class="sig-paren">(</span><em class="sig-param"><span class="n">senderobj</span></em>, <em class="sig-param"><span class="n">message</span></em>, <em class="sig-param"><span class="n">channels</span><span class="o">=</span><span class="default_value">None</span></em>, <em class="sig-param"><span class="n">receivers</span><span class="o">=</span><span class="default_value">None</span></em>, <em class="sig-param"><span class="n">locks</span><span class="o">=</span><span class="default_value">None</span></em>, <em class="sig-param"><span class="n">tags</span><span class="o">=</span><span class="default_value">None</span></em>, <em class="sig-param"><span class="n">header</span><span class="o">=</span><span class="default_value">None</span></em><span class="sig-paren">)</span><a class="reference internal" href="../_modules/evennia/utils/create.html#create_message"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#evennia.utils.create.create_message" title="Permalink to this definition"></a></dt>
<dd><p>Create a new communication Msg. Msgs represent a unit of
database-persistent communication between entites.</p>
<dl class="field-list simple">
@ -172,6 +173,7 @@ unique key strings.</p></li>
<li><p><strong>receivers</strong> (<em>Object</em><em>, </em><em>Account</em><em>, </em><em>str</em><em> or </em><em>list</em>) An Account/Object to send
to, or a list of them. May be Account objects or accountnames.</p></li>
<li><p><strong>locks</strong> (<em>str</em>) Lock definition string.</p></li>
<li><p><strong>tags</strong> (<em>list</em>) A list of tags or tuples <strong>(tag, category)</strong>.</p></li>
<li><p><strong>header</strong> (<em>str</em>) Mime-type or other optional information for the message</p></li>
</ul>
</dd>
@ -185,7 +187,7 @@ limit this as desired.</p>
<dl class="py function">
<dt id="evennia.utils.create.create_channel">
<code class="sig-prename descclassname">evennia.utils.create.</code><code class="sig-name descname">create_channel</code><span class="sig-paren">(</span><em class="sig-param"><span class="n">key</span></em>, <em class="sig-param"><span class="n">aliases</span><span class="o">=</span><span class="default_value">None</span></em>, <em class="sig-param"><span class="n">desc</span><span class="o">=</span><span class="default_value">None</span></em>, <em class="sig-param"><span class="n">locks</span><span class="o">=</span><span class="default_value">None</span></em>, <em class="sig-param"><span class="n">keep_log</span><span class="o">=</span><span class="default_value">True</span></em>, <em class="sig-param"><span class="n">typeclass</span><span class="o">=</span><span class="default_value">None</span></em><span class="sig-paren">)</span><a class="reference internal" href="../_modules/evennia/utils/create.html#create_channel"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#evennia.utils.create.create_channel" title="Permalink to this definition"></a></dt>
<code class="sig-prename descclassname">evennia.utils.create.</code><code class="sig-name descname">create_channel</code><span class="sig-paren">(</span><em class="sig-param"><span class="n">key</span></em>, <em class="sig-param"><span class="n">aliases</span><span class="o">=</span><span class="default_value">None</span></em>, <em class="sig-param"><span class="n">desc</span><span class="o">=</span><span class="default_value">None</span></em>, <em class="sig-param"><span class="n">locks</span><span class="o">=</span><span class="default_value">None</span></em>, <em class="sig-param"><span class="n">keep_log</span><span class="o">=</span><span class="default_value">True</span></em>, <em class="sig-param"><span class="n">typeclass</span><span class="o">=</span><span class="default_value">None</span></em>, <em class="sig-param"><span class="n">tags</span><span class="o">=</span><span class="default_value">None</span></em><span class="sig-paren">)</span><a class="reference internal" href="../_modules/evennia/utils/create.html#create_channel"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#evennia.utils.create.create_channel" title="Permalink to this definition"></a></dt>
<dd><p>Create A communication Channel. A Channel serves as a central hub
for distributing Msgs to groups of people without specifying the
receivers explicitly. Instead accounts may connect to the channel
@ -204,6 +206,7 @@ keep_log switch.</p>
<li><p><strong>keep_log</strong> (<em>bool</em>) Log channel throughput.</p></li>
<li><p><strong>typeclass</strong> (<em>str</em><em> or </em><em>class</em>) The typeclass of the Channel (not
often used).</p></li>
<li><p><strong>tags</strong> (<a class="reference internal" href="evennia.contrib.barter.html#evennia.contrib.barter.TradeHandler.list" title="evennia.contrib.barter.TradeHandler.list"><em>list</em></a>) A list of tags or tuples <strong>(tag, category)</strong>.</p></li>
</ul>
</dd>
<dt class="field-odd">Returns</dt>

View file

@ -273,7 +273,7 @@ indentation.</p>
<dl class="py attribute">
<dt id="evennia.utils.eveditor.CmdEditorGroup.aliases">
<code class="sig-name descname">aliases</code><em class="property"> = [':q', ':UU', ':x', ':', ':j', ':A', ':u', ':y', ':s', ':&gt;', ':DD', ':!', ':&lt;', ':wq', ':dw', ':r', ':fd', ':f', ':h', ':p', ':I', '::', ':uu', ':q!', ':fi', ':S', ':i', ':::', ':=', ':w', ':dd', ':echo']</em><a class="headerlink" href="#evennia.utils.eveditor.CmdEditorGroup.aliases" title="Permalink to this definition"></a></dt>
<code class="sig-name descname">aliases</code><em class="property"> = [':', ':::', ':&gt;', ':echo', ':&lt;', ':r', ':s', ':fi', ':UU', ':x', ':y', ':uu', ':dd', ':p', ':!', ':u', ':I', ':h', ':S', ':w', ':q', ':wq', ':j', ':A', ':fd', ':f', ':DD', ':dw', '::', ':i', ':q!', ':=']</em><a class="headerlink" href="#evennia.utils.eveditor.CmdEditorGroup.aliases" title="Permalink to this definition"></a></dt>
<dd></dd></dl>
<dl class="py attribute">
@ -301,7 +301,7 @@ efficient presentation.</p>
<dl class="py attribute">
<dt id="evennia.utils.eveditor.CmdEditorGroup.search_index_entry">
<code class="sig-name descname">search_index_entry</code><em class="property"> = {'aliases': ':q :UU :x : :j :A :u :y :s :&gt; :DD :! :&lt; :wq :dw :r :fd :f :h :p :I :: :uu :q! :fi :S :i ::: := :w :dd :echo', 'category': 'general', 'key': ':editor_command_group', 'tags': '', 'text': '\n Commands for the editor\n '}</em><a class="headerlink" href="#evennia.utils.eveditor.CmdEditorGroup.search_index_entry" title="Permalink to this definition"></a></dt>
<code class="sig-name descname">search_index_entry</code><em class="property"> = {'aliases': ': ::: :&gt; :echo :&lt; :r :s :fi :UU :x :y :uu :dd :p :! :u :I :h :S :w :q :wq :j :A :fd :f :DD :dw :: :i :q! :=', 'category': 'general', 'key': ':editor_command_group', 'tags': '', 'text': '\n Commands for the editor\n '}</em><a class="headerlink" href="#evennia.utils.eveditor.CmdEditorGroup.search_index_entry" title="Permalink to this definition"></a></dt>
<dd></dd></dl>
</dd></dl>

View file

@ -74,7 +74,7 @@ the <strong>caller.msg()</strong> construct every time the page is updated.</p>
<dl class="py attribute">
<dt id="evennia.utils.evmore.CmdMore.aliases">
<code class="sig-name descname">aliases</code><em class="property"> = ['t', 'quit', 'e', 'top', 'next', 'back', 'a', 'b', 'end', 'abort', 'n', 'q']</em><a class="headerlink" href="#evennia.utils.evmore.CmdMore.aliases" title="Permalink to this definition"></a></dt>
<code class="sig-name descname">aliases</code><em class="property"> = ['abort', 'top', 'n', 'q', 't', 'a', 'back', 'e', 'next', 'b', 'quit', 'end']</em><a class="headerlink" href="#evennia.utils.evmore.CmdMore.aliases" title="Permalink to this definition"></a></dt>
<dd></dd></dl>
<dl class="py attribute">
@ -100,7 +100,7 @@ the <strong>caller.msg()</strong> construct every time the page is updated.</p>
<dl class="py attribute">
<dt id="evennia.utils.evmore.CmdMore.search_index_entry">
<code class="sig-name descname">search_index_entry</code><em class="property"> = {'aliases': 't quit e top next back a b end abort n q', 'category': 'general', 'key': '__noinput_command', 'tags': '', 'text': '\n Manipulate the text paging\n '}</em><a class="headerlink" href="#evennia.utils.evmore.CmdMore.search_index_entry" title="Permalink to this definition"></a></dt>
<code class="sig-name descname">search_index_entry</code><em class="property"> = {'aliases': 'abort top n q t a back e next b quit end', 'category': 'general', 'key': '__noinput_command', 'tags': '', 'text': '\n Manipulate the text paging\n '}</em><a class="headerlink" href="#evennia.utils.evmore.CmdMore.search_index_entry" title="Permalink to this definition"></a></dt>
<dd></dd></dl>
</dd></dl>

View file

@ -89,6 +89,33 @@ error message.</p></li>
blocks, will lead to the entire string remaining unparsed. Inlineparsing should
never traceback.</p>
<hr class="docutils" />
<dl class="py function">
<dt id="evennia.utils.inlinefuncs.random">
<code class="sig-prename descclassname">evennia.utils.inlinefuncs.</code><code class="sig-name descname">random</code><span class="sig-paren">(</span><em class="sig-param"><span class="o">*</span><span class="n">args</span></em>, <em class="sig-param"><span class="o">**</span><span class="n">kwargs</span></em><span class="sig-paren">)</span><a class="reference internal" href="../_modules/evennia/utils/inlinefuncs.html#random"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#evennia.utils.inlinefuncs.random" title="Permalink to this definition"></a></dt>
<dd><p>Inlinefunc. Returns a random number between
0 and 1, from 0 to a maximum value, or within a given range (inclusive).</p>
<dl class="field-list simple">
<dt class="field-odd">Parameters</dt>
<dd class="field-odd"><ul class="simple">
<li><p><strong>minval</strong> (<em>str</em><em>, </em><em>optional</em>) Minimum value. If not given, assumed 0.</p></li>
<li><p><strong>maxval</strong> (<em>str</em><em>, </em><em>optional</em>) Maximum value.</p></li>
</ul>
</dd>
</dl>
<dl class="simple">
<dt>Keyword argumuents:</dt><dd><p>session (Session): Session getting the string.</p>
</dd>
</dl>
<p class="rubric">Notes</p>
<p>If either of the min/maxvalue has a . in it, a floating-point random
value will be returned. Otherwise it will be an integer value in the
given range.</p>
<p class="rubric">Example</p>
<p><strong>$random()</strong>
<strong>$random(5)</strong>
<strong>$random(5, 10)</strong></p>
</dd></dl>
<dl class="py function">
<dt id="evennia.utils.inlinefuncs.pad">
<code class="sig-prename descclassname">evennia.utils.inlinefuncs.</code><code class="sig-name descname">pad</code><span class="sig-paren">(</span><em class="sig-param"><span class="o">*</span><span class="n">args</span></em>, <em class="sig-param"><span class="o">**</span><span class="n">kwargs</span></em><span class="sig-paren">)</span><a class="reference internal" href="../_modules/evennia/utils/inlinefuncs.html#pad"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#evennia.utils.inlinefuncs.pad" title="Permalink to this definition"></a></dt>
@ -100,7 +127,8 @@ never traceback.</p>
<li><p><strong>width</strong> (<em>str</em><em>, </em><em>optional</em>) Will be converted to integer. Width
of padding.</p></li>
<li><p><strong>align</strong> (<em>str</em><em>, </em><em>optional</em>) Alignment of padding; one of c, l or r.</p></li>
<li><p><strong>fillchar</strong> (<em>str</em><em>, </em><em>optional</em>) Character used for padding. Defaults to a space.</p></li>
<li><p><strong>fillchar</strong> (<em>str</em><em>, </em><em>optional</em>) Character used for padding. Defaults to a
space.</p></li>
</ul>
</dd>
<dt class="field-even">Keyword Arguments</dt>
@ -242,6 +270,17 @@ it. It is passed to the inlinefunc.</p></li>
</dl>
</dd></dl>
<dl class="py function">
<dt id="evennia.utils.inlinefuncs.raw">
<code class="sig-prename descclassname">evennia.utils.inlinefuncs.</code><code class="sig-name descname">raw</code><span class="sig-paren">(</span><em class="sig-param"><span class="n">string</span></em><span class="sig-paren">)</span><a class="reference internal" href="../_modules/evennia/utils/inlinefuncs.html#raw"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#evennia.utils.inlinefuncs.raw" title="Permalink to this definition"></a></dt>
<dd><p>Escape all inlinefuncs in a string so they wont get parsed.</p>
<dl class="field-list simple">
<dt class="field-odd">Parameters</dt>
<dd class="field-odd"><p><strong>string</strong> (<em>str</em>) String with inlinefuncs to escape.</p>
</dd>
</dl>
</dd></dl>
<dl class="py exception">
<dt id="evennia.utils.inlinefuncs.NickTemplateInvalid">
<em class="property">exception </em><code class="sig-prename descclassname">evennia.utils.inlinefuncs.</code><code class="sig-name descname">NickTemplateInvalid</code><a class="reference internal" href="../_modules/evennia/utils/inlinefuncs.html#NickTemplateInvalid"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#evennia.utils.inlinefuncs.NickTemplateInvalid" title="Permalink to this definition"></a></dt>

View file

@ -230,15 +230,50 @@ Defaults to clients default width.</p></li>
</dd></dl>
<dl class="py function">
<dt id="evennia.utils.utils.list_to_string">
<code class="sig-prename descclassname">evennia.utils.utils.</code><code class="sig-name descname">list_to_string</code><span class="sig-paren">(</span><em class="sig-param"><span class="n">inlist</span></em>, <em class="sig-param"><span class="n">endsep</span><span class="o">=</span><span class="default_value">'and'</span></em>, <em class="sig-param"><span class="n">addquote</span><span class="o">=</span><span class="default_value">False</span></em><span class="sig-paren">)</span><a class="reference internal" href="../_modules/evennia/utils/utils.html#list_to_string"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#evennia.utils.utils.list_to_string" title="Permalink to this definition"></a></dt>
<dd><p>This pretty-formats a list as string output, adding an optional
<dt id="evennia.utils.utils.iter_to_string">
<code class="sig-prename descclassname">evennia.utils.utils.</code><code class="sig-name descname">iter_to_string</code><span class="sig-paren">(</span><em class="sig-param"><span class="n">initer</span></em>, <em class="sig-param"><span class="n">endsep</span><span class="o">=</span><span class="default_value">'and'</span></em>, <em class="sig-param"><span class="n">addquote</span><span class="o">=</span><span class="default_value">False</span></em><span class="sig-paren">)</span><a class="reference internal" href="../_modules/evennia/utils/utils.html#iter_to_string"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#evennia.utils.utils.iter_to_string" title="Permalink to this definition"></a></dt>
<dd><p>This pretty-formats an iterable list as string output, adding an optional
alternative separator to the second to last entry. If <strong>addquote</strong>
is <strong>True</strong>, the outgoing strings will be surrounded by quotes.</p>
<dl class="field-list simple">
<dt class="field-odd">Parameters</dt>
<dd class="field-odd"><ul class="simple">
<li><p><strong>inlist</strong> (<em>list</em>) The list to print.</p></li>
<li><p><strong>initer</strong> (<em>any</em>) Usually an iterable to print. Each element must be possible to
present with a string. Note that if this is a generator, it will be
consumed by this operation.</p></li>
<li><p><strong>endsep</strong> (<em>str</em><em>, </em><em>optional</em>) If set, the last item separator will
be replaced with this value.</p></li>
<li><p><strong>addquote</strong> (<em>bool</em><em>, </em><em>optional</em>) This will surround all outgoing
values with double quotes.</p></li>
</ul>
</dd>
<dt class="field-even">Returns</dt>
<dd class="field-even"><p><em>str</em> The list represented as a string.</p>
</dd>
</dl>
<p class="rubric">Examples</p>
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="gp">&gt;&gt;&gt; </span><span class="n">list_to_string</span><span class="p">([</span><span class="mi">1</span><span class="p">,</span><span class="mi">2</span><span class="p">,</span><span class="mi">3</span><span class="p">],</span> <span class="n">endsep</span><span class="o">=</span><span class="s1">&#39;&#39;</span><span class="p">)</span>
<span class="go">&#39;1, 2, 3&#39;</span>
<span class="gp">&gt;&gt;&gt; </span><span class="n">list_to_string</span><span class="p">([</span><span class="mi">1</span><span class="p">,</span><span class="mi">2</span><span class="p">,</span><span class="mi">3</span><span class="p">],</span> <span class="n">ensdep</span><span class="o">=</span><span class="s1">&#39;and&#39;</span><span class="p">)</span>
<span class="go">&#39;1, 2 and 3&#39;</span>
<span class="gp">&gt;&gt;&gt; </span><span class="n">list_to_string</span><span class="p">([</span><span class="mi">1</span><span class="p">,</span><span class="mi">2</span><span class="p">,</span><span class="mi">3</span><span class="p">],</span> <span class="n">endsep</span><span class="o">=</span><span class="s1">&#39;and&#39;</span><span class="p">,</span> <span class="n">addquote</span><span class="o">=</span><span class="kc">True</span><span class="p">)</span>
<span class="go">&#39;&quot;1&quot;, &quot;2&quot; and &quot;3&quot;&#39;</span>
</pre></div>
</div>
</dd></dl>
<dl class="py function">
<dt id="evennia.utils.utils.list_to_string">
<code class="sig-prename descclassname">evennia.utils.utils.</code><code class="sig-name descname">list_to_string</code><span class="sig-paren">(</span><em class="sig-param"><span class="n">initer</span></em>, <em class="sig-param"><span class="n">endsep</span><span class="o">=</span><span class="default_value">'and'</span></em>, <em class="sig-param"><span class="n">addquote</span><span class="o">=</span><span class="default_value">False</span></em><span class="sig-paren">)</span><a class="headerlink" href="#evennia.utils.utils.list_to_string" title="Permalink to this definition"></a></dt>
<dd><p>This pretty-formats an iterable list as string output, adding an optional
alternative separator to the second to last entry. If <strong>addquote</strong>
is <strong>True</strong>, the outgoing strings will be surrounded by quotes.</p>
<dl class="field-list simple">
<dt class="field-odd">Parameters</dt>
<dd class="field-odd"><ul class="simple">
<li><p><strong>initer</strong> (<em>any</em>) Usually an iterable to print. Each element must be possible to
present with a string. Note that if this is a generator, it will be
consumed by this operation.</p></li>
<li><p><strong>endsep</strong> (<em>str</em><em>, </em><em>optional</em>) If set, the last item separator will
be replaced with this value.</p></li>
<li><p><strong>addquote</strong> (<em>bool</em><em>, </em><em>optional</em>) This will surround all outgoing
@ -543,18 +578,14 @@ falling back to settings.ENCODINGS.</p></li>
<dl class="py function">
<dt id="evennia.utils.utils.validate_email_address">
<code class="sig-prename descclassname">evennia.utils.utils.</code><code class="sig-name descname">validate_email_address</code><span class="sig-paren">(</span><em class="sig-param"><span class="n">emailaddress</span></em><span class="sig-paren">)</span><a class="reference internal" href="../_modules/evennia/utils/utils.html#validate_email_address"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#evennia.utils.utils.validate_email_address" title="Permalink to this definition"></a></dt>
<dd><p>Checks if an email address is syntactically correct.</p>
<dd><p>Checks if an email address is syntactically correct. Makes use
of the django email-validator for consistency.</p>
<dl class="field-list simple">
<dt class="field-odd">Parameters</dt>
<dd class="field-odd"><p><strong>emailaddress</strong> (<em>str</em>) Email address to validate.</p>
</dd>
<dt class="field-even">Returns</dt>
<dd class="field-even"><p><em>is_valid (bool)</em> If this is a valid email or not.</p>
</dd>
</dl>
<dl class="simple">
<dt>Notes.</dt><dd><p>(This snippet was adapted from
<a class="reference external" href="http://commandline.org.uk/python/email-syntax-check">http://commandline.org.uk/python/email-syntax-check</a>.)</p>
<dd class="field-even"><p><em>bool</em> If this is a valid email or not.</p>
</dd>
</dl>
</dd></dl>
@ -1254,7 +1285,7 @@ print the caller of the caller etc.</p>
back to normal len for other objects.</p>
<dl class="field-list simple">
<dt class="field-odd">Parameters</dt>
<dd class="field-odd"><p><strong>target</strong> (<em>string</em>) A string with potential MXP components
<dd class="field-odd"><p><strong>target</strong> (<em>str</em>) A string with potential MXP components
to search.</p>
</dd>
<dt class="field-even">Returns</dt>
@ -1263,6 +1294,23 @@ to search.</p>
</dl>
</dd></dl>
<dl class="py function">
<dt id="evennia.utils.utils.display_len">
<code class="sig-prename descclassname">evennia.utils.utils.</code><code class="sig-name descname">display_len</code><span class="sig-paren">(</span><em class="sig-param"><span class="n">target</span></em><span class="sig-paren">)</span><a class="reference internal" href="../_modules/evennia/utils/utils.html#display_len"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#evennia.utils.utils.display_len" title="Permalink to this definition"></a></dt>
<dd><p>Calculate the visible width of text. This is not necessarily the same as the
number of characters in the case of certain asian characters. This will also
strip MXP patterns.</p>
<dl class="field-list simple">
<dt class="field-odd">Parameters</dt>
<dd class="field-odd"><p><strong>target</strong> (<em>any</em>) Something to measure the length of. If a string, it will be
measured keeping asian-character and MXP links in mind.</p>
</dd>
<dt class="field-even">Returns</dt>
<dd class="field-even"><p><em>int</em> The visible width of the target.</p>
</dd>
</dl>
</dd></dl>
<dl class="py function">
<dt id="evennia.utils.utils.at_search_result">
<code class="sig-prename descclassname">evennia.utils.utils.</code><code class="sig-name descname">at_search_result</code><span class="sig-paren">(</span><em class="sig-param"><span class="n">matches</span></em>, <em class="sig-param"><span class="n">caller</span></em>, <em class="sig-param"><span class="n">query</span><span class="o">=</span><span class="default_value">''</span></em>, <em class="sig-param"><span class="n">quiet</span><span class="o">=</span><span class="default_value">False</span></em>, <em class="sig-param"><span class="o">**</span><span class="n">kwargs</span></em><span class="sig-paren">)</span><a class="reference internal" href="../_modules/evennia/utils/utils.html#at_search_result"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#evennia.utils.utils.at_search_result" title="Permalink to this definition"></a></dt>

View file

@ -1169,6 +1169,8 @@
<li><a href="api/evennia.utils.ansi.html#evennia.utils.ansi.ANSIString">ANSIString (class in evennia.utils.ansi)</a>
</li>
<li><a href="api/evennia.utils.evtable.html#evennia.utils.evtable.ANSITextWrapper">ANSITextWrapper (class in evennia.utils.evtable)</a>
</li>
<li><a href="api/evennia.accounts.admin.html#evennia.accounts.admin.AccountForm.Meta.app_label">app_label (evennia.accounts.admin.AccountForm.Meta attribute)</a>
</li>
<li><a href="api/evennia.locks.lockhandler.html#evennia.locks.lockhandler.LockHandler.append">append() (evennia.locks.lockhandler.LockHandler method)</a>
@ -3297,6 +3299,8 @@
<li><a href="api/evennia.utils.create.html#evennia.utils.create.create_channel">create_channel() (in module evennia.utils.create)</a>
</li>
<li><a href="api/evennia.server.initial_setup.html#evennia.server.initial_setup.create_channels">create_channels() (in module evennia.server.initial_setup)</a>
</li>
<li><a href="api/evennia.accounts.accounts.html#evennia.accounts.accounts.DefaultAccount.create_character">create_character() (evennia.accounts.accounts.DefaultAccount method)</a>
</li>
<li><a href="api/evennia.scripts.taskhandler.html#evennia.scripts.taskhandler.TaskHandler.create_delays">create_delays() (evennia.scripts.taskhandler.TaskHandler method)</a>
</li>
@ -3700,10 +3704,10 @@
</li>
<li><a href="api/evennia.utils.ansi.html#evennia.utils.ansi.ANSIString.decode">decode() (evennia.utils.ansi.ANSIString method)</a>
</li>
</ul></td>
<td style="width: 33%; vertical-align: top;"><ul>
<li><a href="api/evennia.server.portal.telnet_oob.html#evennia.server.portal.telnet_oob.TelnetOOB.decode_gmcp">decode_gmcp() (evennia.server.portal.telnet_oob.TelnetOOB method)</a>
</li>
</ul></td>
<td style="width: 33%; vertical-align: top;"><ul>
<li><a href="api/evennia.server.portal.telnet_oob.html#evennia.server.portal.telnet_oob.TelnetOOB.decode_msdp">decode_msdp() (evennia.server.portal.telnet_oob.TelnetOOB method)</a>
</li>
<li><a href="api/evennia.utils.eveditor.html#evennia.utils.eveditor.EvEditor.decrease_indent">decrease_indent() (evennia.utils.eveditor.EvEditor method)</a>
@ -3859,6 +3863,8 @@
<li><a href="api/evennia.objects.models.html#evennia.objects.models.ObjectDB.destination">destination() (evennia.objects.models.ObjectDB property)</a>
</li>
<li><a href="api/evennia.objects.models.html#evennia.objects.models.ObjectDB.destinations_set">destinations_set (evennia.objects.models.ObjectDB attribute)</a>
</li>
<li><a href="api/evennia.commands.default.building.html#evennia.commands.default.building.CmdExamine.detail_color">detail_color (evennia.commands.default.building.CmdExamine attribute)</a>
</li>
<li><a href="api/evennia.contrib.dice.html#evennia.contrib.dice.DiceCmdSet">DiceCmdSet (class in evennia.contrib.dice)</a>
</li>
@ -3930,6 +3936,8 @@
<li><a href="api/evennia.utils.evmenu.html#evennia.utils.evmenu.EvMenu.display_helptext">(evennia.utils.evmenu.EvMenu method)</a>
</li>
</ul></li>
<li><a href="api/evennia.utils.utils.html#evennia.utils.utils.display_len">display_len() (in module evennia.utils.utils)</a>
</li>
<li><a href="api/evennia.contrib.health_bar.html#evennia.contrib.health_bar.display_meter">display_meter() (in module evennia.contrib.health_bar)</a>
</li>
<li><a href="api/evennia.utils.evmenu.html#evennia.utils.evmenu.EvMenu.display_nodetext">display_nodetext() (evennia.utils.evmenu.EvMenu method)</a>
@ -7015,6 +7023,8 @@
<li><a href="api/evennia.commands.default.muxcommand.html#evennia.commands.default.muxcommand.MuxCommand.has_perm">has_perm() (evennia.commands.default.muxcommand.MuxCommand method)</a>
</li>
<li><a href="api/evennia.comms.models.html#evennia.comms.models.Msg.header">header() (evennia.comms.models.Msg property)</a>
</li>
<li><a href="api/evennia.commands.default.building.html#evennia.commands.default.building.CmdExamine.header_color">header_color (evennia.commands.default.building.CmdExamine attribute)</a>
</li>
<li><a href="api/evennia.server.inputfuncs.html#evennia.server.inputfuncs.hello">hello() (in module evennia.server.inputfuncs)</a>
</li>
@ -7853,6 +7863,8 @@
<li><a href="api/evennia.contrib.turnbattle.tb_items.html#evennia.contrib.turnbattle.tb_items.itemfunc_heal">itemfunc_heal() (in module evennia.contrib.turnbattle.tb_items)</a>
</li>
<li><a href="api/evennia.contrib.turnbattle.tb_items.html#evennia.contrib.turnbattle.tb_items.ITEMFUNCS">ITEMFUNCS (in module evennia.contrib.turnbattle.tb_items)</a>
</li>
<li><a href="api/evennia.utils.utils.html#evennia.utils.utils.iter_to_string">iter_to_string() (in module evennia.utils.utils)</a>
</li>
</ul></td>
</tr></table>
@ -10408,7 +10420,11 @@
<li><a href="api/evennia.commands.default.building.html#evennia.commands.default.building.CmdSetAttribute.nested_re">nested_re (evennia.commands.default.building.CmdSetAttribute attribute)</a>
</li>
<li><a href="api/evennia.commands.default.building.html#evennia.commands.default.building.CmdCreate.new_obj_lockstring">new_obj_lockstring (evennia.commands.default.building.CmdCreate attribute)</a>
<ul>
<li><a href="api/evennia.commands.default.building.html#evennia.commands.default.building.CmdOpen.new_obj_lockstring">(evennia.commands.default.building.CmdOpen attribute)</a>
</li>
</ul></li>
<li><a href="api/evennia.commands.default.building.html#evennia.commands.default.building.CmdDig.new_room_lockstring">new_room_lockstring (evennia.commands.default.building.CmdDig attribute)</a>
</li>
<li><a href="api/evennia.contrib.turnbattle.tb_basic.html#evennia.contrib.turnbattle.tb_basic.TBBasicTurnHandler.next_turn">next_turn() (evennia.contrib.turnbattle.tb_basic.TBBasicTurnHandler method)</a>
@ -11413,6 +11429,8 @@
<h2 id="Q">Q</h2>
<table style="width: 100%" class="indextable genindextable"><tr>
<td style="width: 33%; vertical-align: top;"><ul>
<li><a href="api/evennia.commands.default.building.html#evennia.commands.default.building.CmdExamine.quell_color">quell_color (evennia.commands.default.building.CmdExamine attribute)</a>
</li>
<li><a href="api/evennia.typeclasses.attributes.html#evennia.typeclasses.attributes.IAttributeBackend.query_all">query_all() (evennia.typeclasses.attributes.IAttributeBackend method)</a>
<ul>
@ -11429,10 +11447,10 @@
<li><a href="api/evennia.typeclasses.attributes.html#evennia.typeclasses.attributes.ModelAttributeBackend.query_category">(evennia.typeclasses.attributes.ModelAttributeBackend method)</a>
</li>
</ul></li>
<li><a href="api/evennia.server.evennia_launcher.html#evennia.server.evennia_launcher.query_info">query_info() (in module evennia.server.evennia_launcher)</a>
</li>
</ul></td>
<td style="width: 33%; vertical-align: top;"><ul>
<li><a href="api/evennia.server.evennia_launcher.html#evennia.server.evennia_launcher.query_info">query_info() (in module evennia.server.evennia_launcher)</a>
</li>
<li><a href="api/evennia.typeclasses.attributes.html#evennia.typeclasses.attributes.IAttributeBackend.query_key">query_key() (evennia.typeclasses.attributes.IAttributeBackend method)</a>
<ul>
@ -11458,7 +11476,11 @@
<li><a href="api/evennia.prototypes.protfuncs.html#evennia.prototypes.protfuncs.randint">randint() (in module evennia.prototypes.protfuncs)</a>
</li>
<li><a href="api/evennia.prototypes.protfuncs.html#evennia.prototypes.protfuncs.random">random() (in module evennia.prototypes.protfuncs)</a>
<ul>
<li><a href="api/evennia.utils.inlinefuncs.html#evennia.utils.inlinefuncs.random">(in module evennia.utils.inlinefuncs)</a>
</li>
</ul></li>
<li><a href="api/evennia.utils.utils.html#evennia.utils.utils.random_string_from_module">random_string_from_module() (in module evennia.utils.utils)</a>
</li>
<li><a href="api/evennia.contrib.random_string_generator.html#evennia.contrib.random_string_generator.RandomStringGenerator">RandomStringGenerator (class in evennia.contrib.random_string_generator)</a>
@ -11473,6 +11495,8 @@
<ul>
<li><a href="api/evennia.utils.ansi.html#evennia.utils.ansi.raw">(in module evennia.utils.ansi)</a>
</li>
<li><a href="api/evennia.utils.inlinefuncs.html#evennia.utils.inlinefuncs.raw">(in module evennia.utils.inlinefuncs)</a>
</li>
</ul></li>
<li><a href="api/evennia.comms.admin.html#evennia.comms.admin.ChannelAdmin.raw_id_fields">raw_id_fields (evennia.comms.admin.ChannelAdmin attribute)</a>
@ -12708,6 +12732,8 @@
<li><a href="api/evennia.contrib.fieldfill.html#evennia.contrib.fieldfill.sendmessage">sendmessage() (in module evennia.contrib.fieldfill)</a>
</li>
<li><a href="api/evennia.contrib.building_menu.html#evennia.contrib.building_menu.BuildingMenu.sep_keys">sep_keys (evennia.contrib.building_menu.BuildingMenu attribute)</a>
</li>
<li><a href="api/evennia.commands.default.building.html#evennia.commands.default.building.CmdExamine.separator">separator (evennia.commands.default.building.CmdExamine attribute)</a>
</li>
<li><a href="api/evennia.utils.optionclasses.html#evennia.utils.optionclasses.BaseOption.serialize">serialize() (evennia.utils.optionclasses.BaseOption method)</a>
@ -13610,6 +13636,10 @@
<li><a href="api/evennia.commands.default.tests.html#evennia.commands.default.tests.TestGeneral.test_home">test_home() (evennia.commands.default.tests.TestGeneral method)</a>
</li>
<li><a href="api/evennia.commands.default.tests.html#evennia.commands.default.tests.TestAccount.test_ic">test_ic() (evennia.commands.default.tests.TestAccount method)</a>
</li>
<li><a href="api/evennia.commands.default.tests.html#evennia.commands.default.tests.TestAccount.test_ic__nonaccess">test_ic__nonaccess() (evennia.commands.default.tests.TestAccount method)</a>
</li>
<li><a href="api/evennia.commands.default.tests.html#evennia.commands.default.tests.TestAccount.test_ic__other_object">test_ic__other_object() (evennia.commands.default.tests.TestAccount method)</a>
</li>
<li><a href="api/evennia.server.portal.tests.html#evennia.server.portal.tests.TestIRC.test_identity">test_identity() (evennia.server.portal.tests.TestIRC method)</a>
</li>
@ -13702,11 +13732,11 @@
<li><a href="api/evennia.web.utils.tests.html#evennia.web.utils.tests.TestGeneralContext.test_set_game_name_and_slogan">test_set_game_name_and_slogan() (evennia.web.utils.tests.TestGeneralContext method)</a>
</li>
<li><a href="api/evennia.commands.default.tests.html#evennia.commands.default.tests.TestHelp.test_set_help">test_set_help() (evennia.commands.default.tests.TestHelp method)</a>
</li>
<li><a href="api/evennia.commands.default.tests.html#evennia.commands.default.tests.TestBuilding.test_set_home">test_set_home() (evennia.commands.default.tests.TestBuilding method)</a>
</li>
</ul></td>
<td style="width: 33%; vertical-align: top;"><ul>
<li><a href="api/evennia.commands.default.tests.html#evennia.commands.default.tests.TestBuilding.test_set_home">test_set_home() (evennia.commands.default.tests.TestBuilding method)</a>
</li>
<li><a href="api/evennia.utils.evmenu.html#evennia.utils.evmenu.test_set_node">test_set_node() (in module evennia.utils.evmenu)</a>
</li>
<li><a href="api/evennia.commands.default.tests.html#evennia.commands.default.tests.TestBuilding.test_set_obj_alias">test_set_obj_alias() (evennia.commands.default.tests.TestBuilding method)</a>
@ -14231,10 +14261,10 @@
<li><a href="api/evennia.utils.utils.html#evennia.utils.utils.LimitedSizeOrderedDict.update">(evennia.utils.utils.LimitedSizeOrderedDict method)</a>
</li>
</ul></li>
</ul></td>
<td style="width: 33%; vertical-align: top;"><ul>
<li><a href="api/evennia.typeclasses.attributes.html#evennia.typeclasses.attributes.IAttributeBackend.update_attribute">update_attribute() (evennia.typeclasses.attributes.IAttributeBackend method)</a>
</li>
</ul></td>
<td style="width: 33%; vertical-align: top;"><ul>
<li><a href="api/evennia.utils.eveditor.html#evennia.utils.eveditor.EvEditor.update_buffer">update_buffer() (evennia.utils.eveditor.EvEditor method)</a>
</li>
<li><a href="api/evennia.utils.idmapper.models.html#evennia.utils.idmapper.models.update_cached_instance">update_cached_instance() (in module evennia.utils.idmapper.models)</a>
@ -14298,6 +14328,8 @@
</li>
</ul></li>
<li><a href="api/evennia.contrib.turnbattle.tb_items.html#evennia.contrib.turnbattle.tb_items.use_item">use_item() (in module evennia.contrib.turnbattle.tb_items)</a>
</li>
<li><a href="api/evennia.accounts.admin.html#evennia.accounts.admin.AccountDBAdmin.user_change_password">user_change_password() (evennia.accounts.admin.AccountDBAdmin method)</a>
</li>
<li><a href="api/evennia.accounts.models.html#evennia.accounts.models.AccountDB.user_permissions">user_permissions (evennia.accounts.models.AccountDB attribute)</a>
</li>

Binary file not shown.

File diff suppressed because one or more lines are too long

View file

@ -1,4 +1,4 @@
# Sphinx build info version 1
# This file hashes the configuration used when building these files. When it is not found, a full rebuild will be done.
config: 33f344c06d002d5cd75fc83289be4946
config: 8244059fe98625c9832c2ceb57107810
tags: 645f666f9bcd5a90fca523b33c5a78b7

View file

@ -72,14 +72,15 @@ Any contrib-specific tutorials will be found here instead of in <code class="doc
result in Evennia. This is often on a tutorial or FAQ form and will refer to the rest of the
documentation for further reading.</p>
<ul>
<li><p><code class="docutils literal notranslate"><span class="pre">source/Howtos/StartingTutorial/</span></code> holds all documents part of the initial tutorial sequence.</p></li>
<li><p><code class="docutils literal notranslate"><span class="pre">source/Howtos/Starting/</span></code> holds all documents part of the initial tutorial sequence.</p></li>
</ul>
</li>
</ul>
<p>Other files and folders:</p>
<ul class="simple">
<li><p><code class="docutils literal notranslate"><span class="pre">source/api/</span></code> contains the auto-generated API documentation as <code class="docutils literal notranslate"><span class="pre">.rst</span></code> files. Dont edit these
files manually, your changes will be lost.</p></li>
files manually, your changes will be lost. To refer to these files, use <code class="docutils literal notranslate"><span class="pre">api:</span></code> followed by
the Python path, for example <code class="docutils literal notranslate"><span class="pre">[rpsystem</span> <span class="pre">contrib](api:evennia.contrib.rpsystem)</span></code>.</p></li>
<li><p><code class="docutils literal notranslate"><span class="pre">source/_templates</span></code> and <code class="docutils literal notranslate"><span class="pre">source/_static</span></code> should not be modified unless adding a new doc-page
feature or changing the look of the HTML documentation.</p></li>
<li><p><code class="docutils literal notranslate"><span class="pre">conf.py</span></code> holds the Sphinx configuration. It should usually not be modified except to update
@ -98,7 +99,7 @@ referred to in this document.</p>
not hard and is very readable on its raw text-form.</p>
<p>You can furthermore get a good feel for how things will look using a
Markdown-viewer like [Grip][grip]. Editors like [ReText][retext] or IDEs like
[PyCharm][pycharm] also have Markdown previews. Building the docs locally is
[PyCharm][pycharm] also have native Markdown previews. Building the docs locally is
however the only way to make sure the outcome is exactly as you expect. The process
will also find any mistakes you made, like making a typo in a link.</p>
<div class="section" id="building-only-the-main-documentation">
@ -133,13 +134,16 @@ build them!</p></li>
<h3>Building the main documentation and API docs<a class="headerlink" href="#building-the-main-documentation-and-api-docs" title="Permalink to this headline"></a></h3>
<p>The full documentation includes both the doc pages and the API documentation
generated from the Evennia source. For this you must install Evennia and
initialize a new game with a default database (you dont need to have it
initialize a new game with a default database (you dont need to have any server
running)</p>
<ul>
<li><p>Follow the normal [Evennia Getting-Started instructions][getting-started]
to install Evennia into a virtualenv. Get back here once everything is installed but
before creating a new game.</p></li>
<li><p>Make sure you <code class="docutils literal notranslate"><span class="pre">cd</span></code> to the folder <em>containing</em> your <code class="docutils literal notranslate"><span class="pre">evennia/</span></code> repo (so two levels
<li><p>Its recommended that you use a virtualenv. Install your cloned version of Evennia into
by pointing to the repo folder (the one containing <code class="docutils literal notranslate"><span class="pre">/docs</span></code>):</p>
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="n">pip</span> <span class="n">install</span> <span class="o">-</span><span class="n">e</span> <span class="n">evennia</span>
</pre></div>
</div>
</li>
<li><p>Make sure you are in the parent folder <em>containing</em> your <code class="docutils literal notranslate"><span class="pre">evennia/</span></code> repo (so <em>two</em> levels
up from <code class="docutils literal notranslate"><span class="pre">evennia/docs/</span></code>).</p></li>
<li><p>Create a new game folder called exactly <code class="docutils literal notranslate"><span class="pre">gamedir</span></code> at the same level as your <code class="docutils literal notranslate"><span class="pre">evennia</span></code>
repo with</p>
@ -147,8 +151,8 @@ repo with</p>
</pre></div>
</div>
</li>
<li><p>Then <code class="docutils literal notranslate"><span class="pre">cd</span></code> into it and create a new, empty database. You dont need to start the game
or do any further changes.</p>
<li><p>Then <code class="docutils literal notranslate"><span class="pre">cd</span></code> into it and create a new, empty database. You dont need to start the
game or do any further changes after this.</p>
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="n">evennia</span> <span class="n">migrate</span>
</pre></div>
</div>
@ -163,11 +167,10 @@ or do any further changes.</p>
</div>
</li>
</ul>
<p>If you are already working on a game, you may of course have your real game folder there as
well. We wont touch that.</p>
<p>(If you are already working on a game, you may of course have your real game folder there as
well. We wont touch that.)</p>
<ul>
<li><p>Make sure you are still in your virtualenv, then go to <code class="docutils literal notranslate"><span class="pre">evennia/docs/</span></code> and
install the doc-building requirements:</p>
<li><p>Go to <code class="docutils literal notranslate"><span class="pre">evennia/docs/</span></code> and install the doc-building requirements (you only need to do this once):</p>
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="n">make</span> <span class="n">install</span>
<span class="ow">or</span>
<span class="n">pip</span> <span class="n">install</span> <span class="o">-</span><span class="n">r</span> <span class="n">requirements</span><span class="o">.</span><span class="n">txt</span>
@ -211,8 +214,8 @@ docs are built by looking at the git tree.</p></li>
</div>
</li>
</ul>
<p>This is as close to the real version as you can get locally. The different versions
will be found under <code class="docutils literal notranslate"><span class="pre">evennia/docs/build</span></code>. During deploy a symlink <code class="docutils literal notranslate"><span class="pre">latest</span></code> will point
<p>This is as close to the real version of the docs as you can get locally. The different versions
will be found under <code class="docutils literal notranslate"><span class="pre">evennia/docs/build/versions/</span></code>. During deploy a symlink <code class="docutils literal notranslate"><span class="pre">latest</span></code> will point
to the latest version of the docs.</p>
<div class="section" id="release">
<h4>Release<a class="headerlink" href="#release" title="Permalink to this headline"></a></h4>
@ -253,17 +256,17 @@ few alternative forms for some of these, we try to stick to the below forms for
<div class="section" id="headings">
<h2>Headings<a class="headerlink" href="#headings" title="Permalink to this headline"></a></h2>
<p>We use <code class="docutils literal notranslate"><span class="pre">#</span></code> to indicate sections/headings. The more <code class="docutils literal notranslate"><span class="pre">#</span></code> the more of a sub-heading it is (will get
smaller
and smaller font).</p>
smaller and smaller font).</p>
<ul class="simple">
<li><p><code class="docutils literal notranslate"><span class="pre">#</span> <span class="pre">Heading</span></code></p></li>
<li><p><code class="docutils literal notranslate"><span class="pre">##</span> <span class="pre">SubHeading</span></code></p></li>
<li><p><code class="docutils literal notranslate"><span class="pre">##</span> <span class="pre">SubSubHeading</span></code></p></li>
<li><p><code class="docutils literal notranslate"><span class="pre">###</span> <span class="pre">SubSubHeading</span></code></p></li>
<li><p><code class="docutils literal notranslate"><span class="pre">####</span> <span class="pre">SubSubSubHeading</span></code></p></li>
</ul>
<blockquote>
<div><p>Dont reuse the same heading/subheading name over and over in the same document. While Markdown
does not prevent
it, it makes it impossible to link to those duplicates properly (see next section).</p>
<div><p>Dont use the same heading/subheading name more than once in one page. While Markdown
does not prevent it, it will make it impossible to refer to that heading uniquely.
The Evennia documentation preparser will detect this and give you an error.</p>
</div></blockquote>
</div>
<div class="section" id="lists">
@ -318,20 +321,20 @@ full <code class="docutils literal notranslate"><span class="pre">http://</span>
</ul>
<p>You can point to sub-sections (headings) in a document by using a single <code class="docutils literal notranslate"><span class="pre">#</span></code> and the name of the
heading, replacing spaces with dashes. So to refer to a heading <code class="docutils literal notranslate"><span class="pre">##</span> <span class="pre">Cool</span> <span class="pre">Stuff</span></code> inside <code class="docutils literal notranslate"><span class="pre">My-Document</span></code>
would be a link <code class="docutils literal notranslate"><span class="pre">[cool</span> <span class="pre">stuff](My-Document#Cool-Stuff)</span></code>.</p>
would be a link <code class="docutils literal notranslate"><span class="pre">[cool</span> <span class="pre">stuff](My-Document#Cool-Stuff)</span></code>. This is why headings must be uniquely named
within on document.</p>
<ul class="simple">
<li><p><code class="docutils literal notranslate"><span class="pre">[linktext][linkref]</span></code> - refer to a reference defined later in the document.</p></li>
</ul>
<p>Urls can get long and if you are using the same url in many places it can get a little cluttered. So
you can also put
the url as a footnote at the end of your document
you can also put the url as a footnote at the end of your document
and refer to it by putting your reference within square brackets <code class="docutils literal notranslate"><span class="pre">[</span> <span class="pre">]</span></code>. Heres an example:</p>
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="n">This</span> <span class="ow">is</span> <span class="n">a</span> <span class="p">[</span><span class="n">clickable</span> <span class="n">link</span><span class="p">][</span><span class="n">mylink</span><span class="p">]</span><span class="o">.</span> <span class="n">This</span> <span class="ow">is</span> <span class="p">[</span><span class="n">another</span> <span class="n">link</span><span class="p">][</span><span class="mi">1</span><span class="p">]</span><span class="o">.</span>
<span class="o">...</span>
<span class="p">[</span><span class="n">mylink</span><span class="p">](</span><span class="n">http</span><span class="p">:</span><span class="o">//...</span><span class="p">)</span>
<span class="p">[</span><span class="n">mylink</span><span class="p">]:</span> <span class="n">http</span><span class="p">:</span><span class="o">//...</span>
<span class="p">[</span><span class="mi">1</span><span class="p">]:</span> <span class="n">My</span><span class="o">-</span><span class="n">Document</span>
</pre></div>
</div>
@ -341,8 +344,8 @@ and refer to it by putting your reference within square brackets <code class="do
<div class="section" id="github-online-repository">
<h4>Github online repository<a class="headerlink" href="#github-online-repository" title="Permalink to this headline"></a></h4>
<ul>
<li><p><code class="docutils literal notranslate"><span class="pre">github:</span></code> - a shortcut for the full path to the Evennia repository on github. This will refer to
the <code class="docutils literal notranslate"><span class="pre">master</span></code> branch by default:</p>
<li><p><code class="docutils literal notranslate"><span class="pre">github:</span></code> - a shortcut for the full path to the Evennia repository on github. This must be given
with forward-slashes and include the <code class="docutils literal notranslate"><span class="pre">.py</span></code> file ending. It will refer to the <code class="docutils literal notranslate"><span class="pre">master</span></code> branch by default:</p>
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span> <span class="p">[</span><span class="n">link</span> <span class="n">to</span> <span class="n">objects</span><span class="o">.</span><span class="n">py</span><span class="p">](</span><span class="n">github</span><span class="p">:</span><span class="n">evennia</span><span class="o">/</span><span class="n">objects</span><span class="o">/</span><span class="n">objects</span><span class="o">.</span><span class="n">py</span><span class="p">)</span>
</pre></div>
</div>
@ -364,25 +367,21 @@ the <code class="docutils literal notranslate"><span class="pre">master</span></
</div>
<p>This will create a link to the auto-generated <code class="docutils literal notranslate"><span class="pre">evennia/source/api/evennia.objects.rst</span></code> document.</p>
<p>Since api-docs are generated alongside the documentation, this will always be the api docs for
the
current version/branch of the docs.</p>
the current version/branch of the docs.</p>
</li>
</ul>
</div>
<div class="section" id="bug-reports-feature-request">
<h4>Bug reports/feature request<a class="headerlink" href="#bug-reports-feature-request" title="Permalink to this headline"></a></h4>
<ul>
<li><p><code class="docutils literal notranslate"><span class="pre">issue</span></code>, <code class="docutils literal notranslate"><span class="pre">bug-report</span></code>, <code class="docutils literal notranslate"><span class="pre">feature-request</span></code> - links to the same github issue select page.</p>
<li><p><code class="docutils literal notranslate"><span class="pre">github:issue</span></code> - links to the github issue selection page, where the user can choose which type of
issue to create.</p>
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span> If you find a problem, make a [bug report](github:issue)!
</pre></div>
</div>
<p>This will generate a link to https://github.com/evennia/evennia/issues/new/choose.</p>
</li>
</ul>
<blockquote>
<div><p>For some reason these particular shortcuts gives a warning during documentation compilation. This
can be ignored.</p>
</div></blockquote>
</div>
</div>
</div>
@ -434,11 +433,11 @@ def a_python_func(x):
<p>Markdown is easy to read and use. But while it does most of what we need, there are some things its
not quite as expressive as it needs to be. For this we need to fall back to the [ReST][ReST] markup
language which the documentation system uses under the hood. This is done by specifying <code class="docutils literal notranslate"><span class="pre">eval_rst</span></code>
as
the name of the <code class="docutils literal notranslate"><span class="pre">language</span></code> of a literal block:</p>
as the name of the <code class="docutils literal notranslate"><span class="pre">language</span></code> of a literal block:</p>
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span>```eval_rst
This will be evaluated as ReST.
This will be evaluated as ReST.
All content must be indented.
```
</pre></div>
@ -447,13 +446,24 @@ the name of the <code class="docutils literal notranslate"><span class="pre">lan
<code class="docutils literal notranslate"><span class="pre">eval_rst</span></code>:</p>
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span>```directive:: possible-option
Content that *must* be indented for it to be included in the directive.
Content *must* be indented for it to be included in the directive.
New lines are ignored except if separated by an empty line.
New lines are ignored, empty lines starts a new paragraph.
```
</pre></div>
</div>
<p>See below for examples of this.</p>
<p>Within a ReST block, one must use Restructured Text syntax, which is not the same as Markdown.</p>
<ul>
<li><p>Single backticks around text makes it <em>italic</em>.</p></li>
<li><p>Double backticks around text makes it <code class="docutils literal notranslate"><span class="pre">verbatim</span></code>.</p></li>
<li><p>A link is written within back-ticks, with an underscore at the end:</p>
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span>`python &lt;www.python.org&gt;`_
</pre></div>
</div>
</li>
</ul>
<p><a class="reference external" href="https://thomas-cokelaer.info/tutorials/sphinx/rest_syntax.html">Here is a ReST formatting cheat sheet</a>.</p>
<p>Below are examples of ReST-block structures.</p>
<div class="section" id="note">
<h3>Note<a class="headerlink" href="#note" title="Permalink to this headline"></a></h3>
<p>This kind of note may pop more than doing a <code class="docutils literal notranslate"><span class="pre">&gt;</span> <span class="pre">Note:</span> <span class="pre">...</span></code>. Contrary to a
@ -563,7 +573,7 @@ a plain HTML string in the markdown like so:</p>
<div style="clear: right;"></div></div>
<div class="section" id="tables">
<h3>Tables<a class="headerlink" href="#tables" title="Permalink to this headline"></a></h3>
<p>A table is specified using [ReST table syntax][ReST-tables]:</p>
<p>A table is specified using [ReST table syntax][ReST-tables] (they dont need to be indented):</p>
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span>```eval_rst
===== ===== =======
@ -652,9 +662,9 @@ True True True
</div>
<div class="section" id="a-more-flexible-code-block">
<h3>A more flexible code block<a class="headerlink" href="#a-more-flexible-code-block" title="Permalink to this headline"></a></h3>
<p>The regular Markdown codeblock is usually enough but for more direct control over the style, one
can also specify the code block explicitly in <code class="docutils literal notranslate"><span class="pre">ReST</span></code>.
for more flexibility. It also provides a link to the code block, identified by its name.</p>
<p>The regular Markdown Python codeblock is usually enough but for more direct control over the style, one
can also specify the code block explicitly in <code class="docutils literal notranslate"><span class="pre">ReST</span></code> for more flexibility.
It also provides a link to the code block, identified by its name.</p>
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span>```code-block:: python
:linenos:
:emphasize-lines: 1-2,8
@ -698,15 +708,23 @@ this
block through the link that will appear (so it should be unique for a give document).</p>
<blockquote>
<div><p>The default markdown syntax will actually generate a code-block ReST instruction like this
automatically for us behind the scenes. The automatic generation cant know things like emphasize-
lines
or caption since thats not a part of the Markdown specification.</p>
automatically for us behind the scenes. But the automatic generation cant know things like emphasize-
lines or captions since thats not a part of the Markdown specification.</p>
</div></blockquote>
</div>
</div>
<div class="section" id="code-documentation">
<h2>Code documentation<a class="headerlink" href="#code-documentation" title="Permalink to this headline"></a></h2>
<p>The source code docstrings will be parsed as Markdown. When writing a module docstring, you can use Markdown formatting,
including header levels down to 4th level (<code class="docutils literal notranslate"><span class="pre">####</span> <span class="pre">SubSubSubHeader</span></code>). After the module documentation its
a good idea to end with four dashes <code class="docutils literal notranslate"><span class="pre">----</span></code>. This will create a visible line between the documentation and the
class/function docs to follow. See for example <a class="reference external" href="api/evennia.contrib.traits.html">the Traits docs</a>.</p>
<p>All non-private classes, methods and functions must have a Google-style docstring, as per the
[Evennia coding style guidelines][github:evennia/CODING_STYLE.md]. This will then be correctly formatted
into pretty api docs.</p>
</div>
<div class="section" id="technical">
<h1>Technical<a class="headerlink" href="#technical" title="Permalink to this headline"></a></h1>
<h2>Technical<a class="headerlink" href="#technical" title="Permalink to this headline"></a></h2>
<p>Evennia leverages [Sphinx][sphinx] with the [recommonmark][recommonmark] extension, which allows us
to write our
docs in light-weight Markdown (more specifically [CommonMark][commonmark], like on github) rather
@ -733,6 +751,7 @@ to understand our friendly Google-style docstrings used in classes and functions
<a class="reference external" href="https://github.com/retext-project/retext">retext</a>
<a class="reference external" href="https://github.com/joeyespo/grip">grip</a>
<a class="reference external" href="https://www.jetbrains.com/pycharm/">pycharm</a></p>
</div>
</div>
@ -799,9 +818,10 @@ to understand our friendly Google-style docstrings used in classes and functions
<li><a class="reference internal" href="#a-more-flexible-code-block">A more flexible code block</a></li>
</ul>
</li>
<li><a class="reference internal" href="#code-documentation">Code documentation</a></li>
<li><a class="reference internal" href="#technical">Technical</a></li>
</ul>
</li>
<li><a class="reference internal" href="#technical">Technical</a></li>
</ul>
<div role="note" aria-label="source link">

View file

@ -71,9 +71,7 @@ in mind for your own game, this will give you a good start.</p>
<ol class="simple">
<li><p><a class="reference internal" href="Starting/Starting-Part2.html"><span class="doc">Introduction &amp; Overview</span></a></p></li>
<li><p><a class="reference internal" href="Starting/Part2/Game-Planning.html"><span class="doc">On planning a game</span></a></p></li>
<li><p><a class="reference internal" href="../Unimplemented.html"><span class="doc">Multisession modes</span></a></p></li>
<li><p><a class="reference internal" href="../Unimplemented.html"><span class="doc">Layout of our tutorial game</span></a></p></li>
<li><p><a class="reference internal" href="Starting/Part2/Some-Useful-Contribs.html"><span class="doc">Some useful Contribs</span></a></p></li>
<li><p><a class="reference internal" href="Starting/Part2/Planning-Some-Useful-Contribs.html"><span class="doc">Planning to use some useful Contribs</span></a></p></li>
</ol>
</div>
<div class="section" id="part3-how-we-get-there">

View file

@ -5,7 +5,7 @@
<head>
<meta charset="utf-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Game Planning &#8212; Evennia 1.0-dev documentation</title>
<title>On Planning a Game &#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>
@ -27,7 +27,7 @@
<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-this"><a href="">Game Planning</a></li>
<li class="nav-item nav-item-this"><a href="">On Planning a Game</a></li>
</ul>
</div>
@ -36,115 +36,118 @@
<div class="bodywrapper">
<div class="body" role="main">
<div class="section" id="game-planning">
<h1>Game Planning<a class="headerlink" href="#game-planning" title="Permalink to this headline"></a></h1>
<p>So you have Evennia up and running. You have a great game idea in mind. Now its time to start
cracking! But where to start? Here are some ideas for a workflow. Note that the suggestions on this
page are just that - suggestions. Also, they are primarily aimed at a lone hobby designer or a small
team developing a game in their free time. There is an article in the Imaginary Realities e-zine
which was written by the Evennia lead dev. It focuses more on you finding out your motivations for
making a game - you can
<a class="reference external" href="http://journal.imaginary-realities.com/volume-07/issue-03/where-do-i-begin/index.html">read the article here</a>.</p>
<p>Below are some minimal steps for getting the first version of a new game world going with players.
Its worth to at least make the attempt to do these steps in order even if you are itching to jump
ahead in the development cycle. On the other hand, you should also make sure to keep your work fun
for you, or motivation will falter. Making a full game is a lot of work as it is, youll need all
your motivation to make it a reality.</p>
<p>Remember that <em>99.99999% of all great game ideas never lead to a game</em>. Especially not to an online
game that people can actually play and enjoy. So our first all overshadowing goal is to beat those
odds and get <em>something</em> out the door! Even if its a scaled-down version of your dream game,
lacking many “must-have” features! Its better to get it out there and expand on it later than to
code in isolation forever until you burn out, lose interest or your hard drive crashes.</p>
<p>Like is common with online games, getting a game out the door does not mean you are going to be
“finished” with the game - most MUDs add features gradually over the course of years - its often
part of the fun!</p>
<div class="section" id="planning-step-1">
<h2>Planning (step 1)<a class="headerlink" href="#planning-step-1" title="Permalink to this headline"></a></h2>
<p>This is what you do before having coded a single line or built a single room. Many prospective game
developers are very good at <em>parts</em> of this process, namely in defining what their world is “about”:
The theme, the world concept, cool monsters and so on. It is by all means very important to define
what is the unique appeal of your game. But its unfortunately not enough to make your game a
reality. To do that you must also have an idea of how to actually map those great ideas onto
<p><a class="reference internal" href="../Starting-Part2.html"><span class="doc">prev lesson</span></a> | <a class="reference internal" href="Planning-The-Tutorial-Game.html"><span class="doc">next lesson</span></a></p>
<div class="section" id="on-planning-a-game">
<h1>On Planning a Game<a class="headerlink" href="#on-planning-a-game" title="Permalink to this headline"></a></h1>
<p>This lesson will be less hands-on and more introspective. Well go through some general things to think
about when planning your game. In the following lessons well apply this to plan out the tutorial-game we will
be making.</p>
<p>Note that the suggestions on this page are just that - suggestions. Also, they are primarily aimed at a lone
hobby designer or a small team developing a game in their free time.</p>
<div class="admonition important">
<p class="admonition-title">Important</p>
<p>Your first all overshadowing goal is to beat the odds and get <strong>something</strong> out the door!
Even if its a scaled-down version of your dream game, lacking many “must-have” features!</p>
</div>
<p>Remember: <em>99.99999% of all great game ideas never lead to a game</em>. Especially not to an online
game that people can actually play and enjoy. Its better to get your game out there and expand on it
later than to code in isolation until you burn out, lose interest or your hard drive crashes.</p>
<ul class="simple">
<li><p>Keep the scope of your initial release down. Way down.</p></li>
<li><p>Start small, with an eye towards expansions later, after first release.</p></li>
<li><p>If the suggestions here seems boring or a chore to you, do it your way instead. Everyones different.</p></li>
<li><p>Keep having <em>fun</em>. You must keep your motivation up, whichever way works for <em>you</em>.</p></li>
</ul>
<div class="section" id="the-steps">
<h2>The steps<a class="headerlink" href="#the-steps" title="Permalink to this headline"></a></h2>
<p>Here are the rough steps towards your goal.</p>
<ol class="simple">
<li><p>Planning</p></li>
<li><p>Coding + Gradually building a tech-demo</p></li>
<li><p>Building the actual game world</p></li>
<li><p>Release</p></li>
<li><p>Celebrate</p></li>
</ol>
</div>
<div class="section" id="planning">
<h2>Planning<a class="headerlink" href="#planning" title="Permalink to this headline"></a></h2>
<p>You need to have at least a rough idea about what you want to create. Some like a lot of planning, others
do it more seat-of-the-pants style. Regardless, while <em>some</em> planning is always good to do, its common
to have your plans change on you as you create your code prototypes. So dont get <em>too</em> bogged down in
the details out of the gate.</p>
<p>Many prospective game developers are very good at <em>parts</em> of this process, namely in defining what their
world is “about”: The theme, the world concept, cool monsters and so on. Such things are very important. But
unfortunately, they are not enough to make your game. You need to figure out how to accomplish your ideas in
Evennia.</p>
<p>A good start is to begin by planning out the basic primitives of the game and what they need to be
able to do. Below are a far-from-complete list of examples (and for your first version you should
definitely try for a much shorter list):</p>
<p>Below are some questions to get you going. In the next lesson we will try to answer them for our particular
tutorial game. There are of course many more questions you could be asking yourself.</p>
<div class="section" id="administration">
<h3>Administration<a class="headerlink" href="#administration" title="Permalink to this headline"></a></h3>
<ul class="simple">
<li><p>Should your game rules be enforced by coded systems or by human game masters?</p></li>
<li><p>What is the staff hierarchy in your game? Is vanilla Evennia roles enough or do you need something else?</p></li>
<li><p>Should players be able to post out-of-characters on channels and via other means like bulletin-boards?</p></li>
</ul>
</div>
<div class="section" id="building">
<h3>Building<a class="headerlink" href="#building" title="Permalink to this headline"></a></h3>
<ul class="simple">
<li><p>How will the world be built? Traditionally (from in-game with build-commands) or externally (by batchcmds/code
or directly with custom code)?</p></li>
<li><p>Can only privileged Builders create things or should regular players also have limited build-capability?</p></li>
</ul>
</div>
<div class="section" id="systems">
<h3>Systems<a class="headerlink" href="#systems" title="Permalink to this headline"></a></h3>
<p>These are the behind-the-scenes features that exist in your game, often without being represented by
a specific in-game object.</p>
<ul class="simple">
<li><p>Should your game rules be enforced by coded systems or are you planning for human game masters to
run and arbitrate rules?</p></li>
<li><p>What are the actual mechanical game rules? How do you decide if an action succeeds or fails? What
“rolls” does the game need to be able to do? Do you base your game off an existing system or make up
your own?</p></li>
<li><p>Does the flow of time matter in your game - does night and day change? What about seasons? Maybe
your magic system is affected by the phase of the moon?</p></li>
<li><p>Do you want changing, global weather? This might need to operate in tandem over a large number of
rooms.</p></li>
<li><p>Do you want a game-wide economy or just a simple barter system? Or no formal economy at all?</p></li>
<li><p>Should characters be able to send mail to each other in-game?</p></li>
<li><p>Should players be able to post on Bulletin boards?</p></li>
<li><p>What is the staff hierarchy in your game? What powers do you want your staff to have?</p></li>
<li><p>What should a Builder be able to build and what commands do they need in order to do that?</p></li>
<li><p>etc.</p></li>
<li><p>Do you base your game off an existing RPG system or make up your own?</p></li>
<li><p>What are the game mechanics? How do you decide if an action succeeds or fails?</p></li>
<li><p>Does the flow of time matter in your game - does night and day change? What about seasons?</p></li>
<li><p>Do you want changing, global weather or should weather just be set manually in roleplay?</p></li>
<li><p>Do you want a coded world-economy or just a simple barter system? Or no formal economy at all?</p></li>
<li><p>Do you have concepts like reputation and influence?</p></li>
<li><p>Will your characters be known by their name or only by their physical appearance?</p></li>
</ul>
</div>
<div class="section" id="rooms">
<h3>Rooms<a class="headerlink" href="#rooms" title="Permalink to this headline"></a></h3>
<p>Consider the most basic room in your game.</p>
<ul class="simple">
<li><p>Is a simple description enough or should the description be able to change (such as with time, by
<li><p>Is a simple room description enough or should the description be able to change (such as with time, by
light conditions, weather or season)?</p></li>
<li><p>Should the room have different statuses? Can it have smells, sounds? Can it be affected by
dramatic weather, fire or magical effects? If so, how would this affect things in the room? Or are
these things something admins/game masters should handle manually?</p></li>
<li><p>Can objects be hidden in the room? Can a person hide in the room? How does the room display this?</p></li>
<li><p>etc.</p></li>
</ul>
</div>
<div class="section" id="objects">
<h3>Objects<a class="headerlink" href="#objects" title="Permalink to this headline"></a></h3>
<p>Consider the most basic (non-player-controlled) object in your game.</p>
<div class="section" id="objects-items">
<h3>Objects / items<a class="headerlink" href="#objects-items" title="Permalink to this headline"></a></h3>
<ul class="simple">
<li><p>How numerous are your objects? Do you want large loot-lists or are objects just role playing props
created on demand?</p></li>
<li><p>Does the game use money? If so, is each coin a separate object or do you just store a bank account
value?</p></li>
<li><p>What about multiple identical objects? Do they form stacks and how are those stacks handled in
that case?</p></li>
<li><p>If you use money, is each coin a separate object or do you just store a bank account value?</p></li>
<li><p>Do multiple similar objects form stacks and how are those stacks handled in that case?</p></li>
<li><p>Does an object have weight or volume (so you cannot carry an infinite amount of them)?</p></li>
<li><p>Can objects be broken? If so, does it have a health value? Is burning it causing the same damage
as smashing it? Can it be repaired?</p></li>
<li><p>Is a weapon a specific type of object or are you supposed to be able to fight with a chair too?
Can you fight with a flower or piece of paper as well?</p></li>
<li><p>NPCs/mobs are also objects. Should they just stand around or should they have some sort of AI?</p></li>
<li><p>Are NPCs/mobs differet entities? How is an Orc different from a Kobold, in code - are they the
same object with different names or completely different types of objects, with custom code?</p></li>
<li><p>Should there be NPCs giving quests? If so, how would you track quest status and what happens when
multiple players try to do the same quest? Do you use instances or some other mechanism?</p></li>
<li><p>etc.</p></li>
<li><p>Can objects be broken? Can they be repaired?</p></li>
<li><p>Can you fight with a chair or a flower or must you use a specific weapon kind of thing?</p></li>
<li><p>Will characters be able to craft new objects?</p></li>
<li><p>Should mobs/NPCs have some sort of AI?</p></li>
<li><p>Are NPCs and mobs different entities? How do they differ?</p></li>
<li><p>Should there be NPCs giving quests? If so, how do you track Quest status?</p></li>
</ul>
</div>
<div class="section" id="characters">
<h3>Characters<a class="headerlink" href="#characters" title="Permalink to this headline"></a></h3>
<p>These are the objects controlled directly by Players.</p>
<ul class="simple">
<li><p>Can players have more than one Character active at a time or are they allowed to multi-play?</p></li>
<li><p>How does a Player create their Character? A Character-creation screen? Answering questions?
Filling in a form?</p></li>
<li><p>Do you want to use classes (like “Thief”, “Warrior” etc) or some other system, like Skill-based?</p></li>
<li><p>How does the character-generation work? Walk from room-to-room? A menu?</p></li>
<li><p>How do you implement different “classes” or “races”? Are they separate types of objects or do you
simply load different stats on a basic object depending on what the Player wants?</p></li>
<li><p>If a Character can hide in a room, what skill will decide if they are detected?</p></li>
<li><p>What skill allows a Character to wield a weapon and hit? Do they need a special skill to wield a
chair rather than a sword?</p></li>
<li><p>Does a Character need a Strength attribute to tell how much they can carry or which objects they
can smash?</p></li>
<li><p>What does the skill tree look like? Can a Character gain experience to improve? By killing
enemies? Solving quests? By roleplaying?</p></li>
<li><p>etc.</p></li>
<li><p>May player-characters attack each other (PvP)?</p></li>
<li><p>What are the penalties of defeat? Permanent death? Quick respawn? Time in prison?</p></li>
</ul>
<p>A MUDs a lot more involved than you would think and these things hang together in a complex web. It
can easily become overwhelming and its tempting to want <em>all</em> functionality right out of the door.
@ -152,82 +155,71 @@ Try to identify the basic things that “make” your game and focus <em>only</e
release. Make a list. Keep future expansions in mind but limit yourself.</p>
</div>
</div>
<div class="section" id="coding-step-2">
<h2>Coding (step 2)<a class="headerlink" href="#coding-step-2" title="Permalink to this headline"></a></h2>
<p>This is the actual work of creating the “game” part of your game. Many “game-designer” types tend to
gloss over this bit and jump directly to <strong>World Building</strong>. Vice versa, many “game-coder” types
tend to jump directly to this part without doing the <strong>Planning</strong> first. Neither way is good and
<em>will</em> lead to you having to redo all your hard work at least once, probably more.</p>
<p>Evennias <a class="reference internal" href="../../../Components/Components-Overview.html"><span class="doc">Evennia Component overview</span></a> tries to help you with this bit of development. We
also have a slew of <a class="reference internal" href="../../Howto-Overview.html"><span class="doc">Tutorials</span></a> with worked examples. Evennia tries hard to make this
part easier for you, but there is no way around the fact that if you want anything but a very basic
Talker-type game you <em>will</em> have to bite the bullet and code your game (or find a coder willing to
do it for you).</p>
<p>Even if you wont code anything yourself, as a designer you need to at least understand the basic
paradigms of Evennia, such as <a class="reference internal" href="../../../Components/Objects.html"><span class="doc">Objects</span></a>,
<a class="reference internal" href="../../../Components/Commands.html"><span class="doc">Commands</span></a> and <a class="reference internal" href="../../../Components/Scripts.html"><span class="doc">Scripts</span></a> and
how they hang together. We recommend you go through the <a class="reference internal" href="../Part1/Tutorial-World-Introduction.html"><span class="doc">Tutorial World</span></a> in detail (as well as glancing at its code) to get at least a feel for what is
involved behind the scenes. You could also look through the tutorial for
<a class="reference internal" href="../Part3/Tutorial-for-basic-MUSH-like-game.html"><span class="doc">building a game from scratch</span></a>.</p>
<div class="section" id="coding-and-tech-demo">
<h2>Coding and Tech demo<a class="headerlink" href="#coding-and-tech-demo" title="Permalink to this headline"></a></h2>
<p>This is the actual work of creating the “game” part of your game. As you code and test systems you should
build a little “tech demo” along the way.</p>
<div class="sidebar">
<p class="sidebar-title">Tech demo</p>
<p>With “tech demo” we mean a small example of your code in-action: A room with a mob,
a way to jump into and test character-creation etc. The tech demo need not be pretty, its
there to test functionality. Its not the beginning of your game world (unless you find that
to be more fun).</p>
</div>
<p>Try to avoid going wild with building a huge game world before you have a tech-demo showing off all parts
you expect to have in the first version of your game. Otherwise you run the risk of having to redo it all
again.</p>
<p>Evennia tries hard to make the coding easier for you, but there is no way around the fact that if you want
anything but a basic chat room you <em>will</em> have to bite the bullet and code your game (or find a coder willing
to do it for you).</p>
<blockquote>
<div><p>Even if you wont code anything yourself, as a designer you need to at least understand the basic
paradigms and components of Evennia. Its recommended you look over the rest of this Beginner Tutorial to learn
what tools you have available.</p>
</div></blockquote>
<p>During Coding you look back at the things you wanted during the <strong>Planning</strong> phase and try to
implement them. Dont be shy to update your plans if you find things easier/harder than you thought.
The earlier you revise problems, the easier they will be to fix.</p>
<p>A good idea is to host your code online (publicly or privately) using version control. Not only will
this make it easy for multiple coders to collaborate (and have a bug-tracker etc), it also means
your work is backed up at all times. The <a class="reference internal" href="../../../Coding/Version-Control.html"><span class="doc">Version Control</span></a> tutorial has
instructions for setting up a sane developer environment with proper version control.</p>
<div class="section" id="tech-demo-building">
<h3>“Tech Demo” Building<a class="headerlink" href="#tech-demo-building" title="Permalink to this headline"></a></h3>
<p>This is an integral part of your Coding. It might seem obvious to experienced coders, but it cannot
be emphasized enough that you should <em>test things on a small scale</em> before putting your untested
code into a large game-world. The earlier you test, the easier and cheaper it will be to fix bugs
and even rework things that didnt work out the way you thought they would. You might even have to
go back to the <strong>Planning</strong> phase if your ideas cant handle their meet with reality.</p>
<p>This means building singular in-game examples. Make one room and one object of each important type
and test so they work correctly in isolation. Then add more if they are supposed to interact with
each other in some way. Build a small series of rooms to test how mobs move around … and so on. In
short, a test-bed for your growing code. It should be done gradually until you have a fully
functioning (if not guaranteed bug-free) miniature tech demo that shows <em>all</em> the features you want
in the first release of your game. There does not need to be any game play or even a theme to your
tests, this is only for you and your co-coders to see. The more testing you do on this small scale,
the less headaches you will have in the next phase.</p>
<p>A good idea is to host your code online using <em>version control</em>. Github.com offers free Private repos
these days if you dont want the world to learn your secrets. Not only version control
make it easy for your team to collaborate, it also means
your work is backed up at all times. The page on <a class="reference internal" href="../../../Coding/Version-Control.html"><span class="doc">Version Control</span></a>
will help you to setting up a sane developer environment with proper version control.</p>
</div>
</div>
<div class="section" id="world-building-step-3">
<h2>World Building (step 3)<a class="headerlink" href="#world-building-step-3" title="Permalink to this headline"></a></h2>
<div class="section" id="world-building">
<h2>World Building<a class="headerlink" href="#world-building" title="Permalink to this headline"></a></h2>
<p>Up until this point weve only had a few tech-demo objects in the database. This step is the act of
populating the database with a larger, thematic world. Too many would-be developers jump to this
stage too soon (skipping the <strong>Coding</strong> or even <strong>Planning</strong> stages). What if the rooms you build
now doesnt include all the nice weather messages the code grows to support? Or the way you store
data changes under the hood? Your building work would at best require some rework and at worst you
would have to redo the whole thing. And whereas Evennias typeclass system does allow you to edit
the properties of existing objects, some hooks are only called at object creation … Suffice to
say you are in for a <em>lot</em> of unnecessary work if you build stuff en masse without having the
underlying code systems in some reasonable shape first.</p>
would have to redo the whole thing. You could be in for a <em>lot</em> of unnecessary work if you build stuff
en masse without having the underlying code systems in some reasonable shape first.</p>
<p>So before starting to build, the “game” bit (<strong>Coding</strong> + <strong>Testing</strong>) should be more or less
<strong>complete</strong>, <em>at least to the level of your initial release</em>.</p>
<p>Before starting to build, you should also plan ahead again. Make sure it is clear to yourself and
your eventual builders just which parts of the world you want for your initial release. Establish
for everyone which style, quality and level of detail you expect. Your goal should <em>not</em> be to
complete your entire world in one go. You want just enough to make the games “feel” come across.
You want a minimal but functioning world where the intended game play can be tested and roughly
balanced. You can always add new areas later.</p>
<p>Make sure it is clear to yourself and your eventual builders just which parts of the world you want
for your initial release. Establish for everyone which style, quality and level of detail you expect.</p>
<p>Your goal should <em>not</em> be to complete your entire world in one go. You want just enough to make the
games “feel” come across. You want a minimal but functioning world where the intended game play can
be tested and roughly balanced. You can always add new areas later.</p>
<p>During building you get free and extensive testing of whatever custom build commands and systems you
have made at this point. Since Building often involves different people than those Coding, you also
have made at this point. If Builders and coders are different people you also
get a chance to hear if some things are hard to understand or non-intuitive. Make sure to respond
to this feedback.</p>
</div>
<div class="section" id="alpha-release">
<h2>Alpha Release<a class="headerlink" href="#alpha-release" title="Permalink to this headline"></a></h2>
<p>As mentioned, dont hold onto your world more than necessary. <em>Get it out there</em> with a huge <em>Alpha</em>
flag and let people try it! Call upon your alpha-players to try everything - they <em>will</em> find ways
to break your game in ways that you never could have imagined. In Alpha you might be best off to
flag and let people try it!</p>
<p>Call upon your alpha-players to try everything - they <em>will</em> find ways to break your game in ways that
you never could have imagined. In Alpha you might be best off to
focus on inviting friends and maybe other MUD developers, people who you can pester to give proper
feedback and bug reports (there <em>will</em> be bugs, there is no way around it). Follow the quick
instructions for <a class="reference internal" href="../../../Setup/Online-Setup.html"><span class="doc">Online Setup</span></a> to make your game visible online. If you hadnt
already, make sure to put up your game on the <a class="reference external" href="http://games.evennia.com/">Evennia game index</a> so
people know its in the works (actually, even pre-alpha games are allowed in the index so dont be
shy)!</p>
feedback and bug reports (there <em>will</em> be bugs, there is no way around it).</p>
<p>Follow the quick instructions for <a class="reference internal" href="../../../Setup/Online-Setup.html"><span class="doc">Online Setup</span></a> to make your
game visible online.</p>
<p>If you hadnt already, make sure to put up your game on the
<a class="reference external" href="http://games.evennia.com/">Evennia game index</a> so people know its in the works (actually, even
pre-alpha games are allowed in the index so dont be shy)!</p>
</div>
<div class="section" id="beta-release-perpetual-beta">
<h2>Beta Release/Perpetual Beta<a class="headerlink" href="#beta-release-perpetual-beta" title="Permalink to this headline"></a></h2>
@ -242,6 +234,11 @@ to gradually perfect your vision.</p>
<p>You are worthy of a celebration since at this point you have joined the small, exclusive crowd who
have made their dream game a reality!</p>
</div>
<div class="section" id="planning-our-tutorial-game">
<h2>Planning our tutorial game<a class="headerlink" href="#planning-our-tutorial-game" title="Permalink to this headline"></a></h2>
<p>In the next lesson well make use of these general points and try to plan out our tutorial game.</p>
<p><a class="reference internal" href="../Starting-Part2.html"><span class="doc">prev lesson</span></a> | <a class="reference internal" href="Planning-The-Tutorial-Game.html"><span class="doc">next lesson</span></a></p>
</div>
</div>
@ -266,22 +263,23 @@ have made their dream game a reality!</p>
<script>$('#searchbox').show(0);</script>
<p><h3><a href="../../../index.html">Table of Contents</a></h3>
<ul>
<li><a class="reference internal" href="#">Game Planning</a><ul>
<li><a class="reference internal" href="#planning-step-1">Planning (step 1)</a><ul>
<li><a class="reference internal" href="#">On Planning a Game</a><ul>
<li><a class="reference internal" href="#the-steps">The steps</a></li>
<li><a class="reference internal" href="#planning">Planning</a><ul>
<li><a class="reference internal" href="#administration">Administration</a></li>
<li><a class="reference internal" href="#building">Building</a></li>
<li><a class="reference internal" href="#systems">Systems</a></li>
<li><a class="reference internal" href="#rooms">Rooms</a></li>
<li><a class="reference internal" href="#objects">Objects</a></li>
<li><a class="reference internal" href="#objects-items">Objects / items</a></li>
<li><a class="reference internal" href="#characters">Characters</a></li>
</ul>
</li>
<li><a class="reference internal" href="#coding-step-2">Coding (step 2)</a><ul>
<li><a class="reference internal" href="#tech-demo-building">“Tech Demo” Building</a></li>
</ul>
</li>
<li><a class="reference internal" href="#world-building-step-3">World Building (step 3)</a></li>
<li><a class="reference internal" href="#coding-and-tech-demo">Coding and Tech demo</a></li>
<li><a class="reference internal" href="#world-building">World Building</a></li>
<li><a class="reference internal" href="#alpha-release">Alpha Release</a></li>
<li><a class="reference internal" href="#beta-release-perpetual-beta">Beta Release/Perpetual Beta</a></li>
<li><a class="reference internal" href="#congratulate-yourself">Congratulate yourself!</a></li>
<li><a class="reference internal" href="#planning-our-tutorial-game">Planning our tutorial game</a></li>
</ul>
</li>
</ul>
@ -313,7 +311,7 @@ have made their dream game a reality!</p>
<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-this"><a href="">Game Planning</a></li>
<li class="nav-item nav-item-this"><a href="">On Planning a Game</a></li>
</ul>
</div>
<div class="footer" role="contentinfo">

View file

@ -0,0 +1,341 @@
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Planning the use of some useful contribs &#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-this"><a href="">Planning the use of some useful contribs</a></li>
</ul>
</div>
<div class="document">
<div class="documentwrapper">
<div class="bodywrapper">
<div class="body" role="main">
<p><a class="reference internal" href="Planning-The-Tutorial-Game.html"><span class="doc">prev lesson</span></a> | <a class="reference internal" href="../Starting-Part3.html"><span class="doc">next lesson</span></a></p>
<div class="section" id="planning-the-use-of-some-useful-contribs">
<h1>Planning the use of some useful contribs<a class="headerlink" href="#planning-the-use-of-some-useful-contribs" title="Permalink to this headline"></a></h1>
<p>Evennia is deliberately bare-bones out of the box. The idea is that you should be as unrestricted as possible
in designing your game. This is why you can easily replace the few defaults we have and why we dont try to
prescribe any major game systems on you.</p>
<p>That said, Evennia <em>does</em> offer some more game-opinionated <em>optional</em> stuff. These are referred to as <em>Contribs</em>
and is an ever-growing treasure trove of code snippets, concepts and even full systems you can pick and choose
from to use, tweak or take inspiration from when you make your game.</p>
<p>The <a class="reference internal" href="../../../Contribs/Contrib-Overview.html"><span class="doc">Contrib overview</span></a> page gives the full list of the current roster of contributions. On
this page we will review a few contribs we will make use of for our game. We will do the actual installation
of them when we start coding in the next part of this tutorial series. While we will introduce them here, you
are wise to read their doc-strings yourself for the details.</p>
<p>This is the things we know we need:</p>
<ul class="simple">
<li><p>A barter system</p></li>
<li><p>Character generation</p></li>
<li><p>Some concept of wearing armor</p></li>
<li><p>The ability to roll dice</p></li>
<li><p>Rooms with awareness of day, night and season</p></li>
<li><p>Roleplaying with short-descs, poses and emotes</p></li>
<li><p>Quests</p></li>
<li><p>Combat (with players and against monsters)</p></li>
</ul>
<div class="section" id="barter-contrib">
<h2>Barter contrib<a class="headerlink" href="#barter-contrib" title="Permalink to this headline"></a></h2>
<p><a class="reference external" href="../../../api/evennia.contrib.barter.html">source</a></p>
<p>Reviewing this contrib suggests that it allows for safe trading between two parties. The basic principle
is that the parties puts up the stuff they want to sell and the system will guarantee that these systems are
exactly what is being offered. Both sides can modify their offers (bartering) until both mark themselves happy
with the deal. Only then the deal is sealed and the objects are exchanged automatically. Interestingly, this
works just fine for money too - just put coin objects on one side of the transaction.</p>
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span>Sue &gt; trade Tom: Hi, I have a necklace to sell; wanna trade for a healing potion?
Tom &gt; trade Sue: Hm, I could use a necklace ...
&lt;both accepted trade. Start trade&gt;
Sue &gt; offer necklace: This necklace is really worth it.
Tom &gt; evaluate necklace:
&lt;Tom sees necklace stats&gt;
Tom &gt; offer ration: I don&#39;t have a healing potion, but I&#39;ll trade you an iron ration!
Sue &gt; Hey, this is a nice necklace, I need more than a ration for it...
Tom &gt; offer ration, 10gold: Ok, a ration and 10 gold as well.
Sue &gt; accept: Ok, that sounds fair!
Tom &gt; accept: Good! Nice doing business with you.
&lt;goods change hands automatically. Trade ends&gt;
</pre></div>
</div>
<p>Arguably, in a small game you are just fine to just talk to people and use <code class="docutils literal notranslate"><span class="pre">give</span></code> to do the exchange. The
barter system guarantees trading safety if you dont trust your counterpart to try to give you the wrong thing or
to run away with your money.</p>
<p>We will use the barter contrib as an optional feature for player-player bartering. More importantly we can
add it for NPC shopkeepers and expand it with a little AI, which allows them to potentially trade in other
things than boring gold coin.</p>
</div>
<div class="section" id="character-generation-contrib">
<h2>Character generation contrib<a class="headerlink" href="#character-generation-contrib" title="Permalink to this headline"></a></h2>
<p><a class="reference external" href="../../../api/evennia.contrib.chargen.html">source</a></p>
<p>This contrib is an example module for creating characters. Since we will be using <code class="docutils literal notranslate"><span class="pre">MULTISESSION_MODE=3</span></code> we will
get a selection screen like this automatically. We also plan to use a proper menu to build our character, so
we will <em>not</em> be using this contrib.</p>
</div>
<div class="section" id="clothing-contrib">
<h2>Clothing contrib<a class="headerlink" href="#clothing-contrib" title="Permalink to this headline"></a></h2>
<p><a class="reference external" href="../../../api/evennia.contrib.clothing.html">source</a></p>
<p>This contrib provides a full system primarily aimed at wearing clothes, but it could also work for armor. You wear
an object in a particular location and this will then be reflected in your characters description. You can
also add roleplaying flavor:</p>
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="o">&gt;</span> <span class="n">wear</span> <span class="n">helmet</span> <span class="n">slightly</span> <span class="n">askew</span> <span class="n">on</span> <span class="n">her</span> <span class="n">head</span>
<span class="n">look</span> <span class="bp">self</span>
<span class="n">Username</span> <span class="ow">is</span> <span class="n">wearing</span> <span class="n">a</span> <span class="n">helmet</span> <span class="n">slightly</span> <span class="n">askew</span> <span class="n">on</span> <span class="n">her</span> <span class="n">head</span><span class="o">.</span>
</pre></div>
</div>
<p>By default there are no body locations in this contrib, we will need to expand on it a little to make it useful
for things like armor. Its a good contrib to build from though, so thats what well do.</p>
</div>
<div class="section" id="dice-contrib">
<h2>Dice contrib<a class="headerlink" href="#dice-contrib" title="Permalink to this headline"></a></h2>
<p><a class="reference external" href="../../../api/evennia.contrib.dice.html">source</a></p>
<p>The dice contrib presents a general dice roller to use in game.</p>
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="o">&gt;</span> <span class="n">roll</span> <span class="mi">2</span><span class="n">d6</span>
<span class="n">Roll</span><span class="p">(</span><span class="n">s</span><span class="p">):</span> <span class="mi">2</span> <span class="ow">and</span> <span class="mf">5.</span> <span class="n">Total</span> <span class="n">result</span> <span class="ow">is</span> <span class="mf">7.</span>
<span class="o">&gt;</span> <span class="n">roll</span> <span class="mi">1</span><span class="n">d100</span> <span class="o">+</span> <span class="mi">2</span>
<span class="n">Roll</span><span class="p">(</span><span class="n">s</span><span class="p">):</span> <span class="mf">43.</span> <span class="n">Total</span> <span class="n">result</span> <span class="ow">is</span> <span class="mi">47</span>
<span class="o">&gt;</span> <span class="n">roll</span> <span class="mi">1</span><span class="n">d20</span> <span class="o">&gt;</span> <span class="mi">12</span>
<span class="n">Roll</span><span class="p">(</span><span class="n">s</span><span class="p">):</span> <span class="mf">7.</span> <span class="n">Total</span> <span class="n">result</span> <span class="ow">is</span> <span class="mf">7.</span> <span class="n">This</span> <span class="ow">is</span> <span class="n">a</span> <span class="n">failure</span> <span class="p">(</span><span class="n">by</span> <span class="mi">5</span><span class="p">)</span>
<span class="o">&gt;</span> <span class="n">roll</span><span class="o">/</span><span class="n">hidden</span> <span class="mi">1</span><span class="n">d20</span> <span class="o">&gt;</span> <span class="mi">12</span>
<span class="n">Roll</span><span class="p">(</span><span class="n">s</span><span class="p">):</span> <span class="mf">18.</span> <span class="n">Total</span> <span class="n">result</span> <span class="ow">is</span> <span class="mf">17.</span> <span class="n">This</span> <span class="ow">is</span> <span class="n">a</span> <span class="n">success</span> <span class="p">(</span><span class="n">by</span> <span class="mi">6</span><span class="p">)</span><span class="o">.</span> <span class="p">(</span><span class="ow">not</span> <span class="n">echoed</span><span class="p">)</span>
</pre></div>
</div>
<p>The contrib also has a python function for producing these results in-code. However, while
we will emulate rolls for our rule system, well do this as simply as possible with Pythons <code class="docutils literal notranslate"><span class="pre">random</span></code>
module.</p>
<p>So while this contrib is fun to have around for GMs or for players who want to get a random result
or play a game, we will not need it for the core of our game.</p>
</div>
<div class="section" id="extended-room-contrib">
<h2>Extended room contrib<a class="headerlink" href="#extended-room-contrib" title="Permalink to this headline"></a></h2>
<p><a class="reference external" href="../../../api/evennia.contrib.extended_room.html">source</a></p>
<p>This is a custom Room typeclass that changes its description based on time of day and season.</p>
<p>For example, at night, in wintertime you could show the room as being dark and frost-covered while in daylight
at summer it could describe a flowering meadow. The description can also contain special markers, so
<code class="docutils literal notranslate"><span class="pre">&lt;morning&gt;</span> <span class="pre">...</span> <span class="pre">&lt;/morning&gt;</span></code> would include text only visible at morning.</p>
<p>The extended room also supports <em>details</em>, which are things to “look at” in the room without there having
to be a separate database object created for it. For example, a player in a church may do <code class="docutils literal notranslate"><span class="pre">look</span> <span class="pre">window</span></code> and
get a description of the windows without there needing to be an actual <code class="docutils literal notranslate"><span class="pre">window</span></code> object in the room.</p>
<p>Adding all those extra descriptions can be a lot of work, so they are optional; if not given the room works
like a normal room.</p>
<p>The contrib is simple to add and provides a lot of optional flexibility, so well add it to our
game, why not!</p>
</div>
<div class="section" id="rp-system-contrib">
<h2>RP-System contrib<a class="headerlink" href="#rp-system-contrib" title="Permalink to this headline"></a></h2>
<p><a class="reference external" href="../../../api/evennia.contrib.rpsystem.html">source</a></p>
<p>This contrib adds a full roleplaying subsystem to your game. It gives every character a “short-description”
(sdesc) that is what people will see when first meeting them. Lets say Tom has an sdesc “A tall man” and
Sue has the sdesc “A muscular, blonde woman”</p>
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="n">Tom</span> <span class="o">&gt;</span> <span class="n">look</span>
<span class="n">Tom</span><span class="p">:</span> <span class="o">&lt;</span><span class="n">room</span> <span class="n">desc</span><span class="o">&gt;</span> <span class="o">...</span> <span class="n">You</span> <span class="n">see</span><span class="p">:</span> <span class="n">A</span> <span class="n">muscular</span><span class="p">,</span> <span class="n">blonde</span> <span class="n">woman</span>
<span class="n">Tom</span> <span class="o">&gt;</span> <span class="n">emote</span> <span class="o">/</span><span class="n">me</span> <span class="n">smiles</span> <span class="n">to</span> <span class="o">/</span><span class="n">muscular</span><span class="o">.</span>
<span class="n">Tom</span><span class="p">:</span> <span class="n">Tom</span> <span class="n">smiles</span> <span class="n">to</span> <span class="n">A</span> <span class="n">muscular</span><span class="p">,</span> <span class="n">blonde</span> <span class="n">woman</span><span class="o">.</span>
<span class="n">Sue</span><span class="p">:</span> <span class="n">A</span> <span class="n">tall</span> <span class="n">man</span> <span class="n">smiles</span> <span class="n">to</span> <span class="n">Sue</span><span class="o">.</span>
<span class="n">Tom</span> <span class="o">&gt;</span> <span class="n">emote</span> <span class="n">Leaning</span> <span class="n">forward</span><span class="p">,</span> <span class="o">/</span><span class="n">me</span> <span class="n">says</span><span class="p">,</span> <span class="s2">&quot;Well hello, what&#39;s yer name?&quot;</span>
<span class="n">Tom</span><span class="p">:</span> <span class="n">Leaning</span> <span class="n">forward</span><span class="p">,</span> <span class="n">Tom</span> <span class="n">says</span><span class="p">,</span> <span class="s2">&quot;Well hello...&quot;</span>
<span class="n">Sue</span><span class="p">:</span> <span class="n">Leaning</span> <span class="n">forward</span><span class="p">,</span> <span class="n">A</span> <span class="n">tall</span> <span class="n">man</span> <span class="n">says</span><span class="p">,</span> <span class="s2">&quot;Well hello, what&#39;s yer name?&quot;</span>
<span class="n">Sue</span> <span class="o">&gt;</span> <span class="n">emote</span> <span class="o">/</span><span class="n">me</span> <span class="n">grins</span><span class="o">.</span> <span class="s2">&quot;I&#39;m Angelica&quot;</span><span class="p">,</span> <span class="n">she</span> <span class="n">says</span><span class="o">.</span>
<span class="n">Sue</span><span class="p">:</span> <span class="n">Sue</span> <span class="n">grins</span><span class="o">.</span> <span class="s2">&quot;I&#39;m Angelica&quot;</span><span class="p">,</span> <span class="n">she</span> <span class="n">says</span><span class="o">.</span>
<span class="n">Tom</span><span class="p">:</span> <span class="n">A</span> <span class="n">muscular</span><span class="p">,</span> <span class="n">blonde</span> <span class="n">woman</span> <span class="n">grins</span><span class="o">.</span> <span class="s2">&quot;I&#39;m Angelica&quot;</span><span class="p">,</span> <span class="n">she</span> <span class="n">says</span><span class="o">.</span>
<span class="n">Tom</span> <span class="o">&gt;</span> <span class="n">recog</span> <span class="n">muscular</span> <span class="n">Angelica</span>
<span class="n">Tom</span> <span class="o">&gt;</span> <span class="n">emote</span> <span class="o">/</span><span class="n">me</span> <span class="n">nods</span> <span class="n">to</span> <span class="o">/</span><span class="n">angelica</span><span class="p">:</span> <span class="s2">&quot;I have a message for you ...&quot;</span>
<span class="n">Tom</span><span class="p">:</span> <span class="n">Tom</span> <span class="n">nods</span> <span class="n">to</span> <span class="n">Angelica</span><span class="p">:</span> <span class="s2">&quot;I have a message for you ...&quot;</span>
<span class="n">Sue</span><span class="p">:</span> <span class="n">A</span> <span class="n">tall</span> <span class="n">man</span> <span class="n">nods</span> <span class="n">to</span> <span class="n">Sue</span><span class="p">:</span> <span class="s2">&quot;I have a message for you ...&quot;</span>
</pre></div>
</div>
<p>Above, Sue introduces herself as “Angelica” and Tom uses this info to <code class="docutils literal notranslate"><span class="pre">recoc</span></code> her as “Angelica” hereafter. He
could have <code class="docutils literal notranslate"><span class="pre">recoc</span></code>-ed her with whatever name he liked - its only for his own benefit. There is no separate
<code class="docutils literal notranslate"><span class="pre">say</span></code>, the spoken words are embedded in the emotes in quotes <code class="docutils literal notranslate"><span class="pre">&quot;...&quot;</span></code>.</p>
<p>The RPSystem module also includes options for <code class="docutils literal notranslate"><span class="pre">poses</span></code>, which help to establish your position in the room
when others look at you.</p>
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="n">Tom</span> <span class="o">&gt;</span> <span class="n">pose</span> <span class="n">stands</span> <span class="n">by</span> <span class="n">the</span> <span class="n">bar</span><span class="p">,</span> <span class="n">looking</span> <span class="n">bored</span><span class="o">.</span>
<span class="n">Sue</span> <span class="o">&gt;</span> <span class="n">look</span>
<span class="n">Sue</span><span class="p">:</span> <span class="o">&lt;</span><span class="n">room</span> <span class="n">desc</span><span class="o">&gt;</span> <span class="o">...</span> <span class="n">A</span> <span class="n">tall</span> <span class="n">man</span> <span class="n">stands</span> <span class="n">by</span> <span class="n">the</span> <span class="n">bar</span><span class="p">,</span> <span class="n">looking</span> <span class="n">bored</span><span class="o">.</span>
</pre></div>
</div>
<p>You can also wear a mask to hide your identity; your sdesc will then be changed to the sdesc of the mask,
like <code class="docutils literal notranslate"><span class="pre">a</span> <span class="pre">person</span> <span class="pre">with</span> <span class="pre">a</span> <span class="pre">mask</span></code>.</p>
<p>The RPSystem gives a lot of roleplaying power out of the box, so we will add it. There is also a separate
<a class="reference external" href="../../../api/evennia.contrib.rplanguage.html">rplanguage</a> module that integrates with the spoken words in your emotes and garbles them if you dont understand
the language spoken. In order to restrict the scope we will not include languages for the tutorial game.</p>
</div>
<div class="section" id="talking-npc-contrib">
<h2>Talking NPC contrib<a class="headerlink" href="#talking-npc-contrib" title="Permalink to this headline"></a></h2>
<p><a class="reference external" href="../../../api/evennia.contrib.talking_npc.html">source</a></p>
<p>This exemplifies an NPC with a menu-driven dialogue tree. We will not use this contrib explicitly, but its
good as inspiration for how well do quest-givers later.</p>
</div>
<div class="section" id="traits-contrib">
<h2>Traits contrib<a class="headerlink" href="#traits-contrib" title="Permalink to this headline"></a></h2>
<p><a class="reference external" href="../../../api/evennia.contrib.traits.html">source</a></p>
<p>An issue with dealing with roleplaying attributes like strength, dexterity, or skills like hunting, sword etc
is how to keep track of the values in the moment. Your strength may temporarily be buffed by a strength-potion.
Your swordmanship may be worse because you are encumbered. And when you drink your health potion you must make
sure that those +20 health does not bring your health higher than its maximum. All this adds complexity.</p>
<p>The <em>Traits</em> contrib consists of several types of objects to help track and manage values like this. When
installed, the traits are accessed on a new handler <code class="docutils literal notranslate"><span class="pre">.traits</span></code>, for example</p>
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="o">&gt;</span> <span class="n">py</span> <span class="bp">self</span><span class="o">.</span><span class="n">traits</span><span class="o">.</span><span class="n">hp</span><span class="o">.</span><span class="n">value</span>
<span class="mi">100</span>
<span class="o">&gt;</span> <span class="n">py</span> <span class="bp">self</span><span class="o">.</span><span class="n">traits</span><span class="o">.</span><span class="n">hp</span> <span class="o">-=</span> <span class="mi">20</span> <span class="c1"># getting hurt</span>
<span class="o">&gt;</span> <span class="n">py</span> <span class="bp">self</span><span class="o">.</span><span class="n">traits</span><span class="o">.</span><span class="n">hp</span><span class="o">.</span><span class="n">value</span>
<span class="mi">80</span>
<span class="o">&gt;</span> <span class="n">py</span> <span class="bp">self</span><span class="o">.</span><span class="n">traits</span><span class="o">.</span><span class="n">hp</span><span class="o">.</span><span class="n">reset</span><span class="p">()</span> <span class="c1"># drink a potion</span>
<span class="o">&gt;</span> <span class="n">py</span> <span class="bp">self</span><span class="o">.</span><span class="n">traits</span><span class="o">.</span><span class="n">hp</span><span class="o">.</span><span class="n">value</span>
<span class="mi">100</span>
</pre></div>
</div>
<p>A Trait is persistent (it uses an Attribute under the hood) and tracks changes, min/max and other things
automatically. They can also be added together in various mathematical operations.</p>
<p>The contrib introduces three main Trait-classes</p>
<ul class="simple">
<li><p><em>Static</em> traits for single values like str, dex, things that at most gets a modifier.</p></li>
<li><p><em>Counters</em> is a value that never moves outside a given range, even with modifiers. For example a skill
that can at most get a maximum amount of buff. Counters can also easily be <em>timed</em> so that they decrease
or increase with a certain rate per second. This could be good for a time-limited curse for example.</p></li>
<li><p><em>Gauge</em> is like a fuel-gauge; it starts at a max value and then empties gradually. This is perfect for
things like health, stamina and the like. Gauges can also change with a rate, which works well for the
effects of slow poisons and healing both.</p></li>
</ul>
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="o">&gt;</span> <span class="n">py</span> <span class="bp">self</span><span class="o">.</span><span class="n">traits</span><span class="o">.</span><span class="n">hp</span><span class="o">.</span><span class="n">value</span>
<span class="mi">100</span>
<span class="o">&gt;</span> <span class="n">py</span> <span class="bp">self</span><span class="o">.</span><span class="n">traits</span><span class="o">.</span><span class="n">hp</span><span class="o">.</span><span class="n">rate</span> <span class="o">=</span> <span class="o">-</span><span class="mi">1</span> <span class="c1"># poisoned! </span>
<span class="o">&gt;</span> <span class="n">py</span> <span class="bp">self</span><span class="o">.</span><span class="n">traits</span><span class="o">.</span><span class="n">hp</span><span class="o">.</span><span class="n">ratetarget</span> <span class="o">=</span> <span class="mi">50</span> <span class="c1"># stop at 50 hp</span>
<span class="c1"># Wait 30s</span>
<span class="o">&gt;</span> <span class="n">py</span> <span class="bp">self</span><span class="o">.</span><span class="n">traits</span><span class="o">.</span><span class="n">hp</span><span class="o">.</span><span class="n">value</span>
<span class="mi">70</span>
<span class="c1"># Wait another 30s</span>
<span class="o">&gt;</span> <span class="n">py</span> <span class="bp">self</span><span class="o">.</span><span class="n">traits</span><span class="o">.</span><span class="n">hp</span><span class="o">.</span><span class="n">value</span>
<span class="mi">50</span> <span class="c1"># stopped at 50</span>
<span class="o">&gt;</span> <span class="n">py</span> <span class="bp">self</span><span class="o">.</span><span class="n">traits</span><span class="o">.</span><span class="n">hp</span><span class="o">.</span><span class="n">rate</span> <span class="o">=</span> <span class="mi">0</span> <span class="c1"># no more poison</span>
<span class="o">&gt;</span> <span class="n">py</span> <span class="bp">self</span><span class="o">.</span><span class="n">traits</span><span class="o">.</span><span class="n">hp</span><span class="o">.</span><span class="n">rate</span> <span class="o">=</span> <span class="mi">5</span> <span class="c1"># healing magic!</span>
<span class="c1"># wait 5s </span>
<span class="o">&gt;</span> <span class="n">pyself</span><span class="o">.</span><span class="n">traits</span><span class="o">.</span><span class="n">hp</span><span class="o">.</span><span class="n">value</span>
<span class="mi">75</span>
</pre></div>
</div>
<p>Traits will be very practical to use for our character sheets.</p>
</div>
<div class="section" id="turnbattle-contrib">
<h2>Turnbattle contrib<a class="headerlink" href="#turnbattle-contrib" title="Permalink to this headline"></a></h2>
<p><a class="reference external" href="../../../api/evennia.contrib.turnbattle.html">source</a></p>
<p>This contrib consists of several implementations of a turn-based combat system, divivided into complexity:</p>
<ul class="simple">
<li><p>basic - initiative and turn order, attacks against defense values, damage.</p></li>
<li><p>equip - considers weapons and armor, wielding and weapon accuracy.</p></li>
<li><p>items - adds usable items with conditions and status effects</p></li>
<li><p>magic - adds spellcasting system using MP.</p></li>
<li><p>range - adds abstract positioning and 1D movement to differentiate between melee and ranged attacks.</p></li>
</ul>
<p>The turnbattle system is comprehensive, but its meant as a base to start from rather than offer
a complete system. Its also not built with <em>Traits</em> in mind, so we will need to adjust it for that.</p>
</div>
<div class="section" id="conclusions">
<h2>Conclusions<a class="headerlink" href="#conclusions" title="Permalink to this headline"></a></h2>
<p>With some contribs selected, we have pieces to build from and dont have to write everything from scratch.
We will need Quests and will likely need to do a bunch of work on Combat to adapt the combat contrib
to our needs.</p>
<p>We will now move into actually starting to implement our tutorial game
in the next part of this tutorial series. When doing this for yourself, remember to refer
back to your planning and adjust it as you learn what works and what does not.</p>
<p><a class="reference internal" href="Planning-The-Tutorial-Game.html"><span class="doc">prev lesson</span></a> | <a class="reference internal" href="../Starting-Part3.html"><span class="doc">next lesson</span></a></p>
</div>
</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>
<p><h3><a href="../../../index.html">Table of Contents</a></h3>
<ul>
<li><a class="reference internal" href="#">Planning the use of some useful contribs</a><ul>
<li><a class="reference internal" href="#barter-contrib">Barter contrib</a></li>
<li><a class="reference internal" href="#character-generation-contrib">Character generation contrib</a></li>
<li><a class="reference internal" href="#clothing-contrib">Clothing contrib</a></li>
<li><a class="reference internal" href="#dice-contrib">Dice contrib</a></li>
<li><a class="reference internal" href="#extended-room-contrib">Extended room contrib</a></li>
<li><a class="reference internal" href="#rp-system-contrib">RP-System contrib</a></li>
<li><a class="reference internal" href="#talking-npc-contrib">Talking NPC contrib</a></li>
<li><a class="reference internal" href="#traits-contrib">Traits contrib</a></li>
<li><a class="reference internal" href="#turnbattle-contrib">Turnbattle contrib</a></li>
<li><a class="reference internal" href="#conclusions">Conclusions</a></li>
</ul>
</li>
</ul>
<div role="note" aria-label="source link">
<!--h3>This Page</h3-->
<ul class="this-page-menu">
<li><a href="../../../_sources/Howto/Starting/Part2/Planning-Some-Useful-Contribs.md.txt"
rel="nofollow">Show Page Source</a></li>
</ul>
</div>
<h3>Versions</h3>
<ul>
<li><a href="Planning-Some-Useful-Contribs.html">1.0-dev (develop branch)</a></li>
<li><a href="../../../../0.9.1/index.html">0.9.1 (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-this"><a href="">Planning the use of some useful contribs</a></li>
</ul>
</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.1.1.
</div>
</body>
</html>

View file

@ -0,0 +1,561 @@
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Planning our tutorial game &#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-this"><a href="">Planning our tutorial game</a></li>
</ul>
</div>
<div class="document">
<div class="documentwrapper">
<div class="bodywrapper">
<div class="body" role="main">
<p><a class="reference internal" href="Game-Planning.html"><span class="doc">prev lesson</span></a> | <a class="reference internal" href="Planning-Some-Useful-Contribs.html"><span class="doc">next lesson</span></a></p>
<div class="section" id="planning-our-tutorial-game">
<h1>Planning our tutorial game<a class="headerlink" href="#planning-our-tutorial-game" title="Permalink to this headline"></a></h1>
<p>Using the general plan from last lesson well now establish what kind of game we want to create for this tutorial.
Remembering that we need to keep the scope down, lets establish some parameters. Note that for your own
game you dont <em>need</em> to agree/adopt any of these. Many game-types need more or much less than this.
But this makes for good, instructive examples.</p>
<ul class="simple">
<li><p>We want a small game we can play ourselves for fun, but which could in principle be expanded
to something more later.</p></li>
<li><p>Lets go with a fantasy theme, its well understood.</p></li>
<li><p>Well use some existing, simple RPG system.</p></li>
<li><p>We want to be able to create and customize a character of our own.</p></li>
<li><p>We want the tools to roleplay with other players.</p></li>
<li><p>We dont want to have to rely on a Game master to resolve things, but will rely on code for skill resolution
and combat.</p></li>
<li><p>We want monsters to fight and NPCs we can talk to. So some sort of AI.</p></li>
<li><p>We want to be able to buy and sell stuff.</p></li>
<li><p>We want some sort of crafting system.</p></li>
<li><p>We want some sort of quest system.</p></li>
</ul>
<p>Lets answer the questions from the previous lesson and discuss some of the possibilities.</p>
<div class="section" id="administration">
<h2>Administration<a class="headerlink" href="#administration" title="Permalink to this headline"></a></h2>
<div class="section" id="should-your-game-rules-be-enforced-by-coded-systems-by-human-game-masters">
<h3>Should your game rules be enforced by coded systems by human game masters?<a class="headerlink" href="#should-your-game-rules-be-enforced-by-coded-systems-by-human-game-masters" title="Permalink to this headline"></a></h3>
<p>Using game masters one need to add some new GM-helper commands to make their jobs easier. But overall there
is less work code-wise. GM:ing is work-intensive however, and they cant be online all the time.</p>
<p>We want our tutorial game to work without human Game masters.</p>
</div>
<div class="section" id="what-is-the-staff-hierarchy-in-your-game-is-vanilla-evennia-roles-enough-or-do-you-need-something-else">
<h3>What is the staff hierarchy in your game? Is vanilla Evennia roles enough or do you need something else?<a class="headerlink" href="#what-is-the-staff-hierarchy-in-your-game-is-vanilla-evennia-roles-enough-or-do-you-need-something-else" title="Permalink to this headline"></a></h3>
<p>The default hierarchy is</p>
<ul class="simple">
<li><p><code class="docutils literal notranslate"><span class="pre">Player</span></code> - regular players</p></li>
<li><p><code class="docutils literal notranslate"><span class="pre">Player</span> <span class="pre">Helper</span></code> - can create/edit help entries</p></li>
<li><p><code class="docutils literal notranslate"><span class="pre">Builder</span></code> - can use build commands</p></li>
<li><p><code class="docutils literal notranslate"><span class="pre">Admin</span></code> - can kick and ban accounts</p></li>
<li><p><code class="docutils literal notranslate"><span class="pre">Developer</span></code> - full access, usually also trusted with server access</p></li>
</ul>
<p>There is also the <em>superuser</em>, the “owner” of the game you create when you first set up your database. This user
goes outside the regular hierarchy and should usually only.</p>
<p>We are okay with keeping this structure for our game.</p>
</div>
<div class="section" id="should-players-be-able-to-post-out-of-characters-on-channels-and-via-other-means-like-bulletin-boards">
<h3>Should players be able to post out-of-characters on channels and via other means like bulletin-boards?<a class="headerlink" href="#should-players-be-able-to-post-out-of-characters-on-channels-and-via-other-means-like-bulletin-boards" title="Permalink to this headline"></a></h3>
<p>Evennias <em>Channels</em> are by default only available between <em>Accounts</em>. That is, for players to communicate with each
other. By default, the <code class="docutils literal notranslate"><span class="pre">public</span></code> channel is created for general discourse.
Channels are logged to a file and when you are coming back to the game you can view the history of a channel
in case you missed something.</p>
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span>&gt; public Hello world!
[Public] MyName: Hello world!
</pre></div>
</div>
<p>But Channels can also be set up to work between Characters instead of Accounts. This would mean the channels
would have an in-game meaning:</p>
<ul class="simple">
<li><p>Members of a guild could be linked telepathically.</p></li>
<li><p>Survivors of the apocalypse can communicate over walkie-talkies.</p></li>
<li><p>Radio stations you can tune into or have to discover.</p></li>
</ul>
<p><em>Bulletin boards</em> are a sort of in-game forum where posts are made publicly or privately. Contrary to a channel,
the messages are usually stored and are grouped into topics with replies. Evennia has no default bulletin-board
system.</p>
<p>In this tutorial game we will just use the default inter-account channels. We will also not be implementing any
bulletin boards.</p>
</div>
</div>
<div class="section" id="building">
<h2>Building<a class="headerlink" href="#building" title="Permalink to this headline"></a></h2>
<div class="section" id="how-will-the-world-be-built">
<h3>How will the world be built?<a class="headerlink" href="#how-will-the-world-be-built" title="Permalink to this headline"></a></h3>
<p>There are two main ways to handle this:</p>
<ul class="simple">
<li><p>Traditionally, from in-game with build-commands: This pretty means builders creating content in their game
client. This has the advantage of not requiring Python skills nor server access. This can often be a quite
intuitive way to build since you are sort-of walking around in your creation as you build it. However, the
developer (you) must make sure to provide build-commands that are flexible enough for builders to be able to
create the content you want for your game.</p></li>
<li><p>Externally (by batchcmds): Evennias <code class="docutils literal notranslate"><span class="pre">batchcmd</span></code> takes a text file with Evennia Commands and executes them
in sequence. This allows the build process to be repeated and applied quickly to a new database during development.
It also allows builders to use proper text-editing tools rather than writing things line-by-line in their clients.
The drawback is that for their changes to go live they either need server access or they need to send their
batchcode to the game administrator so they can apply the changes. Or use version control.</p></li>
<li><p>Externally (with batchcode or custom code): This is the “professional game development” approach. This gives the
builders maximum power by creating the content in Python using Evennia primitives. The <code class="docutils literal notranslate"><span class="pre">batchcode</span></code> processor
allows Evennia to apply and re-apply build-scripts that are raw Python modules. Again, this would require the
builder to have server access or to use version control to share their work with the rest of the development team.</p></li>
</ul>
<p>In this tutorial, we will show examples of all these ways, but since we dont have a team of builders well
build the brunt of things using Evennias Batchcode system.</p>
</div>
<div class="section" id="can-only-privileged-builders-create-things-or-should-regular-players-also-have-limited-build-capability">
<h3>Can only privileged Builders create things or should regular players also have limited build-capability?<a class="headerlink" href="#can-only-privileged-builders-create-things-or-should-regular-players-also-have-limited-build-capability" title="Permalink to this headline"></a></h3>
<p>In some game styles, players have the ability to create objects and even script them. While giving regular users
the ability to create objects with in-built commands is easy and safe, actual code-creation (aka <em>softcode</em> ) is
not something Evennia supports natively. Regular, untrusted users should never be allowed to execute raw Python
code (such as what you can do with the <code class="docutils literal notranslate"><span class="pre">py</span></code> command). You can
<a class="reference internal" href="../../../Concepts/Soft-Code.html"><span class="doc">read more about Evennias stance on softcode here</span></a>. If you want users to do limited scripting,
its suggested that this is accomplished by adding more powerful build-commands for them to use.</p>
<p>For our tutorial-game, we will only allow privileged builders to modify the world. The exception is crafting,
where we will allow players to to use in-game commands to create specific, prescribed objects from recipes.</p>
</div>
</div>
<div class="section" id="systems">
<h2>Systems<a class="headerlink" href="#systems" title="Permalink to this headline"></a></h2>
<div class="section" id="do-you-base-your-game-off-an-existing-rpg-system-or-make-up-your-own">
<h3>Do you base your game off an existing RPG system or make up your own?<a class="headerlink" href="#do-you-base-your-game-off-an-existing-rpg-system-or-make-up-your-own" title="Permalink to this headline"></a></h3>
<p>We will make use of <a class="reference external" href="http://www.geekguild.com/openadventure/">Open Adventure</a>, an old school RRG-system
that is available for free under the Creative Commons license. Well only use a subset of the rules from
the blue “basic” book. For the sake of keeping down the length of this tutorial we will limit what features
we will include:</p>
<ul class="simple">
<li><p>Only two archetypes (classes) - Arcanist (wizard) and Warrior, these are examples of two different play
styles.</p></li>
<li><p>Two races only (dwarves and elves), to show off how to implement races and race bonuses.</p></li>
<li><p>No extra features of the races/archetypes such as foci and special feats. While these are good for fleshing
out a character, these will work the same as other bonuses and are thus not that instructive.</p></li>
<li><p>We will add only a small number of items/weapons from the Open Adventure rulebook to show how its done.</p></li>
</ul>
</div>
<div class="section" id="what-are-the-game-mechanics-how-do-you-decide-if-an-action-succeeds-or-fails">
<h3>What are the game mechanics? How do you decide if an action succeeds or fails?<a class="headerlink" href="#what-are-the-game-mechanics-how-do-you-decide-if-an-action-succeeds-or-fails" title="Permalink to this headline"></a></h3>
<p>Open Adventures conflict resolution is based on adding a trait (such as Strength) with a random number in
order beat a target. We will emulate this in code.</p>
<p>There are no pre-set “skills”, all resolution is based on using suitable traits in different combinations.
The computer cant do this decision on-the-fly like a GM could, so we need to encode what is needed
to achieve a certain effect - this will be a set of skills. We will only make the minimum amount of skills
needed to accomplish the actions we want to support. This will mean custom Commands.</p>
</div>
<div class="section" id="does-the-flow-of-time-matter-in-your-game-does-night-and-day-change-what-about-seasons">
<h3>Does the flow of time matter in your game - does night and day change? What about seasons?<a class="headerlink" href="#does-the-flow-of-time-matter-in-your-game-does-night-and-day-change-what-about-seasons" title="Permalink to this headline"></a></h3>
<p>Most commonly, game-time runs faster than real-world time. There are
a few advantages with this:</p>
<ul class="simple">
<li><p>Unlike in a single-player game, you cant fast-forward time in a multiplayer game if you are waiting for
something, like NPC shops opening.</p></li>
<li><p>Healing and other things that we know takes time will go faster while still being reasonably realistic.</p></li>
</ul>
<p>The main drawback is for games with slower roleplay pace. While you are having a thoughtful roleplaying scene
over dinner, the game world reports that two days have passed. Having a slower game time than real-time is
a less common, but possible solution for such games.</p>
<p>It is however <em>not</em> recommended to let game-time exactly equal the speed of real time. The reason for this
is that people will join your game from all around the world, and they will often only be able to play at
particular times of their day. With a game-time drifting relative real-time, everyone will eventually be
able to experience both day and night in the game.</p>
<p>For this tutorial-game we will go with Evennias default, which is that the game-time runs two times faster
than real time.</p>
</div>
<div class="section" id="do-you-want-changing-global-weather-or-should-weather-just-be-set-manually-in-roleplay">
<h3>Do you want changing, global weather or should weather just be set manually in roleplay?<a class="headerlink" href="#do-you-want-changing-global-weather-or-should-weather-just-be-set-manually-in-roleplay" title="Permalink to this headline"></a></h3>
<p>A weather system is a good example of a game-global system that affects a subset of game entities
(outdoor rooms). We will not be doing any advanced weather simulation, but well show how to do
random weather changes happening across the game world.</p>
</div>
<div class="section" id="do-you-want-a-coded-world-economy-or-just-a-simple-barter-system-or-no-formal-economy-at-all">
<h3>Do you want a coded world-economy or just a simple barter system? Or no formal economy at all?<a class="headerlink" href="#do-you-want-a-coded-world-economy-or-just-a-simple-barter-system-or-no-formal-economy-at-all" title="Permalink to this headline"></a></h3>
<p>We will allow for money and barter/trade between NPCs/Players and Player/Player, but will not care about
inflation. A real economic simulation could do things like modify shop prices based on supply and demand.
We will not go down that rabbit hole.</p>
</div>
<div class="section" id="do-you-have-concepts-like-reputation-and-influence">
<h3>Do you have concepts like reputation and influence?<a class="headerlink" href="#do-you-have-concepts-like-reputation-and-influence" title="Permalink to this headline"></a></h3>
<p>These are useful things for a more social-interaction heavy game. We will not include them for this
tutorial however.</p>
</div>
<div class="section" id="will-your-characters-be-known-by-their-name-or-only-by-their-physical-appearance">
<h3>Will your characters be known by their name or only by their physical appearance?<a class="headerlink" href="#will-your-characters-be-known-by-their-name-or-only-by-their-physical-appearance" title="Permalink to this headline"></a></h3>
<p>This is a common thing in RP-heavy games. Others will only see you as “The tall woman” until you
introduce yourself and they recognize you with a name. Linked to this is the concept of more complex
emoting and posing.</p>
<p>Adding such a system from scratch is complex and way beyond the scope of this tutorial. However,
there is an existing Evennia contrib that adds all of this functionality and more, so we will
include that and explain briefly how it works.</p>
</div>
</div>
<div class="section" id="rooms">
<h2>Rooms<a class="headerlink" href="#rooms" title="Permalink to this headline"></a></h2>
<div class="section" id="is-a-simple-room-description-enough-or-should-the-description-be-able-to-change">
<h3>Is a simple room description enough or should the description be able to change?<a class="headerlink" href="#is-a-simple-room-description-enough-or-should-the-description-be-able-to-change" title="Permalink to this headline"></a></h3>
<p>Changing room descriptions for day and night, winder and summer is actually quite easy to do, but looks
very impressive. We happen to know there is also a contrib that helps with this, so well show how to
include that.</p>
</div>
<div class="section" id="should-the-room-have-different-statuses">
<h3>Should the room have different statuses?<a class="headerlink" href="#should-the-room-have-different-statuses" title="Permalink to this headline"></a></h3>
<p>We will have different weather in outdoor rooms, but this will not have any gameplay effect - bow strings
will not get wet and fireballs will not fizzle if it rains.</p>
</div>
<div class="section" id="can-objects-be-hidden-in-the-room-can-a-person-hide-in-the-room">
<h3>Can objects be hidden in the room? Can a person hide in the room?<a class="headerlink" href="#can-objects-be-hidden-in-the-room-can-a-person-hide-in-the-room" title="Permalink to this headline"></a></h3>
<p>We will not model hiding and stealth. This will be a game of honorable face-to-face conflict.</p>
</div>
</div>
<div class="section" id="objects">
<h2>Objects<a class="headerlink" href="#objects" title="Permalink to this headline"></a></h2>
<div class="section" id="how-numerous-are-your-objects-do-you-want-large-loot-lists-or-are-objects-just-role-playing-props">
<h3>How numerous are your objects? Do you want large loot-lists or are objects just role playing props?<a class="headerlink" href="#how-numerous-are-your-objects-do-you-want-large-loot-lists-or-are-objects-just-role-playing-props" title="Permalink to this headline"></a></h3>
<p>Since we are not going for a pure freeform RPG here, we will want objects with properties, like weapons
and potions and such. Monsters should drop loot even though our list of objects will not be huge.</p>
</div>
<div class="section" id="is-each-coin-a-separate-object-or-do-you-just-store-a-bank-account-value">
<h3>Is each coin a separate object or do you just store a bank account value?<a class="headerlink" href="#is-each-coin-a-separate-object-or-do-you-just-store-a-bank-account-value" title="Permalink to this headline"></a></h3>
<p>Since we will use bartering, placing coin objects on one side of the barter makes for a simple way to
handle payments. So we will use coins as-objects.</p>
</div>
<div class="section" id="do-multiple-similar-objects-form-stacks-and-how-are-those-stacks-handled-in-that-case">
<h3>Do multiple similar objects form stacks and how are those stacks handled in that case?<a class="headerlink" href="#do-multiple-similar-objects-form-stacks-and-how-are-those-stacks-handled-in-that-case" title="Permalink to this headline"></a></h3>
<p>Since well use coins, its practical to have them and other items stack together. While Evennia does not
do this natively, we will make use of a contrib for this.</p>
</div>
<div class="section" id="does-an-object-have-weight-or-volume-so-you-cannot-carry-an-infinite-amount-of-them">
<h3>Does an object have weight or volume (so you cannot carry an infinite amount of them)?<a class="headerlink" href="#does-an-object-have-weight-or-volume-so-you-cannot-carry-an-infinite-amount-of-them" title="Permalink to this headline"></a></h3>
<p>Limiting carrying weight is one way to stop players from hoarding. It also makes it more important
for players to pick only the equipment they need. Carrying limits can easily come across as
annoying to players though, so one needs to be careful with it.</p>
<p>Open Adventure rules include weight limits, so we will include them.</p>
</div>
<div class="section" id="can-objects-be-broken-can-they-be-repaired">
<h3>Can objects be broken? Can they be repaired?<a class="headerlink" href="#can-objects-be-broken-can-they-be-repaired" title="Permalink to this headline"></a></h3>
<p>Item breakage is very useful for a game economy; breaking weapons adds tactical considerations (if its not
too common, then it becomes annoying) and repairing things gives work for crafting players.</p>
<p>We wanted a crafting system, so this is what we will limit it to - repairing items using some sort
of raw materials.</p>
</div>
<div class="section" id="can-you-fight-with-a-chair-or-a-flower-or-must-you-use-a-special-weapon-kind-of-thing">
<h3>Can you fight with a chair or a flower or must you use a special weapon kind of thing?<a class="headerlink" href="#can-you-fight-with-a-chair-or-a-flower-or-must-you-use-a-special-weapon-kind-of-thing" title="Permalink to this headline"></a></h3>
<p>Traditionally, only weapons could be used to fight with. In the past this was a useful
simplification, but with Python classes and inheritance, its not actually more work to just
let all items in game work as a weapon in a pinch.</p>
<p>So for our game we will let a character use any item they want as a weapon. The difference will
be that non-weapon items will do less damage and also break and become unusable much quicker.</p>
</div>
<div class="section" id="will-characters-be-able-to-craft-new-objects">
<h3>Will characters be able to craft new objects?<a class="headerlink" href="#will-characters-be-able-to-craft-new-objects" title="Permalink to this headline"></a></h3>
<p>Crafting is a common feature in multiplayer games. In code it usually means using a skill-check
to combine base ingredients from a fixed recipe in order to create a new item. The classic
example is to combine <em>leather straps</em>, a <em>hilt</em>, a <em>pommel</em> and a <em>blade</em> to make a new <em>sword</em>.
A full-fledged crafting system could require multiple levels of crafting, including having to mine
for ore or cut down trees for wood.</p>
<p>In our case we will limit our crafting to repairing broken items. To show how its done, we will require
extra items (a recipe) in order to facilitate the repairs.</p>
</div>
<div class="section" id="should-mobs-npcs-have-some-sort-of-ai">
<h3>Should mobs/NPCs have some sort of AI?<a class="headerlink" href="#should-mobs-npcs-have-some-sort-of-ai" title="Permalink to this headline"></a></h3>
<p>A rule of adding Artificial Intelligence is that with todays technology you should not hope to fool
anyone with it anytime soon. Unless you have a side-gig as an AI researcher, users will likely
not notice any practical difference between a simple state-machine and you spending a lot of time learning
how to train a neural net.</p>
<p>For this tutorial, we will show how to add a simple state-machine for monsters. NPCs will only be
shop-keepers and quest-gives so they wont need any real AI to speak of.</p>
</div>
<div class="section" id="are-npcs-and-mobs-different-entities-how-do-they-differ">
<h3>Are NPCs and mobs different entities? How do they differ?<a class="headerlink" href="#are-npcs-and-mobs-different-entities-how-do-they-differ" title="Permalink to this headline"></a></h3>
<p>“Mobs” or “mobiles” are things that move around. This is traditionally monsters you can fight with, but could
also be city guards or the baker going to chat with the neighbor. Back in the day, they were often fundamentally
different these days its often easier to just make NPCs and mobs essentially the same thing.</p>
<p>In our tutorial game, Both Monsters and NPCs will be the same type of thing; A monster could give you a quest
and an NPC might fight you as a mob as well as trade with you.</p>
</div>
<div class="section" id="should-there-be-npcs-giving-quests-if-so-how-do-you-track-quest-status">
<h3>_Should there be NPCs giving quests? If so, how do you track Quest status?<a class="headerlink" href="#should-there-be-npcs-giving-quests-if-so-how-do-you-track-quest-status" title="Permalink to this headline"></a></h3>
<p>We will design a simple quest system to track the status of ongoing quests.</p>
</div>
</div>
<div class="section" id="characters">
<h2>Characters<a class="headerlink" href="#characters" title="Permalink to this headline"></a></h2>
<div class="section" id="can-players-have-more-than-one-character-active-at-a-time-or-are-they-allowed-to-multi-play">
<h3>Can players have more than one Character active at a time or are they allowed to multi-play?<a class="headerlink" href="#can-players-have-more-than-one-character-active-at-a-time-or-are-they-allowed-to-multi-play" title="Permalink to this headline"></a></h3>
<p>Since Evennia differentiates between <code class="docutils literal notranslate"><span class="pre">Sessions</span></code> (the client-connection to the game), <code class="docutils literal notranslate"><span class="pre">Accounts</span></code>
and <code class="docutils literal notranslate"><span class="pre">Character</span></code>s, it natively supports multi-play. This is controlled by the <code class="docutils literal notranslate"><span class="pre">MULTISESSION_MODE</span></code>
setting, which has a value from <code class="docutils literal notranslate"><span class="pre">0</span></code> (default) to <code class="docutils literal notranslate"><span class="pre">3</span></code>.</p>
<ul class="simple">
<li><p><code class="docutils literal notranslate"><span class="pre">0</span></code>- One Character per Account and one Session per Account. This means that if you login to the same
account from another client youll be disconnected from the first. When creating a new account, a Character
will be auto-created with the same name as your Account. This is default mode and mimics legacy code bases
which had no separation between Account and Character.</p></li>
<li><p><code class="docutils literal notranslate"><span class="pre">1</span></code> - One Character per Account, multiple Sessions per Account. So you can connect simultaneously from
multiple clients and see the same output in all of them.</p></li>
<li><p><code class="docutils literal notranslate"><span class="pre">2</span></code> - Multiple Characters per Account, one Session per Character. This will not auto-create a same-named
Character for you, instead you get to create/choose between a number of Characters up to a max limit given by
the <code class="docutils literal notranslate"><span class="pre">MAX_NR_CHARACTERS</span></code> setting (default 1). You can play them all simultaneously if you have multiple clients
open, but only one client per Character.</p></li>
<li><p><code class="docutils literal notranslate"><span class="pre">3</span></code> - Multiple Characters per Account, Multiple Sessions per Character. This is like mode 2, except players
can control each Character from multiple clients, seeing the same output from each Character.</p></li>
</ul>
<p>We will go with a multi-role game, so we will use <code class="docutils literal notranslate"><span class="pre">MULTISESSION_MODE=3</span></code> for this tutorial.</p>
</div>
<div class="section" id="how-does-the-character-generation-work">
<h3>How does the character-generation work?<a class="headerlink" href="#how-does-the-character-generation-work" title="Permalink to this headline"></a></h3>
<p>There are a few common ways to do character generation:</p>
<ul class="simple">
<li><p>Rooms. This is the traditional way. Each rooms description tells you what command to use to modify
your character. When you are done you move to the next room. Only use this if you have another reason for
using a room, like having a training dummy to test skills on, for example.</p></li>
<li><p>A Menu. The Evennia <em>EvMenu</em> system allows you to code very flexible in-game menus without needing to walk
between rooms. You can both have a step-by-step menu (a wizard) or allow the user to jump between the
steps as they please. This tends to be a lot easier for newcomers to understand since it doesnt require
using custom commands they will likely never use again after this.</p></li>
<li><p>Questions. A fun way to build a character is to answer a series of questions. This is usually implemented
with a sequential menu.</p></li>
</ul>
<p>For the tutorial we will use a menu to let the user modify each section of their character sheet in any order
until they are happy.</p>
</div>
<div class="section" id="how-do-you-implement-different-classes-or-races">
<h3>How do you implement different “classes” or “races”?<a class="headerlink" href="#how-do-you-implement-different-classes-or-races" title="Permalink to this headline"></a></h3>
<p>The way classes and races work in most RPGs (as well as in OpenAdventure) is that they act as static templates
that inform which bonuses and special abilities you have. This means that all we need to store on the
Character is <em>which</em> class and <em>which</em> race they have; the actual logic can sit in Python code and just
be looked up when we need it.</p>
</div>
<div class="section" id="if-a-character-can-hide-in-a-room-what-skill-will-decide-if-they-are-detected">
<h3>If a Character can hide in a room, what skill will decide if they are detected?<a class="headerlink" href="#if-a-character-can-hide-in-a-room-what-skill-will-decide-if-they-are-detected" title="Permalink to this headline"></a></h3>
<p>Hiding means a few things.</p>
<ul class="simple">
<li><p>The Character should not appear in the rooms description / character list</p></li>
<li><p>Others hould not be able to interact with a hidden character. Itd be weird if you could do <code class="docutils literal notranslate"><span class="pre">attack</span> <span class="pre">&lt;name&gt;</span></code>
or <code class="docutils literal notranslate"><span class="pre">look</span> <span class="pre">&lt;name&gt;</span></code> if the named character is in hiding.</p></li>
<li><p>There must be a way for the person to come out of hiding, and probably for others to search or accidentally
find the person (probably based on skill checks).</p></li>
<li><p>The room will also need to be involved, maybe with some modifier as to how easy it is to hide in the room.</p></li>
</ul>
<p>We will <em>not</em> be including a hide-mechanic in our tutorial game though.</p>
</div>
<div class="section" id="what-does-the-skill-tree-look-like-can-a-character-gain-experience-to-improve-by-killing-enemies-solving-quests-by-roleplaying">
<h3>What does the skill tree look like? Can a Character gain experience to improve? By killing enemies? Solving quests? By roleplaying?<a class="headerlink" href="#what-does-the-skill-tree-look-like-can-a-character-gain-experience-to-improve-by-killing-enemies-solving-quests-by-roleplaying" title="Permalink to this headline"></a></h3>
<p>Gaining experience points (XP) and improving ones character is a staple of roleplaying games. There are many
ways to implement this:</p>
<ul class="simple">
<li><p>Gaining XP from kills is very common; its easy to let a monster be worth a certain number of XP and its
easy to tell when you should gain it.</p></li>
<li><p>Gaining XP from quests is the same - each quest is worth XP and you get them when completing the test.</p></li>
<li><p>Gaining XP from roleplay is harder to define. Different games have tried a lot of different ways to do this:</p>
<ul>
<li><p>XP from being online - just being online gains you XP. This inflates player numbers but many players may
just be lurking and not be actually playing the game at any given time.</p></li>
<li><p>XP from roleplaying scenes - you gain XP according to some algorithm analyzing your emotes for quality,
how often you post, how long your emotes are etc.</p></li>
<li><p>XP from actions - you gain XP when doing things, anything. Maybe your XP is even specific to each action, so
you gain XP only for running when you run, XP for your axe skill when you fight with an axe etc.</p></li>
<li><p>XP from fails - you only gain XP when failing rolls.</p></li>
<li><p>XP from other players - other players can award you XP for good RP.</p></li>
</ul>
</li>
</ul>
<p>For our tutorial game we will use Open Adventures rules for XP, which will be driven by kills and quest successes.</p>
</div>
<div class="section" id="may-player-characters-attack-each-other-pvp">
<h3>May player-characters attack each other (PvP)?<a class="headerlink" href="#may-player-characters-attack-each-other-pvp" title="Permalink to this headline"></a></h3>
<p>Deciding this affects the style of your entire game. PvP makes for exciting gameplay but it opens a whole new
can of worms when it comes to “fairness”. Players will usually accept dying to an overpowered NPC dragon. They
will not be as accepting if they perceive another player is perceived as being overpowered. PvP means that you
have to be very careful to balance the game - all characters does not have to be exactly equal but they should
all be viable to play a fun game with. PvP does not only mean combat though. Players can compete in all sorts of ways, including gaining influence in
a political game or gaining market share when selling their crafted merchandise.</p>
<p>For the tutorial game we will support both Player-vs-environment combat and turn-based PvP. We will allow players
to barter with each other (so potentially scam others?) but thats the extent of it. We will focus on showing
off techniques and will not focus on making a balanced game.</p>
</div>
<div class="section" id="what-are-the-penalties-of-defeat-permanent-death-quick-respawn-time-in-prison">
<h3>What are the penalties of defeat? Permanent death? Quick respawn? Time in prison?<a class="headerlink" href="#what-are-the-penalties-of-defeat-permanent-death-quick-respawn-time-in-prison" title="Permalink to this headline"></a></h3>
<p>This is another big decision that strongly affects the mood and style of your game.</p>
<p>Perma-death means that once your character dies, its gone and you have to make a new one.</p>
<ul class="simple">
<li><p>It allows for true heroism. If you genuinely risk losing your character of two years to fight the dragon,
your triumph is an actual feat.</p></li>
<li><p>It limits the old-timer dominance problem. If long-time players dies occationally, it will open things
up for newcomers.</p></li>
<li><p>It lowers inflation, since the hoarded resources of a dead character can be removed.</p></li>
<li><p>It gives capital punishment genuine discouraging power.</p></li>
<li><p>Its realistic.</p></li>
</ul>
<p>Perma-death comes with some severe disadvantages however.</p>
<ul class="simple">
<li><p>Its impopular. Many players will just not play a game where they risk losing their beloved character
just like that.</p></li>
<li><p>Many players say they like the <em>idea</em> of permadeath except when it could happen to them.</p></li>
<li><p>It can limit roleplaying freedom and make people refuse to take any risks.</p></li>
<li><p>It may make players even more reluctant to play conflict-driving bad guys.</p></li>
<li><p>Game balance is much, much more important when results are “final”. This escalates the severity of unfairness
a hundred-fold. Things like bugs or exploits can also lead to much more server effects.</p></li>
</ul>
<p>For these reasons, its very common to do hybrid systems. Some tried variations:</p>
<ul class="simple">
<li><p>NPCs cannot kill you, only other players can.</p></li>
<li><p>Death is permanent, but its difficult to actually die - you are much more likely to end up being severely
hurt/incapacitated.</p></li>
<li><p>You can pre-pay insurance to magically/technologically avoid actually dying. Only if dont have insurance will
you die permanently.</p></li>
<li><p>Death just means harsh penalties, not actual death.</p></li>
<li><p>When you die you can fight your way back to life from some sort of afterlife.</p></li>
<li><p>Youll only die permanently if you as a player explicitly allows it.</p></li>
</ul>
<p>For our tutorial-game we will not be messing with perma-death; instead your defeat will mean you will re-spawn
back at your home location with a fraction of your health.</p>
</div>
</div>
<div class="section" id="conclusions">
<h2>Conclusions<a class="headerlink" href="#conclusions" title="Permalink to this headline"></a></h2>
<p>Going through the questions has helped us get a little bit more of a feel for the game we want to do. There are
many other things we could ask ourselves, but if we can cover these points we will be a good way towards a complete,
playable game!</p>
<p>Before starting to code in earnest a good coder should always do an inventory of all the stuff they <em>dont</em> need
to code themselves. So in the next lesson we will check out what help we have from Evennias <em>contribs</em>.</p>
<p><a class="reference internal" href="Game-Planning.html"><span class="doc">prev lesson</span></a> | <a class="reference internal" href="Planning-Some-Useful-Contribs.html"><span class="doc">next lesson</span></a></p>
</div>
</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>
<p><h3><a href="../../../index.html">Table of Contents</a></h3>
<ul>
<li><a class="reference internal" href="#">Planning our tutorial game</a><ul>
<li><a class="reference internal" href="#administration">Administration</a><ul>
<li><a class="reference internal" href="#should-your-game-rules-be-enforced-by-coded-systems-by-human-game-masters">Should your game rules be enforced by coded systems by human game masters?</a></li>
<li><a class="reference internal" href="#what-is-the-staff-hierarchy-in-your-game-is-vanilla-evennia-roles-enough-or-do-you-need-something-else">What is the staff hierarchy in your game? Is vanilla Evennia roles enough or do you need something else?</a></li>
<li><a class="reference internal" href="#should-players-be-able-to-post-out-of-characters-on-channels-and-via-other-means-like-bulletin-boards">Should players be able to post out-of-characters on channels and via other means like bulletin-boards?</a></li>
</ul>
</li>
<li><a class="reference internal" href="#building">Building</a><ul>
<li><a class="reference internal" href="#how-will-the-world-be-built">How will the world be built?</a></li>
<li><a class="reference internal" href="#can-only-privileged-builders-create-things-or-should-regular-players-also-have-limited-build-capability">Can only privileged Builders create things or should regular players also have limited build-capability?</a></li>
</ul>
</li>
<li><a class="reference internal" href="#systems">Systems</a><ul>
<li><a class="reference internal" href="#do-you-base-your-game-off-an-existing-rpg-system-or-make-up-your-own">Do you base your game off an existing RPG system or make up your own?</a></li>
<li><a class="reference internal" href="#what-are-the-game-mechanics-how-do-you-decide-if-an-action-succeeds-or-fails">What are the game mechanics? How do you decide if an action succeeds or fails?</a></li>
<li><a class="reference internal" href="#does-the-flow-of-time-matter-in-your-game-does-night-and-day-change-what-about-seasons">Does the flow of time matter in your game - does night and day change? What about seasons?</a></li>
<li><a class="reference internal" href="#do-you-want-changing-global-weather-or-should-weather-just-be-set-manually-in-roleplay">Do you want changing, global weather or should weather just be set manually in roleplay?</a></li>
<li><a class="reference internal" href="#do-you-want-a-coded-world-economy-or-just-a-simple-barter-system-or-no-formal-economy-at-all">Do you want a coded world-economy or just a simple barter system? Or no formal economy at all?</a></li>
<li><a class="reference internal" href="#do-you-have-concepts-like-reputation-and-influence">Do you have concepts like reputation and influence?</a></li>
<li><a class="reference internal" href="#will-your-characters-be-known-by-their-name-or-only-by-their-physical-appearance">Will your characters be known by their name or only by their physical appearance?</a></li>
</ul>
</li>
<li><a class="reference internal" href="#rooms">Rooms</a><ul>
<li><a class="reference internal" href="#is-a-simple-room-description-enough-or-should-the-description-be-able-to-change">Is a simple room description enough or should the description be able to change?</a></li>
<li><a class="reference internal" href="#should-the-room-have-different-statuses">Should the room have different statuses?</a></li>
<li><a class="reference internal" href="#can-objects-be-hidden-in-the-room-can-a-person-hide-in-the-room">Can objects be hidden in the room? Can a person hide in the room?</a></li>
</ul>
</li>
<li><a class="reference internal" href="#objects">Objects</a><ul>
<li><a class="reference internal" href="#how-numerous-are-your-objects-do-you-want-large-loot-lists-or-are-objects-just-role-playing-props">How numerous are your objects? Do you want large loot-lists or are objects just role playing props?</a></li>
<li><a class="reference internal" href="#is-each-coin-a-separate-object-or-do-you-just-store-a-bank-account-value">Is each coin a separate object or do you just store a bank account value?</a></li>
<li><a class="reference internal" href="#do-multiple-similar-objects-form-stacks-and-how-are-those-stacks-handled-in-that-case">Do multiple similar objects form stacks and how are those stacks handled in that case?</a></li>
<li><a class="reference internal" href="#does-an-object-have-weight-or-volume-so-you-cannot-carry-an-infinite-amount-of-them">Does an object have weight or volume (so you cannot carry an infinite amount of them)?</a></li>
<li><a class="reference internal" href="#can-objects-be-broken-can-they-be-repaired">Can objects be broken? Can they be repaired?</a></li>
<li><a class="reference internal" href="#can-you-fight-with-a-chair-or-a-flower-or-must-you-use-a-special-weapon-kind-of-thing">Can you fight with a chair or a flower or must you use a special weapon kind of thing?</a></li>
<li><a class="reference internal" href="#will-characters-be-able-to-craft-new-objects">Will characters be able to craft new objects?</a></li>
<li><a class="reference internal" href="#should-mobs-npcs-have-some-sort-of-ai">Should mobs/NPCs have some sort of AI?</a></li>
<li><a class="reference internal" href="#are-npcs-and-mobs-different-entities-how-do-they-differ">Are NPCs and mobs different entities? How do they differ?</a></li>
<li><a class="reference internal" href="#should-there-be-npcs-giving-quests-if-so-how-do-you-track-quest-status">_Should there be NPCs giving quests? If so, how do you track Quest status?</a></li>
</ul>
</li>
<li><a class="reference internal" href="#characters">Characters</a><ul>
<li><a class="reference internal" href="#can-players-have-more-than-one-character-active-at-a-time-or-are-they-allowed-to-multi-play">Can players have more than one Character active at a time or are they allowed to multi-play?</a></li>
<li><a class="reference internal" href="#how-does-the-character-generation-work">How does the character-generation work?</a></li>
<li><a class="reference internal" href="#how-do-you-implement-different-classes-or-races">How do you implement different “classes” or “races”?</a></li>
<li><a class="reference internal" href="#if-a-character-can-hide-in-a-room-what-skill-will-decide-if-they-are-detected">If a Character can hide in a room, what skill will decide if they are detected?</a></li>
<li><a class="reference internal" href="#what-does-the-skill-tree-look-like-can-a-character-gain-experience-to-improve-by-killing-enemies-solving-quests-by-roleplaying">What does the skill tree look like? Can a Character gain experience to improve? By killing enemies? Solving quests? By roleplaying?</a></li>
<li><a class="reference internal" href="#may-player-characters-attack-each-other-pvp">May player-characters attack each other (PvP)?</a></li>
<li><a class="reference internal" href="#what-are-the-penalties-of-defeat-permanent-death-quick-respawn-time-in-prison">What are the penalties of defeat? Permanent death? Quick respawn? Time in prison?</a></li>
</ul>
</li>
<li><a class="reference internal" href="#conclusions">Conclusions</a></li>
</ul>
</li>
</ul>
<div role="note" aria-label="source link">
<!--h3>This Page</h3-->
<ul class="this-page-menu">
<li><a href="../../../_sources/Howto/Starting/Part2/Planning-The-Tutorial-Game.md.txt"
rel="nofollow">Show Page Source</a></li>
</ul>
</div>
<h3>Versions</h3>
<ul>
<li><a href="Planning-The-Tutorial-Game.html">1.0-dev (develop branch)</a></li>
<li><a href="../../../../0.9.1/index.html">0.9.1 (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-this"><a href="">Planning our tutorial game</a></li>
</ul>
</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.1.1.
</div>
</body>
</html>

View file

@ -1,99 +0,0 @@
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Some useful contribs &#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-this"><a href="">Some useful contribs</a></li>
</ul>
</div>
<div class="document">
<div class="documentwrapper">
<div class="bodywrapper">
<div class="body" role="main">
<div class="section" id="some-useful-contribs">
<h1>Some useful contribs<a class="headerlink" href="#some-useful-contribs" title="Permalink to this headline"></a></h1>
<p>TODO</p>
</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>
<div role="note" aria-label="source link">
<!--h3>This Page</h3-->
<ul class="this-page-menu">
<li><a href="../../../_sources/Howto/Starting/Part2/Some-Useful-Contribs.md.txt"
rel="nofollow">Show Page Source</a></li>
</ul>
</div>
<h3>Versions</h3>
<ul>
<li><a href="Some-Useful-Contribs.html">1.0-dev (develop branch)</a></li>
<li><a href="../../../../0.9.1/index.html">0.9.1 (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-this"><a href="">Some useful contribs</a></li>
</ul>
</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.1.1.
</div>
</body>
</html>

File diff suppressed because it is too large Load diff

View file

@ -58,9 +58,7 @@
<ol class="simple">
<li><p>Introduction &amp; Overview (you are here)</p></li>
<li><p><a class="reference internal" href="Part2/Game-Planning.html"><span class="doc">On planning a game</span></a></p></li>
<li><p><a class="reference internal" href="../../Unimplemented.html"><span class="doc">Multisession modes</span></a></p></li>
<li><p><a class="reference internal" href="../../Unimplemented.html"><span class="doc">Layout of our tutorial game</span></a></p></li>
<li><p><a class="reference internal" href="Part2/Some-Useful-Contribs.html"><span class="doc">Some useful Contribs</span></a></p></li>
<li><p><a class="reference internal" href="Part2/Planning-Some-Useful-Contribs.html"><span class="doc">Planning to use some useful Contribs</span></a></p></li>
</ol>
<p>In Part two of the Starting tutorial well step back and plan out the kind of tutorial
game we want to make. In the process well go through the common questions of “where to start”

View file

@ -38,48 +38,126 @@
<div class="section" id="client-support-grid">
<h1>Client Support Grid<a class="headerlink" href="#client-support-grid" title="Permalink to this headline"></a></h1>
<p>This grid tries to gather Evennia-specific knowledge about the various clients and protocols used.
Everyones welcome to report their findings.</p>
<p>This grid tries to gather info about different MU clients when used with Evennia.
If you want to report a problem, update an entry or add a client, make a
new <a class="reference external" href="https://github.com/evennia/evennia/issues/new/choose">documentation issue</a> for it. Everyones encouraged to report their findings.</p>
<div class="section" id="legend">
<h2>Legend:<a class="headerlink" href="#legend" title="Permalink to this headline"></a></h2>
<ul class="simple">
<li><p><strong>Name</strong>: The name of the client. If its only available for a specific OS, it should be noted
here too.</p></li>
<li><p><strong>Name</strong>: The name of the client. Also note if its OS-specific.</p></li>
<li><p><strong>Version</strong>: Which version or range of client versions were tested.</p></li>
<li><p><strong>Comments</strong>: Any comments or quirks on using this client with Evennia should be added here. Also
note if some other protocol than Telnet is used (like Websockets, SSH etc).</p></li>
<li><p><strong>Comments</strong>: Any quirks on using this client with Evennia should be added here.</p></li>
</ul>
</div>
<div class="section" id="client-grid">
<h2>Client Grid<a class="headerlink" href="#client-grid" title="Permalink to this headline"></a></h2>
<p>Name | Version | Comments
:———-:————
<a class="reference external" href="https://github.com/evennia/evennia/wiki/Web%20features#web-client">Evennia webclient</a> | 0.6 | Uses WS/AJAX. <a class="reference external" href="https://github.com/evennia/evennia/issues?utf8=%E2%9C%93&amp;q=client+status%3Dopen+%5D">Current client issues</a>
<a class="reference external" href="http://tintin.sourceforge.net/">tintin++</a> | 2.0+ | No MXP support
<a class="reference external" href="http://tinyfugue.sourceforge.net/">tinyfugue</a> | 5.0+ | No UTF-8 support
<a class="reference external" href="http://mushclient.com/">MUSHclient</a> (Win) | 4.94 | NAWS reports full text area
<a class="reference external" href="http://forums.zuggsoft.com/index.php?page=4&amp;action=file&amp;file_id=65">Zmud</a> (Win) | 7.21 | <em>UNTESTED</em><br /><a class="reference external" href="http://forums.zuggsoft.com/index.php?page=4&amp;action=category&amp;cat_id=11">Cmud</a> (Win) | v3 | <em>UNTESTED</em><br /><a class="reference external" href="http://www.potatomushclient.com/">Potato</a> | 2.0.0b16 | No MXP, MCCP support. Win 32bit does not understand
“localhost”, must use <code class="docutils literal notranslate"><span class="pre">127.0.0.1</span></code>. <a class="reference external" href="https://github.com/evennia/evennia/issues/1131">Newline issue</a>.
*Wont send a single blank line on Enter press.
<a class="reference external" href="http://www.mudlet.org/">Mudlet</a> | 3.4+ | No known issues. Some older versions showed &lt;&gt; as html under MXP.
<a class="reference external" href="https://archive.org/details/tucows_196173_SimpleMU_MU_Client">SimpleMU</a> (Win) | full | <em>UNTESTED</em>. Discontinued. NAWS reports pixel size.
<a class="reference external" href="http://www.riverdark.net/atlantis/">Atlantis</a> (Mac) | 0.9.9.4 | No known issues.
<a class="reference external" href="https://sourceforge.net/projects/g-mud/">GMUD</a> | 0.0.1 | Cant handle any telnet handshakes. Not recommended.
<a class="reference external" href="http://www.beipmu.com/">BeipMU</a> (Win) | 3.0.255 | No MXP support. Best to enable “MUD prompt handling”, disable
“Handle HTML tags”.
<a class="reference external" href="https://itunes.apple.com/us/app/mudrammer-a-modern-mud-client/id597157072">MudRammer</a> (IOS) | 1.8.7 | Bad Telnet Protocol compliance: displays spurious characters.
<a class="reference external" href="https://itunes.apple.com/us/app/mudmaster/id341160033">MUDMaster</a> (IOS) | 1.3.1 | <em>UNTESTED</em>
<a class="reference external" href="http://bt.happygoatstudios.com/">BlowTorch</a> (Andr) | 1.1.3 | *Telnet NOP displays as spurious character.
<a class="reference external" href="https://play.google.com/store/apps/details?id=com.crap.mukluk">Mukluk</a> (Andr) | 2015.11.20| *Telnet NOP displays as spurious character. Has UTF-8/Emoji
support.
<a class="reference external" href="https://github.com/GNOME/gnome-mud">Gnome-MUD</a> (Unix) | 0.11.2 | Telnet handshake errors. First (only) attempt at logging in
fails.
<a class="reference external" href="https://spyrit.ierne.eu.org/">Spyrit</a> | 0.4 | No MXP, OOB support.
<a class="reference external" href="http://jamochamud.org/">JamochaMUD</a> | 5.2 | Does not support ANSI within MXP text.
<a class="reference external" href="http://duckclient.com/">DuckClient</a> (Chrome)| 4.2 | No MXP support. Displays Telnet Go-Ahead and WILL SUPPRESS-GO-AHEAD
as ù character. Also seems to run the <code class="docutils literal notranslate"><span class="pre">version</span></code> command on connection, which will not work in
<code class="docutils literal notranslate"><span class="pre">MULTISESSION_MODES</span></code> above 1.
<a class="reference external" href="https://www.kildclient.org/">KildClient</a> | 2.11.1 | No known issues.</p>
<table class="docutils align-default">
<colgroup>
<col style="width: 27%" />
<col style="width: 11%" />
<col style="width: 62%" />
</colgroup>
<thead>
<tr class="row-odd"><th class="head"><p>Name</p></th>
<th class="head"><p>Version</p></th>
<th class="head"><p>Comments</p></th>
</tr>
</thead>
<tbody>
<tr class="row-even"><td><p><a class="reference external" href="../Components/Webclient.html">Evennia Webclient</a></p></td>
<td><p>0.9</p></td>
<td><p>Evennia-specific</p></td>
</tr>
<tr class="row-odd"><td><p><a class="reference external" href="http://tintin.sourceforge.net/">tintin++</a></p></td>
<td><p>2.0+</p></td>
<td><p>No MXP support</p></td>
</tr>
<tr class="row-even"><td><p><a class="reference external" href="http://tinyfugue.sourceforge.net/">tinyfugue</a></p></td>
<td><p>5.0+</p></td>
<td><p>No UTF-8 support</p></td>
</tr>
<tr class="row-odd"><td><p><a class="reference external" href="http://mushclient.com/">MUSHclient</a> (Win)</p></td>
<td><p>4.94</p></td>
<td><p>NAWS reports full text area</p></td>
</tr>
<tr class="row-even"><td><p><a class="reference external" href="http://forums.zuggsoft.com/index.php?page=4&amp;action=file&amp;file_id=65">Zmud</a> (Win)</p></td>
<td><p>7.21</p></td>
<td><p><em>UNTESTED</em></p></td>
</tr>
<tr class="row-odd"><td><p><a class="reference external" href="http://forums.zuggsoft.com/index.php?page=4&amp;action=category&amp;cat_id=11">Cmud</a> (Win)</p></td>
<td><p>v3</p></td>
<td><p><em>UNTESTED</em></p></td>
</tr>
<tr class="row-even"><td><p><a class="reference external" href="http://www.potatomushclient.com/">Potato</a></p></td>
<td><p>2.0.0b16</p></td>
<td><p>No MXP, MCCP support. Win 32bit does not understand
“localhost”, must use <cite>127.0.0.1</cite>.</p></td>
</tr>
<tr class="row-odd"><td><p><a class="reference external" href="http://www.mudlet.org/">Mudlet</a></p></td>
<td><p>3.4+</p></td>
<td><p>No known issues. Some older versions showed &lt;&gt; as html
under MXP.</p></td>
</tr>
<tr class="row-even"><td><p><a class="reference external" href="https://archive.org/details/tucows_196173_SimpleMU_MU_Client">SimpleMU</a> (Win)</p></td>
<td><p>full</p></td>
<td><p>Discontinued. NAWS reports pixel size.</p></td>
</tr>
<tr class="row-odd"><td><p><a class="reference external" href="http://www.riverdark.net/atlantis/">Atlantis</a> (Mac)</p></td>
<td><p>0.9.9.4</p></td>
<td><p>No known issues.</p></td>
</tr>
<tr class="row-even"><td><p><a class="reference external" href="https://sourceforge.net/projects/g-mud/">GMUD</a></p></td>
<td><p>0.0.1</p></td>
<td><p>Cant handle any telnet handshakes. Not recommended.</p></td>
</tr>
<tr class="row-odd"><td><p><a class="reference external" href="http://www.beipmu.com/">BeipMU</a> (Win)</p></td>
<td><p>3.0.255</p></td>
<td><p>No MXP support. Best to enable “MUD prompt handling”, disable
“Handle HTML tags”.</p></td>
</tr>
<tr class="row-even"><td><p><a class="reference external" href="https://itunes.apple.com/us/app/mudrammer-a-modern-mud-client/id597157072">MudRammer</a> (IOS)</p></td>
<td><p>1.8.7</p></td>
<td><p>Bad Telnet Protocol compliance: displays spurious characters.</p></td>
</tr>
<tr class="row-odd"><td><p><a class="reference external" href="https://itunes.apple.com/us/app/mudmaster/id341160033">MUDMaster</a></p></td>
<td><p>1.3.1</p></td>
<td><p><em>UNTESTED</em></p></td>
</tr>
<tr class="row-even"><td><p><a class="reference external" href="http://bt.happygoatstudios.com/">BlowTorch</a> (Andr)</p></td>
<td><p>1.1.3</p></td>
<td><p>Telnet NOP displays as spurious character.</p></td>
</tr>
<tr class="row-odd"><td><p><a class="reference external" href="https://play.google.com/store/apps/details?id=com.crap.mukluk">Mukluk</a> (Andr)</p></td>
<td><p>2015.11.20</p></td>
<td><p>Telnet NOP displays as spurious character. Has UTF-8/Emoji
support.</p></td>
</tr>
<tr class="row-even"><td><p><a class="reference external" href="https://github.com/GNOME/gnome-mud">Gnome-MUD</a> (Unix)</p></td>
<td><p>0.11.2</p></td>
<td><p>Telnet handshake errors. First (only) attempt at logging in
fails.</p></td>
</tr>
<tr class="row-odd"><td><p><a class="reference external" href="https://spyrit.ierne.eu.org/">Spyrit</a></p></td>
<td><p>0.4</p></td>
<td><p>No MXP, OOB support.</p></td>
</tr>
<tr class="row-even"><td><p><a class="reference external" href="http://jamochamud.org/">JamochaMUD</a></p></td>
<td><p>5.2</p></td>
<td><p>Does not support ANSI within MXP text.</p></td>
</tr>
<tr class="row-odd"><td><p><a class="reference external" href="http://duckclient.com/">DuckClient</a> (Chrome)</p></td>
<td><p>4.2</p></td>
<td><p>No MXP support. Displays Telnet Go-Ahead and
WILL SUPPRESS-GO-AHEAD as ù character. Also seems to run
the <cite>version</cite> command on connection, which will not work in
<cite>MULTISESSION_MODES</cite> above 1.</p></td>
</tr>
<tr class="row-even"><td><p><a class="reference external" href="https://www.kildclient.org/">KildClient</a></p></td>
<td><p>2.11.1</p></td>
<td><p>No known issues.</p></td>
</tr>
</tbody>
</table>
</div>
<div class="section" id="workarounds-for-client-issues">
<h2>Workarounds for client issues:<a class="headerlink" href="#workarounds-for-client-issues" title="Permalink to this headline"></a></h2>
@ -87,27 +165,16 @@ as ù character. Also seems to run the <code class="docutils literal notranslate
<h3>Issue: Telnet NOP displays as spurious character.<a class="headerlink" href="#issue-telnet-nop-displays-as-spurious-character" title="Permalink to this headline"></a></h3>
<p>Known clients:</p>
<ul class="simple">
<li><p><a class="reference external" href="http://bt.happygoatstudios.com/">BlowTorch</a> (Andr)</p></li>
<li><p><a class="reference external" href="https://play.google.com/store/apps/details?id=com.crap.mukluk">Mukluk</a> (Andr)</p></li>
<li><p>BlowTorch (Andr)</p></li>
<li><p>Mukluk (Andr)</p></li>
</ul>
<p>Workaround:</p>
<ul class="simple">
<li><p>Set the command in game to <code class="docutils literal notranslate"><span class="pre">&#64;option</span> <span class="pre">NOPKEEPALIVE=off</span></code> for the session, or use the <code class="docutils literal notranslate"><span class="pre">/save</span></code>
parameter to disable it for that Evennian account permanently.</p></li>
<li><p>In-game: Use <code class="docutils literal notranslate"><span class="pre">&#64;option</span> <span class="pre">NOPKEEPALIVE=off</span></code> for the session, or use the <code class="docutils literal notranslate"><span class="pre">/save</span></code>
parameter to disable it for that Evennia account permanently.</p></li>
<li><p>Client-side: Set a gag-type trigger on the NOP character to make it invisible to the client.</p></li>
</ul>
</div>
<div class="section" id="issue-won-t-send-blank-line-on-enter-key-press">
<h3>Issue: Wont send blank line on Enter key press.<a class="headerlink" href="#issue-won-t-send-blank-line-on-enter-key-press" title="Permalink to this headline"></a></h3>
<p>Known clients:</p>
<ul class="simple">
<li><p><a class="reference external" href="http://www.potatomushclient.com/">Potato</a></p></li>
</ul>
<p>Workaround:</p>
<ul class="simple">
<li><p>Press Control Enter, then Enter key again to send blank line.</p></li>
</ul>
</div>
</div>
</div>
@ -138,7 +205,6 @@ parameter to disable it for that Evennian account permanently.</p></li>
<li><a class="reference internal" href="#client-grid">Client Grid</a></li>
<li><a class="reference internal" href="#workarounds-for-client-issues">Workarounds for client issues:</a><ul>
<li><a class="reference internal" href="#issue-telnet-nop-displays-as-spurious-character">Issue: Telnet NOP displays as spurious character.</a></li>
<li><a class="reference internal" href="#issue-won-t-send-blank-line-on-enter-key-press">Issue: Wont send blank line on Enter key press.</a></li>
</ul>
</li>
</ul>

View file

@ -490,13 +490,17 @@
<span class="c1"># Stopped at breakpoint. Press &#39;n&#39; to continue into the code.</span>
<span class="n">dbg</span><span class="o">.</span><span class="n">set_trace</span><span class="p">()</span></div>
<span class="c1"># initialize the doc string</span>
<span class="k">global</span> <span class="vm">__doc__</span>
<span class="vm">__doc__</span> <span class="o">=</span> <span class="n">DOCSTRING</span><span class="o">.</span><span class="n">format</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="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;evennia.</span><span class="si">{key}</span><span class="s2">&quot;</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="nb">globals</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;_&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="p">(</span><span class="s2">&quot;DOCSTRING&quot;</span><span class="p">,</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="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;evennia.</span><span class="si">{key}</span><span class="s2">&quot;</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="nb">globals</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;_&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="p">(</span><span class="s2">&quot;DOCSTRING&quot;</span><span class="p">,)</span>
<span class="p">)</span>
<span class="p">)</span>
</pre></div>
<div class="clearer"></div>

View file

@ -692,6 +692,53 @@
<span class="n">logger</span><span class="o">.</span><span class="n">log_sec</span><span class="p">(</span><span class="n">f</span><span class="s2">&quot;Password successfully changed for </span><span class="si">{self}</span><span class="s2">.&quot;</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">at_password_change</span><span class="p">()</span></div>
<div class="viewcode-block" id="DefaultAccount.create_character"><a class="viewcode-back" href="../../../api/evennia.accounts.accounts.html#evennia.accounts.accounts.DefaultAccount.create_character">[docs]</a> <span class="k">def</span> <span class="nf">create_character</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="o">*</span><span class="n">args</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> Create a character linked to this account.</span>
<span class="sd"> Args:</span>
<span class="sd"> key (str, optional): If not given, use the same name as the account.</span>
<span class="sd"> typeclass (str, optional): Typeclass to use for this character. If</span>
<span class="sd"> not given, use settings.BASE_CHARACTER_TYPECLASS.</span>
<span class="sd"> permissions (list, optional): If not given, use the account&#39;s permissions.</span>
<span class="sd"> ip (str, optiona): The client IP creating this character. Will fall back to the</span>
<span class="sd"> one stored for the account if not given.</span>
<span class="sd"> kwargs (any): Other kwargs will be used in the create_call.</span>
<span class="sd"> Returns:</span>
<span class="sd"> Object: A new character of the `character_typeclass` type. None on an error.</span>
<span class="sd"> list or None: A list of errors, or None.</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="c1"># parse inputs</span>
<span class="n">character_key</span> <span class="o">=</span> <span class="n">kwargs</span><span class="o">.</span><span class="n">pop</span><span class="p">(</span><span class="s2">&quot;key&quot;</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">key</span><span class="p">)</span>
<span class="n">character_ip</span> <span class="o">=</span> <span class="n">kwargs</span><span class="o">.</span><span class="n">pop</span><span class="p">(</span><span class="s2">&quot;ip&quot;</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">db</span><span class="o">.</span><span class="n">creator_ip</span><span class="p">)</span>
<span class="n">character_permissions</span> <span class="o">=</span> <span class="n">kwargs</span><span class="o">.</span><span class="n">pop</span><span class="p">(</span><span class="s2">&quot;permissions&quot;</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">permissions</span><span class="p">)</span>
<span class="c1"># Load the appropriate Character class</span>
<span class="n">character_typeclass</span> <span class="o">=</span> <span class="n">kwargs</span><span class="o">.</span><span class="n">pop</span><span class="p">(</span><span class="s2">&quot;typeclass&quot;</span><span class="p">,</span> <span class="kc">None</span><span class="p">)</span>
<span class="n">character_typeclass</span> <span class="o">=</span> <span class="p">(</span>
<span class="n">character_typeclass</span> <span class="k">if</span> <span class="n">character_typeclass</span> <span class="k">else</span> <span class="n">settings</span><span class="o">.</span><span class="n">BASE_CHARACTER_TYPECLASS</span>
<span class="p">)</span>
<span class="n">Character</span> <span class="o">=</span> <span class="n">class_from_module</span><span class="p">(</span><span class="n">character_typeclass</span><span class="p">)</span>
<span class="c1"># Create the character</span>
<span class="n">character</span><span class="p">,</span> <span class="n">errs</span> <span class="o">=</span> <span class="n">Character</span><span class="o">.</span><span class="n">create</span><span class="p">(</span>
<span class="n">character_key</span><span class="p">,</span>
<span class="bp">self</span><span class="p">,</span>
<span class="n">ip</span><span class="o">=</span><span class="n">character_ip</span><span class="p">,</span>
<span class="n">typeclass</span><span class="o">=</span><span class="n">character_typeclass</span><span class="p">,</span>
<span class="n">permissions</span><span class="o">=</span><span class="n">character_permissions</span><span class="p">,</span>
<span class="o">**</span><span class="n">kwargs</span><span class="p">,</span>
<span class="p">)</span>
<span class="k">if</span> <span class="n">character</span><span class="p">:</span>
<span class="c1"># Update playable character list</span>
<span class="k">if</span> <span class="n">character</span> <span class="ow">not</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">characters</span><span class="p">:</span>
<span class="bp">self</span><span class="o">.</span><span class="n">db</span><span class="o">.</span><span class="n">_playable_characters</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">character</span><span class="p">)</span>
<span class="c1"># We need to set this to have @ic auto-connect to this character</span>
<span class="bp">self</span><span class="o">.</span><span class="n">db</span><span class="o">.</span><span class="n">_last_puppet</span> <span class="o">=</span> <span class="n">character</span>
<span class="k">return</span> <span class="n">character</span><span class="p">,</span> <span class="n">errs</span></div>
<div class="viewcode-block" id="DefaultAccount.create"><a class="viewcode-back" href="../../../api/evennia.accounts.accounts.html#evennia.accounts.accounts.DefaultAccount.create">[docs]</a> <span class="nd">@classmethod</span>
<span class="k">def</span> <span class="nf">create</span><span class="p">(</span><span class="bp">cls</span><span class="p">,</span> <span class="o">*</span><span class="n">args</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;</span>
@ -800,31 +847,13 @@
<span class="n">logger</span><span class="o">.</span><span class="n">log_err</span><span class="p">(</span><span class="n">string</span><span class="p">)</span>
<span class="k">if</span> <span class="n">account</span> <span class="ow">and</span> <span class="n">settings</span><span class="o">.</span><span class="n">MULTISESSION_MODE</span> <span class="o">&lt;</span> <span class="mi">2</span><span class="p">:</span>
<span class="c1"># Load the appropriate Character class</span>
<span class="n">character_typeclass</span> <span class="o">=</span> <span class="n">kwargs</span><span class="o">.</span><span class="n">get</span><span class="p">(</span>
<span class="s2">&quot;character_typeclass&quot;</span><span class="p">,</span> <span class="n">settings</span><span class="o">.</span><span class="n">BASE_CHARACTER_TYPECLASS</span>
<span class="c1"># Auto-create a character to go with this account</span>
<span class="n">character</span><span class="p">,</span> <span class="n">errs</span> <span class="o">=</span> <span class="n">account</span><span class="o">.</span><span class="n">create_character</span><span class="p">(</span>
<span class="n">typeclass</span><span class="o">=</span><span class="n">kwargs</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s2">&quot;character_typeclass&quot;</span><span class="p">)</span>
<span class="p">)</span>
<span class="n">character_home</span> <span class="o">=</span> <span class="n">kwargs</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s2">&quot;home&quot;</span><span class="p">)</span>
<span class="n">Character</span> <span class="o">=</span> <span class="n">class_from_module</span><span class="p">(</span><span class="n">character_typeclass</span><span class="p">)</span>
<span class="c1"># Create the character</span>
<span class="n">character</span><span class="p">,</span> <span class="n">errs</span> <span class="o">=</span> <span class="n">Character</span><span class="o">.</span><span class="n">create</span><span class="p">(</span>
<span class="n">account</span><span class="o">.</span><span class="n">key</span><span class="p">,</span>
<span class="n">account</span><span class="p">,</span>
<span class="n">ip</span><span class="o">=</span><span class="n">ip</span><span class="p">,</span>
<span class="n">typeclass</span><span class="o">=</span><span class="n">character_typeclass</span><span class="p">,</span>
<span class="n">permissions</span><span class="o">=</span><span class="n">permissions</span><span class="p">,</span>
<span class="n">home</span><span class="o">=</span><span class="n">character_home</span><span class="p">,</span>
<span class="p">)</span>
<span class="n">errors</span><span class="o">.</span><span class="n">extend</span><span class="p">(</span><span class="n">errs</span><span class="p">)</span>
<span class="k">if</span> <span class="n">character</span><span class="p">:</span>
<span class="c1"># Update playable character list</span>
<span class="k">if</span> <span class="n">character</span> <span class="ow">not</span> <span class="ow">in</span> <span class="n">account</span><span class="o">.</span><span class="n">characters</span><span class="p">:</span>
<span class="n">account</span><span class="o">.</span><span class="n">db</span><span class="o">.</span><span class="n">_playable_characters</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">character</span><span class="p">)</span>
<span class="c1"># We need to set this to have @ic auto-connect to this character</span>
<span class="n">account</span><span class="o">.</span><span class="n">db</span><span class="o">.</span><span class="n">_last_puppet</span> <span class="o">=</span> <span class="n">character</span>
<span class="k">if</span> <span class="n">errs</span><span class="p">:</span>
<span class="n">errors</span><span class="o">.</span><span class="n">extend</span><span class="p">(</span><span class="n">errs</span><span class="p">)</span>
<span class="k">except</span> <span class="ne">Exception</span><span class="p">:</span>
<span class="c1"># We are in the middle between logged in and -not, so we have</span>
@ -961,6 +990,7 @@
<span class="n">nofound_string</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span>
<span class="n">multimatch_string</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span>
<span class="n">use_nicks</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">False</span><span class="p">,</span>
<span class="o">**</span><span class="n">kwargs</span><span class="p">,</span>
<span class="p">):</span>
<span class="sd">&quot;&quot;&quot;</span>
@ -987,9 +1017,13 @@
<span class="sd"> message to echo if `searchdata` leads to multiple matches.</span>
<span class="sd"> If not given, will fall back to the default handler.</span>
<span class="sd"> use_nicks (bool, optional): Use account-level nick replacement.</span>
<span class="sd"> quiet (bool, optional): If set, will not show any error to the user,</span>
<span class="sd"> and will also lead to returning a list of matches.</span>
<span class="sd"> Return:</span>
<span class="sd"> match (Account, Object or None): A single Account or Object match.</span>
<span class="sd"> list: If `quiet=True` this is a list of 0, 1 or more Account or Object matches.</span>
<span class="sd"> Notes:</span>
<span class="sd"> Extra keywords are ignored, but are allowed in call in</span>
<span class="sd"> order to make API more consistent with</span>
@ -1001,28 +1035,31 @@
<span class="c1"># handle wrapping of common terms</span>
<span class="k">if</span> <span class="n">searchdata</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;me&quot;</span><span class="p">,</span> <span class="s2">&quot;*me&quot;</span><span class="p">,</span> <span class="s2">&quot;self&quot;</span><span class="p">,</span> <span class="s2">&quot;*self&quot;</span><span class="p">):</span>
<span class="k">return</span> <span class="bp">self</span>
<span class="k">if</span> <span class="n">search_object</span><span class="p">:</span>
<span class="n">matches</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">object_search</span><span class="p">(</span>
<span class="n">searchdata</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="n">use_nicks</span><span class="o">=</span><span class="n">use_nicks</span>
<span class="p">)</span>
<span class="k">else</span><span class="p">:</span>
<span class="n">searchdata</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">nicks</span><span class="o">.</span><span class="n">nickreplace</span><span class="p">(</span>
<span class="n">searchdata</span><span class="p">,</span> <span class="n">categories</span><span class="o">=</span><span class="p">(</span><span class="s2">&quot;account&quot;</span><span class="p">,),</span> <span class="n">include_account</span><span class="o">=</span><span class="kc">False</span>
<span class="p">)</span>
<span class="n">matches</span> <span class="o">=</span> <span class="n">AccountDB</span><span class="o">.</span><span class="n">objects</span><span class="o">.</span><span class="n">account_search</span><span class="p">(</span><span class="n">searchdata</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="n">matches</span> <span class="o">=</span> <span class="n">_AT_SEARCH_RESULT</span><span class="p">(</span>
<span class="n">matches</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="n">searchdata</span><span class="p">,</span>
<span class="n">nofound_string</span><span class="o">=</span><span class="n">nofound_string</span><span class="p">,</span>
<span class="n">multimatch_string</span><span class="o">=</span><span class="n">multimatch_string</span><span class="p">,</span>
<span class="n">searchdata</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">nicks</span><span class="o">.</span><span class="n">nickreplace</span><span class="p">(</span>
<span class="n">searchdata</span><span class="p">,</span> <span class="n">categories</span><span class="o">=</span><span class="p">(</span><span class="s2">&quot;account&quot;</span><span class="p">,),</span> <span class="n">include_account</span><span class="o">=</span><span class="kc">False</span>
<span class="p">)</span>
<span class="k">if</span> <span class="n">matches</span> <span class="ow">and</span> <span class="n">return_puppet</span><span class="p">:</span>
<span class="k">try</span><span class="p">:</span>
<span class="k">return</span> <span class="n">matches</span><span class="o">.</span><span class="n">puppet</span>
<span class="k">except</span> <span class="ne">AttributeError</span><span class="p">:</span>
<span class="k">return</span> <span class="kc">None</span>
<span class="k">if</span> <span class="n">search_object</span><span class="p">:</span>
<span class="n">matches</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">object_search</span><span class="p">(</span><span class="n">searchdata</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">else</span><span class="p">:</span>
<span class="n">matches</span> <span class="o">=</span> <span class="n">AccountDB</span><span class="o">.</span><span class="n">objects</span><span class="o">.</span><span class="n">account_search</span><span class="p">(</span><span class="n">searchdata</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">if</span> <span class="n">quiet</span><span class="p">:</span>
<span class="n">matches</span> <span class="o">=</span> <span class="nb">list</span><span class="p">(</span><span class="n">matches</span><span class="p">)</span>
<span class="k">if</span> <span class="n">return_puppet</span><span class="p">:</span>
<span class="n">matches</span> <span class="o">=</span> <span class="p">[</span><span class="n">match</span><span class="o">.</span><span class="n">puppet</span> <span class="k">for</span> <span class="n">match</span> <span class="ow">in</span> <span class="n">matches</span><span class="p">]</span>
<span class="k">else</span><span class="p">:</span>
<span class="n">matches</span> <span class="o">=</span> <span class="n">_AT_SEARCH_RESULT</span><span class="p">(</span>
<span class="n">matches</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="n">searchdata</span><span class="p">,</span>
<span class="n">nofound_string</span><span class="o">=</span><span class="n">nofound_string</span><span class="p">,</span>
<span class="n">multimatch_string</span><span class="o">=</span><span class="n">multimatch_string</span><span class="p">,</span>
<span class="p">)</span>
<span class="k">if</span> <span class="n">matches</span> <span class="ow">and</span> <span class="n">return_puppet</span><span class="p">:</span>
<span class="k">try</span><span class="p">:</span>
<span class="n">matches</span> <span class="o">=</span> <span class="n">matches</span><span class="o">.</span><span class="n">puppet</span>
<span class="k">except</span> <span class="ne">AttributeError</span><span class="p">:</span>
<span class="k">return</span> <span class="kc">None</span>
<span class="k">return</span> <span class="n">matches</span></div>
<div class="viewcode-block" id="DefaultAccount.access"><a class="viewcode-back" href="../../../api/evennia.accounts.accounts.html#evennia.accounts.accounts.DefaultAccount.access">[docs]</a> <span class="k">def</span> <span class="nf">access</span><span class="p">(</span>
@ -1589,7 +1626,7 @@
<span class="k">try</span><span class="p">:</span>
<span class="c1"># Find an available guest name.</span>
<span class="k">for</span> <span class="n">name</span> <span class="ow">in</span> <span class="n">settings</span><span class="o">.</span><span class="n">GUEST_LIST</span><span class="p">:</span>
<span class="k">if</span> <span class="ow">not</span> <span class="n">AccountDB</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">username__iexact</span><span class="o">=</span><span class="n">name</span><span class="p">)</span><span class="o">.</span><span class="n">count</span><span class="p">():</span>
<span class="k">if</span> <span class="ow">not</span> <span class="n">AccountDB</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">username__iexact</span><span class="o">=</span><span class="n">name</span><span class="p">)</span><span class="o">.</span><span class="n">exists</span><span class="p">():</span>
<span class="n">username</span> <span class="o">=</span> <span class="n">name</span>
<span class="k">break</span>
<span class="k">if</span> <span class="ow">not</span> <span class="n">username</span><span class="p">:</span>
@ -1615,6 +1652,15 @@
<span class="n">ip</span><span class="o">=</span><span class="n">ip</span><span class="p">,</span>
<span class="p">)</span>
<span class="n">errors</span><span class="o">.</span><span class="n">extend</span><span class="p">(</span><span class="n">errs</span><span class="p">)</span>
<span class="k">if</span> <span class="ow">not</span> <span class="n">account</span><span class="o">.</span><span class="n">characters</span><span class="p">:</span>
<span class="c1"># this can happen for multisession_mode &gt; 1. For guests we</span>
<span class="c1"># always auto-create a character, regardless of multi-session-mode.</span>
<span class="n">character</span><span class="p">,</span> <span class="n">errs</span> <span class="o">=</span> <span class="n">account</span><span class="o">.</span><span class="n">create_character</span><span class="p">()</span>
<span class="k">if</span> <span class="n">errs</span><span class="p">:</span>
<span class="n">errors</span><span class="o">.</span><span class="n">extend</span><span class="p">(</span><span class="n">errs</span><span class="p">)</span>
<span class="k">return</span> <span class="n">account</span><span class="p">,</span> <span class="n">errors</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>

View file

@ -45,13 +45,26 @@
<span class="c1">#</span>
<span class="kn">from</span> <span class="nn">django</span> <span class="k">import</span> <span class="n">forms</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.contrib</span> <span class="k">import</span> <span class="n">admin</span>
<span class="kn">from</span> <span class="nn">django.contrib</span> <span class="k">import</span> <span class="n">admin</span><span class="p">,</span> <span class="n">messages</span>
<span class="kn">from</span> <span class="nn">django.contrib.admin.options</span> <span class="k">import</span> <span class="n">IS_POPUP_VAR</span>
<span class="kn">from</span> <span class="nn">django.contrib.auth.admin</span> <span class="k">import</span> <span class="n">UserAdmin</span> <span class="k">as</span> <span class="n">BaseUserAdmin</span>
<span class="kn">from</span> <span class="nn">django.contrib.auth.forms</span> <span class="k">import</span> <span class="n">UserChangeForm</span><span class="p">,</span> <span class="n">UserCreationForm</span>
<span class="kn">from</span> <span class="nn">django.contrib.admin.utils</span> <span class="k">import</span> <span class="n">unquote</span>
<span class="kn">from</span> <span class="nn">django.template.response</span> <span class="k">import</span> <span class="n">TemplateResponse</span>
<span class="kn">from</span> <span class="nn">django.http</span> <span class="k">import</span> <span class="n">Http404</span><span class="p">,</span> <span class="n">HttpResponseRedirect</span>
<span class="kn">from</span> <span class="nn">django.core.exceptions</span> <span class="k">import</span> <span class="n">PermissionDenied</span>
<span class="kn">from</span> <span class="nn">django.views.decorators.debug</span> <span class="k">import</span> <span class="n">sensitive_post_parameters</span>
<span class="kn">from</span> <span class="nn">django.utils.decorators</span> <span class="k">import</span> <span class="n">method_decorator</span>
<span class="kn">from</span> <span class="nn">django.utils.html</span> <span class="k">import</span> <span class="n">escape</span>
<span class="kn">from</span> <span class="nn">django.urls</span> <span class="k">import</span> <span class="n">path</span><span class="p">,</span> <span class="n">reverse</span>
<span class="kn">from</span> <span class="nn">django.contrib.auth</span> <span class="k">import</span> <span class="n">update_session_auth_hash</span>
<span class="kn">from</span> <span class="nn">evennia.accounts.models</span> <span class="k">import</span> <span class="n">AccountDB</span>
<span class="kn">from</span> <span class="nn">evennia.typeclasses.admin</span> <span class="k">import</span> <span class="n">AttributeInline</span><span class="p">,</span> <span class="n">TagInline</span>
<span class="kn">from</span> <span class="nn">evennia.utils</span> <span class="k">import</span> <span class="n">create</span>
<span class="n">sensitive_post_parameters_m</span> <span class="o">=</span> <span class="n">method_decorator</span><span class="p">(</span><span class="n">sensitive_post_parameters</span><span class="p">())</span>
<span class="c1"># handle the custom User editor</span>
<div class="viewcode-block" id="AccountDBChangeForm"><a class="viewcode-back" href="../../../api/evennia.accounts.admin.html#evennia.accounts.admin.AccountDBChangeForm">[docs]</a><span class="k">class</span> <span class="nc">AccountDBChangeForm</span><span class="p">(</span><span class="n">UserChangeForm</span><span class="p">):</span>
@ -128,7 +141,8 @@
<div class="viewcode-block" id="AccountForm.Meta"><a class="viewcode-back" href="../../../api/evennia.accounts.admin.html#evennia.accounts.admin.AccountForm.Meta">[docs]</a> <span class="k">class</span> <span class="nc">Meta</span><span class="p">(</span><span class="nb">object</span><span class="p">):</span>
<span class="n">model</span> <span class="o">=</span> <span class="n">AccountDB</span>
<span class="n">fields</span> <span class="o">=</span> <span class="s2">&quot;__all__&quot;</span></div>
<span class="n">fields</span> <span class="o">=</span> <span class="s2">&quot;__all__&quot;</span>
<span class="n">app_label</span> <span class="o">=</span> <span class="s2">&quot;accounts&quot;</span></div>
<span class="n">db_key</span> <span class="o">=</span> <span class="n">forms</span><span class="o">.</span><span class="n">RegexField</span><span class="p">(</span>
<span class="n">label</span><span class="o">=</span><span class="s2">&quot;Username&quot;</span><span class="p">,</span>
@ -300,6 +314,70 @@
<span class="p">),</span>
<span class="p">)</span>
<div class="viewcode-block" id="AccountDBAdmin.user_change_password"><a class="viewcode-back" href="../../../api/evennia.accounts.admin.html#evennia.accounts.admin.AccountDBAdmin.user_change_password">[docs]</a> <span class="nd">@sensitive_post_parameters_m</span>
<span class="k">def</span> <span class="nf">user_change_password</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">request</span><span class="p">,</span> <span class="nb">id</span><span class="p">,</span> <span class="n">form_url</span><span class="o">=</span><span class="s2">&quot;&quot;</span><span class="p">):</span>
<span class="n">user</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">get_object</span><span class="p">(</span><span class="n">request</span><span class="p">,</span> <span class="n">unquote</span><span class="p">(</span><span class="nb">id</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">has_change_permission</span><span class="p">(</span><span class="n">request</span><span class="p">,</span> <span class="n">user</span><span class="p">):</span>
<span class="k">raise</span> <span class="n">PermissionDenied</span>
<span class="k">if</span> <span class="n">user</span> <span class="ow">is</span> <span class="kc">None</span><span class="p">:</span>
<span class="k">raise</span> <span class="n">Http404</span><span class="p">(</span><span class="s2">&quot;</span><span class="si">%(name)s</span><span class="s2"> object with primary key </span><span class="si">%(key)r</span><span class="s2"> does not exist.&quot;</span><span class="p">)</span> <span class="o">%</span> <span class="p">{</span>
<span class="s2">&quot;name&quot;</span><span class="p">:</span> <span class="bp">self</span><span class="o">.</span><span class="n">model</span><span class="o">.</span><span class="n">_meta</span><span class="o">.</span><span class="n">verbose_name</span><span class="p">,</span>
<span class="s2">&quot;key&quot;</span><span class="p">:</span> <span class="n">escape</span><span class="p">(</span><span class="nb">id</span><span class="p">),</span>
<span class="p">}</span>
<span class="k">if</span> <span class="n">request</span><span class="o">.</span><span class="n">method</span> <span class="o">==</span> <span class="s2">&quot;POST&quot;</span><span class="p">:</span>
<span class="n">form</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">change_password_form</span><span class="p">(</span><span class="n">user</span><span class="p">,</span> <span class="n">request</span><span class="o">.</span><span class="n">POST</span><span class="p">)</span>
<span class="k">if</span> <span class="n">form</span><span class="o">.</span><span class="n">is_valid</span><span class="p">():</span>
<span class="n">form</span><span class="o">.</span><span class="n">save</span><span class="p">()</span>
<span class="n">change_message</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">construct_change_message</span><span class="p">(</span><span class="n">request</span><span class="p">,</span> <span class="n">form</span><span class="p">,</span> <span class="kc">None</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">log_change</span><span class="p">(</span><span class="n">request</span><span class="p">,</span> <span class="n">user</span><span class="p">,</span> <span class="n">change_message</span><span class="p">)</span>
<span class="n">msg</span> <span class="o">=</span> <span class="s2">&quot;Password changed successfully.&quot;</span>
<span class="n">messages</span><span class="o">.</span><span class="n">success</span><span class="p">(</span><span class="n">request</span><span class="p">,</span> <span class="n">msg</span><span class="p">)</span>
<span class="n">update_session_auth_hash</span><span class="p">(</span><span class="n">request</span><span class="p">,</span> <span class="n">form</span><span class="o">.</span><span class="n">user</span><span class="p">)</span>
<span class="k">return</span> <span class="n">HttpResponseRedirect</span><span class="p">(</span>
<span class="n">reverse</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">_</span><span class="si">%s</span><span class="s2">_change&quot;</span>
<span class="o">%</span> <span class="p">(</span>
<span class="bp">self</span><span class="o">.</span><span class="n">admin_site</span><span class="o">.</span><span class="n">name</span><span class="p">,</span>
<span class="n">user</span><span class="o">.</span><span class="n">_meta</span><span class="o">.</span><span class="n">app_label</span><span class="p">,</span>
<span class="c1"># the model_name is something we need to hardcode</span>
<span class="c1"># since our accountdb is a proxy:</span>
<span class="s2">&quot;accountdb&quot;</span><span class="p">,</span>
<span class="p">),</span>
<span class="n">args</span><span class="o">=</span><span class="p">(</span><span class="n">user</span><span class="o">.</span><span class="n">pk</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">form</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">change_password_form</span><span class="p">(</span><span class="n">user</span><span class="p">)</span>
<span class="n">fieldsets</span> <span class="o">=</span> <span class="p">[(</span><span class="kc">None</span><span class="p">,</span> <span class="p">{</span><span class="s2">&quot;fields&quot;</span><span class="p">:</span> <span class="nb">list</span><span class="p">(</span><span class="n">form</span><span class="o">.</span><span class="n">base_fields</span><span class="p">)})]</span>
<span class="n">adminForm</span> <span class="o">=</span> <span class="n">admin</span><span class="o">.</span><span class="n">helpers</span><span class="o">.</span><span class="n">AdminForm</span><span class="p">(</span><span class="n">form</span><span class="p">,</span> <span class="n">fieldsets</span><span class="p">,</span> <span class="p">{})</span>
<span class="n">context</span> <span class="o">=</span> <span class="p">{</span>
<span class="s2">&quot;title&quot;</span><span class="p">:</span> <span class="s2">&quot;Change password: </span><span class="si">%s</span><span class="s2">&quot;</span> <span class="o">%</span> <span class="n">escape</span><span class="p">(</span><span class="n">user</span><span class="o">.</span><span class="n">get_username</span><span class="p">()),</span>
<span class="s2">&quot;adminForm&quot;</span><span class="p">:</span> <span class="n">adminForm</span><span class="p">,</span>
<span class="s2">&quot;form_url&quot;</span><span class="p">:</span> <span class="n">form_url</span><span class="p">,</span>
<span class="s2">&quot;form&quot;</span><span class="p">:</span> <span class="n">form</span><span class="p">,</span>
<span class="s2">&quot;is_popup&quot;</span><span class="p">:</span> <span class="p">(</span><span class="n">IS_POPUP_VAR</span> <span class="ow">in</span> <span class="n">request</span><span class="o">.</span><span class="n">POST</span> <span class="ow">or</span> <span class="n">IS_POPUP_VAR</span> <span class="ow">in</span> <span class="n">request</span><span class="o">.</span><span class="n">GET</span><span class="p">),</span>
<span class="s2">&quot;add&quot;</span><span class="p">:</span> <span class="kc">True</span><span class="p">,</span>
<span class="s2">&quot;change&quot;</span><span class="p">:</span> <span class="kc">False</span><span class="p">,</span>
<span class="s2">&quot;has_delete_permission&quot;</span><span class="p">:</span> <span class="kc">False</span><span class="p">,</span>
<span class="s2">&quot;has_change_permission&quot;</span><span class="p">:</span> <span class="kc">True</span><span class="p">,</span>
<span class="s2">&quot;has_absolute_url&quot;</span><span class="p">:</span> <span class="kc">False</span><span class="p">,</span>
<span class="s2">&quot;opts&quot;</span><span class="p">:</span> <span class="bp">self</span><span class="o">.</span><span class="n">model</span><span class="o">.</span><span class="n">_meta</span><span class="p">,</span>
<span class="s2">&quot;original&quot;</span><span class="p">:</span> <span class="n">user</span><span class="p">,</span>
<span class="s2">&quot;save_as&quot;</span><span class="p">:</span> <span class="kc">False</span><span class="p">,</span>
<span class="s2">&quot;show_save&quot;</span><span class="p">:</span> <span class="kc">True</span><span class="p">,</span>
<span class="o">**</span><span class="bp">self</span><span class="o">.</span><span class="n">admin_site</span><span class="o">.</span><span class="n">each_context</span><span class="p">(</span><span class="n">request</span><span class="p">),</span>
<span class="p">}</span>
<span class="n">request</span><span class="o">.</span><span class="n">current_app</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">admin_site</span><span class="o">.</span><span class="n">name</span>
<span class="k">return</span> <span class="n">TemplateResponse</span><span class="p">(</span>
<span class="n">request</span><span class="p">,</span>
<span class="bp">self</span><span class="o">.</span><span class="n">change_user_password_template</span> <span class="ow">or</span> <span class="s2">&quot;admin/auth/user/change_password.html&quot;</span><span class="p">,</span>
<span class="n">context</span><span class="p">,</span>
<span class="p">)</span></div>
<div class="viewcode-block" id="AccountDBAdmin.save_model"><a class="viewcode-back" href="../../../api/evennia.accounts.admin.html#evennia.accounts.admin.AccountDBAdmin.save_model">[docs]</a> <span class="k">def</span> <span class="nf">save_model</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">request</span><span class="p">,</span> <span class="n">obj</span><span class="p">,</span> <span class="n">form</span><span class="p">,</span> <span class="n">change</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> Custom save actions.</span>

View file

@ -150,8 +150,8 @@
<span class="n">__applabel__</span> <span class="o">=</span> <span class="s2">&quot;accounts&quot;</span>
<span class="n">__settingsclasspath__</span> <span class="o">=</span> <span class="n">settings</span><span class="o">.</span><span class="n">BASE_SCRIPT_TYPECLASS</span>
<span class="k">class</span> <span class="nc">Meta</span><span class="p">(</span><span class="nb">object</span><span class="p">):</span>
<span class="n">verbose_name</span> <span class="o">=</span> <span class="s2">&quot;Account&quot;</span>
<span class="c1"># class Meta:</span>
<span class="c1"># verbose_name = &quot;Account&quot;</span>
<span class="c1"># cmdset_storage property</span>
<span class="c1"># This seems very sensitive to caching, so leaving it be for now /Griatch</span>

View file

@ -513,13 +513,13 @@
<span class="n">tempmergers</span><span class="p">[</span><span class="n">prio</span><span class="p">]</span> <span class="o">=</span> <span class="n">cmdset</span>
<span class="c1"># sort cmdsets after reverse priority (highest prio are merged in last)</span>
<span class="n">cmdsets</span> <span class="o">=</span> <span class="k">yield</span> <span class="nb">sorted</span><span class="p">(</span><span class="nb">list</span><span class="p">(</span><span class="n">tempmergers</span><span class="o">.</span><span class="n">values</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">sorted_cmdsets</span> <span class="o">=</span> <span class="k">yield</span> <span class="nb">sorted</span><span class="p">(</span><span class="nb">list</span><span class="p">(</span><span class="n">tempmergers</span><span class="o">.</span><span class="n">values</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="c1"># Merge all command sets into one, beginning with the lowest-prio one</span>
<span class="n">cmdset</span> <span class="o">=</span> <span class="n">cmdsets</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span>
<span class="k">for</span> <span class="n">merging_cmdset</span> <span class="ow">in</span> <span class="n">cmdsets</span><span class="p">[</span><span class="mi">1</span><span class="p">:]:</span>
<span class="n">cmdset</span> <span class="o">=</span> <span class="n">sorted_cmdsets</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span>
<span class="k">for</span> <span class="n">merging_cmdset</span> <span class="ow">in</span> <span class="n">sorted_cmdsets</span><span class="p">[</span><span class="mi">1</span><span class="p">:]:</span>
<span class="n">cmdset</span> <span class="o">=</span> <span class="k">yield</span> <span class="n">cmdset</span> <span class="o">+</span> <span class="n">merging_cmdset</span>
<span class="c1"># store the full sets for diagnosis</span>
<span class="c1"># store the original, ungrouped set for diagnosis</span>
<span class="n">cmdset</span><span class="o">.</span><span class="n">merged_from</span> <span class="o">=</span> <span class="n">cmdsets</span>
<span class="c1"># cache</span>
<span class="n">_CMDSET_MERGE_CACHE</span><span class="p">[</span><span class="n">mergehash</span><span class="p">]</span> <span class="o">=</span> <span class="n">cmdset</span>

View file

@ -484,12 +484,12 @@
<span class="c1"># print &quot;__add__ for %s (prio %i) called with %s (prio %i).&quot; % (self.key, self.priority, cmdset_a.key, cmdset_a.priority)</span>
<span class="c1"># return the system commands to the cmdset</span>
<span class="n">cmdset_c</span><span class="o">.</span><span class="n">add</span><span class="p">(</span><span class="n">sys_commands</span><span class="p">)</span>
<span class="n">cmdset_c</span><span class="o">.</span><span class="n">add</span><span class="p">(</span><span class="n">sys_commands</span><span class="p">,</span> <span class="n">allow_duplicates</span><span class="o">=</span><span class="kc">True</span><span class="p">)</span>
<span class="k">return</span> <span class="n">cmdset_c</span>
<div class="viewcode-block" id="CmdSet.add"><a class="viewcode-back" href="../../../api/evennia.commands.cmdset.html#evennia.commands.cmdset.CmdSet.add">[docs]</a> <span class="k">def</span> <span class="nf">add</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">cmd</span><span class="p">):</span>
<div class="viewcode-block" id="CmdSet.add"><a class="viewcode-back" href="../../../api/evennia.commands.cmdset.html#evennia.commands.cmdset.CmdSet.add">[docs]</a> <span class="k">def</span> <span class="nf">add</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">cmd</span><span class="p">,</span> <span class="n">allow_duplicates</span><span class="o">=</span><span class="kc">False</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> Add a new command or commands to this CmdSetcommand, a list of</span>
<span class="sd"> Add a new command or commands to this CmdSet, a list of</span>
<span class="sd"> commands or a cmdset to this cmdset. Note that this is *not*</span>
<span class="sd"> a merge operation (that is handled by the + operator).</span>
@ -497,6 +497,9 @@
<span class="sd"> cmd (Command, list, Cmdset): This allows for adding one or</span>
<span class="sd"> more commands to this Cmdset in one go. If another Cmdset</span>
<span class="sd"> is given, all its commands will be added.</span>
<span class="sd"> allow_duplicates (bool, optional): If set, will not try to remove</span>
<span class="sd"> duplicate cmds in the set. This is needed during the merge process</span>
<span class="sd"> to avoid wiping commands coming from cmdsets with duplicate=True.</span>
<span class="sd"> Notes:</span>
<span class="sd"> If cmd already exists in set, it will replace the old one</span>
@ -539,8 +542,10 @@
<span class="n">commands</span><span class="p">[</span><span class="n">ic</span><span class="p">]</span> <span class="o">=</span> <span class="n">cmd</span> <span class="c1"># replace</span>
<span class="k">except</span> <span class="ne">ValueError</span><span class="p">:</span>
<span class="n">commands</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">cmd</span><span class="p">)</span>
<span class="c1"># extra run to make sure to avoid doublets</span>
<span class="bp">self</span><span class="o">.</span><span class="n">commands</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">commands</span><span class="p">))</span>
<span class="bp">self</span><span class="o">.</span><span class="n">commands</span> <span class="o">=</span> <span class="n">commands</span>
<span class="k">if</span> <span class="ow">not</span> <span class="n">allow_duplicates</span><span class="p">:</span>
<span class="c1"># extra run to make sure to avoid doublets</span>
<span class="bp">self</span><span class="o">.</span><span class="n">commands</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="bp">self</span><span class="o">.</span><span class="n">commands</span><span class="p">))</span>
<span class="c1"># add system_command to separate list as well,</span>
<span class="c1"># for quick look-up</span>
<span class="k">if</span> <span class="n">cmd</span><span class="o">.</span><span class="n">key</span><span class="o">.</span><span class="n">startswith</span><span class="p">(</span><span class="s2">&quot;__&quot;</span><span class="p">):</span>

View file

@ -195,7 +195,8 @@
<span class="k">if</span> <span class="ow">not</span> <span class="n">account</span><span class="o">.</span><span class="n">is_superuser</span> <span class="ow">and</span> <span class="p">(</span>
<span class="n">account</span><span class="o">.</span><span class="n">db</span><span class="o">.</span><span class="n">_playable_characters</span> <span class="ow">and</span> <span class="nb">len</span><span class="p">(</span><span class="n">account</span><span class="o">.</span><span class="n">db</span><span class="o">.</span><span class="n">_playable_characters</span><span class="p">)</span> <span class="o">&gt;=</span> <span class="n">charmax</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 may only create a maximum of </span><span class="si">%i</span><span class="s2"> characters.&quot;</span> <span class="o">%</span> <span class="n">charmax</span><span class="p">)</span>
<span class="n">plural</span> <span class="o">=</span> <span class="s2">&quot;&quot;</span> <span class="k">if</span> <span class="n">charmax</span> <span class="o">==</span> <span class="mi">1</span> <span class="k">else</span> <span class="s2">&quot;s&quot;</span>
<span class="bp">self</span><span class="o">.</span><span class="n">msg</span><span class="p">(</span><span class="n">f</span><span class="s2">&quot;You may only create a maximum of </span><span class="si">{charmax}</span><span class="s2"> character</span><span class="si">{plural}</span><span class="s2">.&quot;</span><span class="p">)</span>
<span class="k">return</span>
<span class="kn">from</span> <span class="nn">evennia.objects.models</span> <span class="k">import</span> <span class="n">ObjectDB</span>
@ -341,27 +342,68 @@
<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="n">new_character</span> <span class="o">=</span> <span class="kc">None</span>
<span class="n">character_candidates</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">args</span><span class="p">:</span>
<span class="n">new_character</span> <span class="o">=</span> <span class="n">account</span><span class="o">.</span><span class="n">db</span><span class="o">.</span><span class="n">_last_puppet</span>
<span class="k">if</span> <span class="ow">not</span> <span class="n">new_character</span><span class="p">:</span>
<span class="n">character_candidates</span> <span class="o">=</span> <span class="p">[</span><span class="n">account</span><span class="o">.</span><span class="n">db</span><span class="o">.</span><span class="n">_last_puppet</span><span class="p">]</span> <span class="ow">or</span> <span class="p">[]</span>
<span class="k">if</span> <span class="ow">not</span> <span class="n">character_candidates</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;Usage: ic &lt;character&gt;&quot;</span><span class="p">)</span>
<span class="k">return</span>
<span class="k">if</span> <span class="ow">not</span> <span class="n">new_character</span><span class="p">:</span>
<span class="c1"># search for a matching character</span>
<span class="n">new_character</span> <span class="o">=</span> <span class="p">[</span>
<span class="n">char</span> <span class="k">for</span> <span class="n">char</span> <span class="ow">in</span> <span class="n">search</span><span class="o">.</span><span class="n">object_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">if</span> <span class="n">char</span><span class="o">.</span><span class="n">access</span><span class="p">(</span><span class="n">account</span><span class="p">,</span> <span class="s2">&quot;puppet&quot;</span><span class="p">)</span>
<span class="p">]</span>
<span class="k">if</span> <span class="ow">not</span> <span class="n">new_character</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;That is not a valid character choice.&quot;</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">new_character</span><span class="p">)</span> <span class="o">&gt;</span> <span class="mi">1</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;Multiple targets with the same name:</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="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">%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">key</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">new_character</span><span class="p">)</span>
<span class="k">else</span><span class="p">:</span>
<span class="c1"># argument given</span>
<span class="k">if</span> <span class="n">account</span><span class="o">.</span><span class="n">db</span><span class="o">.</span><span class="n">_playable_characters</span><span class="p">:</span>
<span class="c1"># look at the playable_characters list first</span>
<span class="n">character_candidates</span><span class="o">.</span><span class="n">extend</span><span class="p">(</span>
<span class="n">account</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">candidates</span><span class="o">=</span><span class="n">account</span><span class="o">.</span><span class="n">db</span><span class="o">.</span><span class="n">_playable_characters</span><span class="p">,</span>
<span class="n">search_object</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="p">)</span>
<span class="p">)</span>
<span class="k">return</span>
<span class="k">else</span><span class="p">:</span>
<span class="n">new_character</span> <span class="o">=</span> <span class="n">new_character</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span>
<span class="k">if</span> <span class="n">account</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="n">account</span><span class="p">,</span> <span class="s2">&quot;perm(Builder)&quot;</span><span class="p">):</span>
<span class="c1"># builders and higher should be able to puppet more than their</span>
<span class="c1"># playable characters.</span>
<span class="k">if</span> <span class="n">session</span><span class="o">.</span><span class="n">puppet</span><span class="p">:</span>
<span class="c1"># start by local search - this helps to avoid the user</span>
<span class="c1"># getting locked into their playable characters should one</span>
<span class="c1"># happen to be named the same as another. We replace the suggestion</span>
<span class="c1"># from playable_characters here - this allows builders to puppet objects</span>
<span class="c1"># with the same name as their playable chars should it be necessary</span>
<span class="c1"># (by going to the same location).</span>
<span class="n">character_candidates</span> <span class="o">=</span> <span class="p">[</span>
<span class="n">char</span>
<span class="k">for</span> <span class="n">char</span> <span class="ow">in</span> <span class="n">session</span><span class="o">.</span><span class="n">puppet</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">quiet</span><span class="o">=</span><span class="kc">True</span><span class="p">)</span>
<span class="k">if</span> <span class="n">char</span><span class="o">.</span><span class="n">access</span><span class="p">(</span><span class="n">account</span><span class="p">,</span> <span class="s2">&quot;puppet&quot;</span><span class="p">)</span>
<span class="p">]</span>
<span class="k">if</span> <span class="ow">not</span> <span class="n">character_candidates</span><span class="p">:</span>
<span class="c1"># fall back to global search only if Builder+ has no</span>
<span class="c1"># playable_characers in list and is not standing in a room</span>
<span class="c1"># with a matching char.</span>
<span class="n">character_candidates</span><span class="o">.</span><span class="n">extend</span><span class="p">(</span>
<span class="p">[</span>
<span class="n">char</span>
<span class="k">for</span> <span class="n">char</span> <span class="ow">in</span> <span class="n">search</span><span class="o">.</span><span class="n">object_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">if</span> <span class="n">char</span><span class="o">.</span><span class="n">access</span><span class="p">(</span><span class="n">account</span><span class="p">,</span> <span class="s2">&quot;puppet&quot;</span><span class="p">)</span>
<span class="p">]</span>
<span class="p">)</span>
<span class="c1"># handle possible candidates</span>
<span class="k">if</span> <span class="ow">not</span> <span class="n">character_candidates</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;That is not a valid character choice.&quot;</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">character_candidates</span><span class="p">)</span> <span class="o">&gt;</span> <span class="mi">1</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;Multiple targets with the same name:</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="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">%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">key</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">character_candidates</span><span class="p">)</span>
<span class="p">)</span>
<span class="k">return</span>
<span class="k">else</span><span class="p">:</span>
<span class="n">new_character</span> <span class="o">=</span> <span class="n">character_candidates</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span>
<span class="c1"># do the puppet puppet</span>
<span class="k">try</span><span class="p">:</span>
<span class="n">account</span><span class="o">.</span><span class="n">puppet_object</span><span class="p">(</span><span class="n">session</span><span class="p">,</span> <span class="n">new_character</span><span class="p">)</span>
<span class="n">account</span><span class="o">.</span><span class="n">db</span><span class="o">.</span><span class="n">_last_puppet</span> <span class="o">=</span> <span class="n">new_character</span>

View file

@ -91,35 +91,6 @@
<span class="s2"> Error reported was: &#39;</span><span class="si">%s</span><span class="s2">&#39;</span>
<span class="s2">&quot;&quot;&quot;</span>
<span class="n">_PROCPOOL_BATCHCMD_SOURCE</span> <span class="o">=</span> <span class="s2">&quot;&quot;&quot;</span>
<span class="s2">from evennia.commands.default.batchprocess import batch_cmd_exec, step_pointer, BatchSafeCmdSet</span>
<span class="s2">caller.ndb.batch_stack = commands</span>
<span class="s2">caller.ndb.batch_stackptr = 0</span>
<span class="s2">caller.ndb.batch_batchmode = &quot;batch_commands&quot;</span>
<span class="s2">caller.cmdset.add(BatchSafeCmdSet)</span>
<span class="s2">for inum in range(len(commands)):</span>
<span class="s2"> print &quot;command:&quot;, inum</span>
<span class="s2"> caller.cmdset.add(BatchSafeCmdSet)</span>
<span class="s2"> if not batch_cmd_exec(caller):</span>
<span class="s2"> break</span>
<span class="s2"> step_pointer(caller, 1)</span>
<span class="s2">print &quot;leaving run ...&quot;</span>
<span class="s2">&quot;&quot;&quot;</span>
<span class="n">_PROCPOOL_BATCHCODE_SOURCE</span> <span class="o">=</span> <span class="s2">&quot;&quot;&quot;</span>
<span class="s2">from evennia.commands.default.batchprocess import batch_code_exec, step_pointer, BatchSafeCmdSet</span>
<span class="s2">caller.ndb.batch_stack = codes</span>
<span class="s2">caller.ndb.batch_stackptr = 0</span>
<span class="s2">caller.ndb.batch_batchmode = &quot;batch_code&quot;</span>
<span class="s2">caller.cmdset.add(BatchSafeCmdSet)</span>
<span class="s2">for inum in range(len(codes)):</span>
<span class="s2"> print &quot;code:&quot;, inum</span>
<span class="s2"> caller.cmdset.add(BatchSafeCmdSet)</span>
<span class="s2"> if not batch_code_exec(caller):</span>
<span class="s2"> break</span>
<span class="s2"> step_pointer(caller, 1)</span>
<span class="s2">print &quot;leaving run ...&quot;</span>
<span class="s2">&quot;&quot;&quot;</span>
<span class="c1"># -------------------------------------------------------------</span>
<span class="c1"># Helper functions</span>
@ -341,42 +312,17 @@
<span class="s2">&quot;for </span><span class="si">%s</span><span class="s2"> (this might take some time) ...&quot;</span> <span class="o">%</span> <span class="n">python_path</span>
<span class="p">)</span>
<span class="n">procpool</span> <span class="o">=</span> <span class="kc">False</span>
<span class="k">if</span> <span class="s2">&quot;PythonProcPool&quot;</span> <span class="ow">in</span> <span class="n">utils</span><span class="o">.</span><span class="n">server_services</span><span class="p">():</span>
<span class="k">if</span> <span class="n">utils</span><span class="o">.</span><span class="n">uses_database</span><span class="p">(</span><span class="s2">&quot;sqlite3&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;Batchprocessor disabled ProcPool under SQLite3.&quot;</span><span class="p">)</span>
<span class="k">else</span><span class="p">:</span>
<span class="n">procpool</span> <span class="o">=</span> <span class="kc">True</span>
<span class="k">if</span> <span class="n">procpool</span><span class="p">:</span>
<span class="c1"># run in parallel process</span>
<span class="k">def</span> <span class="nf">callback</span><span class="p">(</span><span class="n">r</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; |GBatchfile &#39;</span><span class="si">%s</span><span class="s2">&#39; applied.&quot;</span> <span class="o">%</span> <span class="n">python_path</span><span class="p">)</span>
<span class="n">purge_processor</span><span class="p">(</span><span class="n">caller</span><span class="p">)</span>
<span class="k">def</span> <span class="nf">errback</span><span class="p">(</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="s2">&quot; |RError from processor: &#39;</span><span class="si">%s</span><span class="s2">&#39;&quot;</span> <span class="o">%</span> <span class="n">e</span><span class="p">)</span>
<span class="n">purge_processor</span><span class="p">(</span><span class="n">caller</span><span class="p">)</span>
<span class="n">utils</span><span class="o">.</span><span class="n">run_async</span><span class="p">(</span>
<span class="n">_PROCPOOL_BATCHCMD_SOURCE</span><span class="p">,</span>
<span class="n">commands</span><span class="o">=</span><span class="n">commands</span><span class="p">,</span>
<span class="n">caller</span><span class="o">=</span><span class="n">caller</span><span class="p">,</span>
<span class="n">at_return</span><span class="o">=</span><span class="n">callback</span><span class="p">,</span>
<span class="n">at_err</span><span class="o">=</span><span class="n">errback</span><span class="p">,</span>
<span class="p">)</span>
<span class="k">else</span><span class="p">:</span>
<span class="c1"># run in-process (might block)</span>
<span class="k">for</span> <span class="n">_</span> <span class="ow">in</span> <span class="nb">range</span><span class="p">(</span><span class="nb">len</span><span class="p">(</span><span class="n">commands</span><span class="p">)):</span>
<span class="c1"># loop through the batch file</span>
<span class="k">if</span> <span class="ow">not</span> <span class="n">batch_cmd_exec</span><span class="p">(</span><span class="n">caller</span><span class="p">):</span>
<span class="k">return</span>
<span class="n">step_pointer</span><span class="p">(</span><span class="n">caller</span><span class="p">,</span> <span class="mi">1</span><span class="p">)</span>
<span class="c1"># clean out the safety cmdset and clean out all other</span>
<span class="c1"># temporary attrs.</span>
<span class="n">string</span> <span class="o">=</span> <span class="s2">&quot; Batchfile &#39;</span><span class="si">%s</span><span class="s2">&#39; applied.&quot;</span> <span class="o">%</span> <span class="n">python_path</span>
<span class="n">caller</span><span class="o">.</span><span class="n">msg</span><span class="p">(</span><span class="s2">&quot;|G</span><span class="si">%s</span><span class="s2">&quot;</span> <span class="o">%</span> <span class="n">string</span><span class="p">)</span>
<span class="n">purge_processor</span><span class="p">(</span><span class="n">caller</span><span class="p">)</span></div></div>
<span class="c1"># run in-process (might block)</span>
<span class="k">for</span> <span class="n">_</span> <span class="ow">in</span> <span class="nb">range</span><span class="p">(</span><span class="nb">len</span><span class="p">(</span><span class="n">commands</span><span class="p">)):</span>
<span class="c1"># loop through the batch file</span>
<span class="k">if</span> <span class="ow">not</span> <span class="n">batch_cmd_exec</span><span class="p">(</span><span class="n">caller</span><span class="p">):</span>
<span class="k">return</span>
<span class="n">step_pointer</span><span class="p">(</span><span class="n">caller</span><span class="p">,</span> <span class="mi">1</span><span class="p">)</span>
<span class="c1"># clean out the safety cmdset and clean out all other</span>
<span class="c1"># temporary attrs.</span>
<span class="n">string</span> <span class="o">=</span> <span class="s2">&quot; Batchfile &#39;</span><span class="si">%s</span><span class="s2">&#39; applied.&quot;</span> <span class="o">%</span> <span class="n">python_path</span>
<span class="n">caller</span><span class="o">.</span><span class="n">msg</span><span class="p">(</span><span class="s2">&quot;|G</span><span class="si">%s</span><span class="s2">&quot;</span> <span class="o">%</span> <span class="n">string</span><span class="p">)</span>
<span class="n">purge_processor</span><span class="p">(</span><span class="n">caller</span><span class="p">)</span></div></div>
<div class="viewcode-block" id="CmdBatchCode"><a class="viewcode-back" href="../../../../api/evennia.commands.default.batchprocess.html#evennia.commands.default.batchprocess.CmdBatchCode">[docs]</a><span class="k">class</span> <span class="nc">CmdBatchCode</span><span class="p">(</span><span class="n">_COMMAND_DEFAULT_CLASS</span><span class="p">):</span>
@ -461,41 +407,16 @@
<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;Running Batch-code processor - Automatic mode for </span><span class="si">%s</span><span class="s2"> ...&quot;</span> <span class="o">%</span> <span class="n">python_path</span><span class="p">)</span>
<span class="n">procpool</span> <span class="o">=</span> <span class="kc">False</span>
<span class="k">if</span> <span class="s2">&quot;PythonProcPool&quot;</span> <span class="ow">in</span> <span class="n">utils</span><span class="o">.</span><span class="n">server_services</span><span class="p">():</span>
<span class="k">if</span> <span class="n">utils</span><span class="o">.</span><span class="n">uses_database</span><span class="p">(</span><span class="s2">&quot;sqlite3&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;Batchprocessor disabled ProcPool under SQLite3.&quot;</span><span class="p">)</span>
<span class="k">else</span><span class="p">:</span>
<span class="n">procpool</span> <span class="o">=</span> <span class="kc">True</span>
<span class="k">if</span> <span class="n">procpool</span><span class="p">:</span>
<span class="c1"># run in parallel process</span>
<span class="k">def</span> <span class="nf">callback</span><span class="p">(</span><span class="n">r</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; |GBatchfile &#39;</span><span class="si">%s</span><span class="s2">&#39; applied.&quot;</span> <span class="o">%</span> <span class="n">python_path</span><span class="p">)</span>
<span class="n">purge_processor</span><span class="p">(</span><span class="n">caller</span><span class="p">)</span>
<span class="k">def</span> <span class="nf">errback</span><span class="p">(</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="s2">&quot; |RError from processor: &#39;</span><span class="si">%s</span><span class="s2">&#39;&quot;</span> <span class="o">%</span> <span class="n">e</span><span class="p">)</span>
<span class="n">purge_processor</span><span class="p">(</span><span class="n">caller</span><span class="p">)</span>
<span class="n">utils</span><span class="o">.</span><span class="n">run_async</span><span class="p">(</span>
<span class="n">_PROCPOOL_BATCHCODE_SOURCE</span><span class="p">,</span>
<span class="n">codes</span><span class="o">=</span><span class="n">codes</span><span class="p">,</span>
<span class="n">caller</span><span class="o">=</span><span class="n">caller</span><span class="p">,</span>
<span class="n">at_return</span><span class="o">=</span><span class="n">callback</span><span class="p">,</span>
<span class="n">at_err</span><span class="o">=</span><span class="n">errback</span><span class="p">,</span>
<span class="p">)</span>
<span class="k">else</span><span class="p">:</span>
<span class="c1"># un in-process (will block)</span>
<span class="k">for</span> <span class="n">_</span> <span class="ow">in</span> <span class="nb">range</span><span class="p">(</span><span class="nb">len</span><span class="p">(</span><span class="n">codes</span><span class="p">)):</span>
<span class="c1"># loop through the batch file</span>
<span class="k">if</span> <span class="ow">not</span> <span class="n">batch_code_exec</span><span class="p">(</span><span class="n">caller</span><span class="p">):</span>
<span class="k">return</span>
<span class="n">step_pointer</span><span class="p">(</span><span class="n">caller</span><span class="p">,</span> <span class="mi">1</span><span class="p">)</span>
<span class="c1"># clean out the safety cmdset and clean out all other</span>
<span class="c1"># temporary attrs.</span>
<span class="n">string</span> <span class="o">=</span> <span class="s2">&quot; Batchfile &#39;</span><span class="si">%s</span><span class="s2">&#39; applied.&quot;</span> <span class="o">%</span> <span class="n">python_path</span>
<span class="n">caller</span><span class="o">.</span><span class="n">msg</span><span class="p">(</span><span class="s2">&quot;|G</span><span class="si">%s</span><span class="s2">&quot;</span> <span class="o">%</span> <span class="n">string</span><span class="p">)</span>
<span class="n">purge_processor</span><span class="p">(</span><span class="n">caller</span><span class="p">)</span></div></div>
<span class="k">for</span> <span class="n">_</span> <span class="ow">in</span> <span class="nb">range</span><span class="p">(</span><span class="nb">len</span><span class="p">(</span><span class="n">codes</span><span class="p">)):</span>
<span class="c1"># loop through the batch file</span>
<span class="k">if</span> <span class="ow">not</span> <span class="n">batch_code_exec</span><span class="p">(</span><span class="n">caller</span><span class="p">):</span>
<span class="k">return</span>
<span class="n">step_pointer</span><span class="p">(</span><span class="n">caller</span><span class="p">,</span> <span class="mi">1</span><span class="p">)</span>
<span class="c1"># clean out the safety cmdset and clean out all other</span>
<span class="c1"># temporary attrs.</span>
<span class="n">string</span> <span class="o">=</span> <span class="s2">&quot; Batchfile &#39;</span><span class="si">%s</span><span class="s2">&#39; applied.&quot;</span> <span class="o">%</span> <span class="n">python_path</span>
<span class="n">caller</span><span class="o">.</span><span class="n">msg</span><span class="p">(</span><span class="s2">&quot;|G</span><span class="si">%s</span><span class="s2">&quot;</span> <span class="o">%</span> <span class="n">string</span><span class="p">)</span>
<span class="n">purge_processor</span><span class="p">(</span><span class="n">caller</span><span class="p">)</span></div></div>
<span class="c1"># -------------------------------------------------------------</span>

View file

@ -57,11 +57,13 @@
<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="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>
@ -1448,6 +1450,7 @@
<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>
@ -1493,10 +1496,16 @@
<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">report_to</span><span class="o">=</span><span class="n">caller</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>
@ -2396,116 +2405,160 @@
<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="k">if</span> <span class="ow">not</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">value</span><span class="p">,</span> <span class="nb">str</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">to_str</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">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="n">string</span> <span class="o">=</span> <span class="s2">&quot;</span><span class="se">\n</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="o">%</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">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="n">string</span> <span class="o">=</span> <span class="s2">&quot;</span><span class="se">\n</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">attr</span><span class="p">,</span> <span class="n">value</span><span class="p">)</span>
<span class="n">string</span> <span class="o">=</span> <span class="n">raw</span><span class="p">(</span><span class="n">string</span><span class="p">)</span>
<span class="k">return</span> <span class="n">string</span></div>
<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="sd"> &quot;&quot;&quot;</span>
<span class="k">if</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">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="kc">None</span>
<span class="n">string</span> <span class="o">=</span> <span class="s2">&quot;&quot;</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">string</span> <span class="o">+=</span> <span class="s2">&quot;</span><span class="se">\n</span><span class="s2">|wPersistent attributes|n:&quot;</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="n">string</span> <span class="o">+=</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="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">string</span> <span class="o">+=</span> <span class="s2">&quot;</span><span class="se">\n</span><span class="s2">|wNon-Persistent attributes|n:&quot;</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="n">string</span> <span class="o">+=</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">return</span> <span class="n">string</span></div>
<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">avail_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"> returns a string.</span>
<span class="sd"> Args:</span>
<span class="sd"> obj (any): Object to analyze.</span>
<span class="sd"> avail_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">string</span> <span class="o">=</span> <span class="s2">&quot;</span><span class="se">\n</span><span class="s2">|wName/key|n: |c</span><span class="si">%s</span><span class="s2">|n (</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">dbref</span><span class="p">)</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">string</span> <span class="o">+=</span> <span class="s2">&quot;</span><span class="se">\n</span><span class="s2">|wAliases|n: </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">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="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">string</span> <span class="o">+=</span> <span class="s2">&quot;</span><span class="se">\n</span><span class="s2">|wSession id(s)|n: </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="s2">&quot;#</span><span class="si">%i</span><span class="s2">&quot;</span> <span class="o">%</span> <span class="n">sess</span><span class="o">.</span><span class="n">sessid</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="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">string</span> <span class="o">+=</span> <span class="s2">&quot;</span><span class="se">\n</span><span class="s2">|wEmail|n: |c</span><span class="si">%s</span><span class="s2">|n&quot;</span> <span class="o">%</span> <span class="n">obj</span><span class="o">.</span><span class="n">email</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">string</span> <span class="o">+=</span> <span class="s2">&quot;</span><span class="se">\n</span><span class="s2">|wAccount|n: |c</span><span class="si">%s</span><span class="s2">|n&quot;</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">name</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">string</span> <span class="o">+=</span> <span class="s2">&quot;</span><span class="se">\n</span><span class="s2">|wAccount Perms|n: </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">perms</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">string</span> <span class="o">+=</span> <span class="s2">&quot; |r(quelled)|n&quot;</span>
<span class="n">string</span> <span class="o">+=</span> <span class="s2">&quot;</span><span class="se">\n</span><span class="s2">|wTypeclass|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">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">typeclass_path</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">string</span> <span class="o">+=</span> <span class="s2">&quot;</span><span class="se">\n</span><span class="s2">|wLocation|n: </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">location</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">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">location</span><span class="o">.</span><span class="n">id</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">string</span> <span class="o">+=</span> <span class="s2">&quot;</span><span class="se">\n</span><span class="s2">|wHome|n: </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">home</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">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">home</span><span class="o">.</span><span class="n">id</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">string</span> <span class="o">+=</span> <span class="s2">&quot;</span><span class="se">\n</span><span class="s2">|wDestination|n: </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">destination</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">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">destination</span><span class="o">.</span><span class="n">id</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">else</span><span class="p">:</span>
<span class="n">perms_string</span> <span class="o">=</span> <span class="s2">&quot;&lt;None&gt;&quot;</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; [Superuser]&quot;</span>
<span class="n">string</span> <span class="o">+=</span> <span class="s2">&quot;</span><span class="se">\n</span><span class="s2">|wPermissions|n: </span><span class="si">%s</span><span class="s2">&quot;</span> <span class="o">%</span> <span class="n">perms_string</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="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">6</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">string</span> <span class="o">+=</span> <span class="s2">&quot;</span><span class="se">\n</span><span class="s2">|wLocks|n:</span><span class="si">%s</span><span class="s2">&quot;</span> <span class="o">%</span> <span class="n">locks_string</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="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">string</span> <span class="o">+=</span> <span class="s2">&quot;</span><span class="se">\n</span><span class="s2">|wStored Cmdset(s)|n:</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="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="s2">&quot;</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">, prio </span><span class="si">%s</span><span class="s2">)&quot;</span>
<span class="o">%</span> <span class="p">(</span><span class="n">cmdset</span><span class="o">.</span><span class="n">path</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="o">.</span><span class="n">mergetype</span><span class="p">,</span> <span class="n">cmdset</span><span class="o">.</span><span class="n">priority</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="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="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">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}</span><span class="s2">)&quot;</span>
<span class="k">for</span> <span class="n">cmdset</span> <span class="ow">in</span> <span class="n">stored_cmdsets</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="c1"># this gets all components of the currently merged set</span>
@ -2539,40 +2592,28 @@
<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="n">string</span> <span class="o">+=</span> <span class="s2">&quot;</span><span class="se">\n</span><span class="s2">|wMerged Cmdset(s)|n:</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="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="s2">&quot;</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">, prio </span><span class="si">%s</span><span class="s2">)&quot;</span>
<span class="o">%</span> <span class="p">(</span><span class="n">cmdset</span><span class="o">.</span><span class="n">path</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="o">.</span><span class="n">mergetype</span><span class="p">,</span> <span class="n">cmdset</span><span class="o">.</span><span class="n">priority</span><span class="p">)</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">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">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}</span><span class="s2">)&quot;</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="c1"># list the commands available to this object</span>
<span class="n">avail_cmdset</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">avail_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="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">avail_cmdset</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">string</span> <span class="o">+=</span> <span class="s2">&quot;</span><span class="se">\n</span><span class="s2">|wCommands available to </span><span class="si">%s</span><span class="s2"> (result of Merged CmdSets)|n:</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">obj</span><span class="o">.</span><span class="n">key</span><span class="p">,</span>
<span class="n">cmdsetstr</span><span class="p">,</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">avail_cmdset</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">string</span> <span class="o">+=</span> <span class="s2">&quot;</span><span class="se">\n</span><span class="s2">|wScripts|n:</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="n">obj</span><span class="o">.</span><span class="n">scripts</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">string</span> <span class="o">+=</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"># display Tags</span>
<span class="n">tags_string</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="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">tag</span><span class="p">,</span> <span class="n">category</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="n">indent</span><span class="o">=</span><span class="mi">5</span><span class="p">,</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_string</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">|wTags[category]|n: </span><span class="si">%s</span><span class="s2">&quot;</span> <span class="o">%</span> <span class="n">tags_string</span><span class="o">.</span><span class="n">strip</span><span class="p">()</span>
<span class="c1"># add the contents</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>
@ -2585,24 +2626,28 @@
<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">string</span> <span class="o">+=</span> <span class="s2">&quot;</span><span class="se">\n</span><span class="s2">|wExits|n: </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="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">exit</span><span class="o">.</span><span class="n">name</span><span class="p">,</span> <span class="n">exit</span><span class="o">.</span><span class="n">dbref</span><span class="p">)</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="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">string</span> <span class="o">+=</span> <span class="s2">&quot;</span><span class="se">\n</span><span class="s2">|wCharacters|n: </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="p">[</span><span class="s2">&quot;|c</span><span class="si">%s</span><span class="s2">|n(</span><span class="si">%s</span><span class="s2">)&quot;</span> <span class="o">%</span> <span class="p">(</span><span class="n">pobj</span><span class="o">.</span><span class="n">name</span><span class="p">,</span> <span class="n">pobj</span><span class="o">.</span><span class="n">dbref</span><span class="p">)</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="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">string</span> <span class="o">+=</span> <span class="s2">&quot;</span><span class="se">\n</span><span class="s2">|wContents|n: </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="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">cont</span><span class="o">.</span><span class="n">name</span><span class="p">,</span> <span class="n">cont</span><span class="o">.</span><span class="n">dbref</span><span class="p">)</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="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="n">separator</span> <span class="o">=</span> <span class="s2">&quot;-&quot;</span> <span class="o">*</span> <span class="n">_DEFAULT_WIDTH</span>
<span class="c1"># output info</span>
<span class="k">return</span> <span class="s2">&quot;</span><span class="si">%s</span><span class="se">\n</span><span class="si">%s</span><span class="se">\n</span><span class="si">%s</span><span class="s2">&quot;</span> <span class="o">%</span> <span class="p">(</span><span class="n">separator</span><span class="p">,</span> <span class="n">string</span><span class="o">.</span><span class="n">strip</span><span class="p">(),</span> <span class="n">separator</span><span class="p">)</span></div>
<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>
@ -2617,8 +2662,7 @@
<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="n">string</span> <span class="o">=</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="bp">self</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>
<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>
@ -2672,7 +2716,13 @@
<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">caller</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_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="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>

View file

@ -467,11 +467,16 @@
<span class="k">if</span> <span class="ow">not</span> <span class="n">obj</span><span class="o">.</span><span class="n">at_before_get</span><span class="p">(</span><span class="n">caller</span><span class="p">):</span>
<span class="k">return</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="p">,</span> <span class="n">quiet</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;You pick up </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="p">)</span>
<span class="n">caller</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"> picks up </span><span class="si">%s</span><span class="s2">.&quot;</span> <span class="o">%</span> <span class="p">(</span><span class="n">caller</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">name</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="c1"># calling at_get hook method</span>
<span class="n">obj</span><span class="o">.</span><span class="n">at_get</span><span class="p">(</span><span class="n">caller</span><span class="p">)</span></div></div>
<span class="n">success</span> <span class="o">=</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="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">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;This can&#39;t be picked up.&quot;</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 pick up </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="p">)</span>
<span class="n">caller</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"> picks up </span><span class="si">%s</span><span class="s2">.&quot;</span> <span class="o">%</span> <span class="p">(</span><span class="n">caller</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">name</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="c1"># calling at_get hook method</span>
<span class="n">obj</span><span class="o">.</span><span class="n">at_get</span><span class="p">(</span><span class="n">caller</span><span class="p">)</span></div></div>
<div class="viewcode-block" id="CmdDrop"><a class="viewcode-back" href="../../../../api/evennia.commands.default.general.html#evennia.commands.default.general.CmdDrop">[docs]</a><span class="k">class</span> <span class="nc">CmdDrop</span><span class="p">(</span><span class="n">COMMAND_DEFAULT_CLASS</span><span class="p">):</span>
@ -512,11 +517,14 @@
<span class="k">if</span> <span class="ow">not</span> <span class="n">obj</span><span class="o">.</span><span class="n">at_before_drop</span><span class="p">(</span><span class="n">caller</span><span class="p">):</span>
<span class="k">return</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="n">caller</span><span class="o">.</span><span class="n">msg</span><span class="p">(</span><span class="s2">&quot;You drop </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">caller</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"> drops </span><span class="si">%s</span><span class="s2">.&quot;</span> <span class="o">%</span> <span class="p">(</span><span class="n">caller</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">name</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="c1"># Call the object script&#39;s at_drop() method.</span>
<span class="n">obj</span><span class="o">.</span><span class="n">at_drop</span><span class="p">(</span><span class="n">caller</span><span class="p">)</span></div></div>
<span class="n">success</span> <span class="o">=</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="ow">not</span> <span class="n">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;This couldn&#39;t be dropped.&quot;</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 drop </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">caller</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"> drops </span><span class="si">%s</span><span class="s2">.&quot;</span> <span class="o">%</span> <span class="p">(</span><span class="n">caller</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">name</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="c1"># Call the object script&#39;s at_drop() method.</span>
<span class="n">obj</span><span class="o">.</span><span class="n">at_drop</span><span class="p">(</span><span class="n">caller</span><span class="p">)</span></div></div>
<div class="viewcode-block" id="CmdGive"><a class="viewcode-back" href="../../../../api/evennia.commands.default.general.html#evennia.commands.default.general.CmdGive">[docs]</a><span class="k">class</span> <span class="nc">CmdGive</span><span class="p">(</span><span class="n">COMMAND_DEFAULT_CLASS</span><span class="p">):</span>
@ -563,11 +571,14 @@
<span class="k">return</span>
<span class="c1"># give object</span>
<span class="n">caller</span><span class="o">.</span><span class="n">msg</span><span class="p">(</span><span class="s2">&quot;You give </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">to_give</span><span class="o">.</span><span class="n">key</span><span class="p">,</span> <span class="n">target</span><span class="o">.</span><span class="n">key</span><span class="p">))</span>
<span class="n">to_give</span><span class="o">.</span><span class="n">move_to</span><span class="p">(</span><span class="n">target</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">target</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"> gives you </span><span class="si">%s</span><span class="s2">.&quot;</span> <span class="o">%</span> <span class="p">(</span><span class="n">caller</span><span class="o">.</span><span class="n">key</span><span class="p">,</span> <span class="n">to_give</span><span class="o">.</span><span class="n">key</span><span class="p">))</span>
<span class="c1"># Call the object script&#39;s at_give() method.</span>
<span class="n">to_give</span><span class="o">.</span><span class="n">at_give</span><span class="p">(</span><span class="n">caller</span><span class="p">,</span> <span class="n">target</span><span class="p">)</span></div></div>
<span class="n">success</span> <span class="o">=</span> <span class="n">to_give</span><span class="o">.</span><span class="n">move_to</span><span class="p">(</span><span class="n">target</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">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;This could not be given.&quot;</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 give </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">to_give</span><span class="o">.</span><span class="n">key</span><span class="p">,</span> <span class="n">target</span><span class="o">.</span><span class="n">key</span><span class="p">))</span>
<span class="n">target</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"> gives you </span><span class="si">%s</span><span class="s2">.&quot;</span> <span class="o">%</span> <span class="p">(</span><span class="n">caller</span><span class="o">.</span><span class="n">key</span><span class="p">,</span> <span class="n">to_give</span><span class="o">.</span><span class="n">key</span><span class="p">))</span>
<span class="c1"># Call the object script&#39;s at_give() method.</span>
<span class="n">to_give</span><span class="o">.</span><span class="n">at_give</span><span class="p">(</span><span class="n">caller</span><span class="p">,</span> <span class="n">target</span><span class="p">)</span></div></div>
<div class="viewcode-block" id="CmdSetDesc"><a class="viewcode-back" href="../../../../api/evennia.commands.default.general.html#evennia.commands.default.general.CmdSetDesc">[docs]</a><span class="k">class</span> <span class="nc">CmdSetDesc</span><span class="p">(</span><span class="n">COMMAND_DEFAULT_CLASS</span><span class="p">):</span>

View file

@ -243,12 +243,6 @@
<span class="k">else</span><span class="p">:</span>
<span class="bp">self</span><span class="o">.</span><span class="n">character</span> <span class="o">=</span> <span class="kc">None</span></div>
<span class="k">def</span> <span class="nf">get_command_info</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> Update of parent class&#39;s get_command_info() for MuxCommand.</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="bp">self</span><span class="o">.</span><span class="n">get_command_info</span><span class="p">()</span>
<div class="viewcode-block" id="MuxCommand.get_command_info"><a class="viewcode-back" href="../../../../api/evennia.commands.default.muxcommand.html#evennia.commands.default.muxcommand.MuxCommand.get_command_info">[docs]</a> <span class="k">def</span> <span class="nf">get_command_info</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> Update of parent class&#39;s get_command_info() for MuxCommand.</span>

View file

@ -489,7 +489,9 @@
<span class="n">table</span><span class="o">.</span><span class="n">add_row</span><span class="p">(</span>
<span class="n">script</span><span class="o">.</span><span class="n">id</span><span class="p">,</span>
<span class="n">script</span><span class="o">.</span><span class="n">obj</span><span class="o">.</span><span class="n">key</span> <span class="k">if</span> <span class="p">(</span><span class="nb">hasattr</span><span class="p">(</span><span class="n">script</span><span class="p">,</span> <span class="s2">&quot;obj&quot;</span><span class="p">)</span> <span class="ow">and</span> <span class="n">script</span><span class="o">.</span><span class="n">obj</span><span class="p">)</span> <span class="k">else</span> <span class="s2">&quot;&lt;Global&gt;&quot;</span><span class="p">,</span>
<span class="n">f</span><span class="s2">&quot;</span><span class="si">{script.obj.key}</span><span class="s2">(</span><span class="si">{script.obj.dbref}</span><span class="s2">)&quot;</span>
<span class="k">if</span> <span class="p">(</span><span class="nb">hasattr</span><span class="p">(</span><span class="n">script</span><span class="p">,</span> <span class="s2">&quot;obj&quot;</span><span class="p">)</span> <span class="ow">and</span> <span class="n">script</span><span class="o">.</span><span class="n">obj</span><span class="p">)</span>
<span class="k">else</span> <span class="s2">&quot;&lt;Global&gt;&quot;</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="n">script</span><span class="o">.</span><span class="n">interval</span> <span class="k">if</span> <span class="n">script</span><span class="o">.</span><span class="n">interval</span> <span class="o">&gt;</span> <span class="mi">0</span> <span class="k">else</span> <span class="s2">&quot;--&quot;</span><span class="p">,</span>
<span class="n">nextrep</span><span class="p">,</span>

View file

@ -58,7 +58,7 @@
<span class="kn">from</span> <span class="nn">anything</span> <span class="k">import</span> <span class="n">Anything</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">mock</span> <span class="k">import</span> <span class="n">Mock</span><span class="p">,</span> <span class="n">mock</span>
<span class="kn">from</span> <span class="nn">unittest.mock</span> <span class="k">import</span> <span class="n">patch</span><span class="p">,</span> <span class="n">Mock</span><span class="p">,</span> <span class="n">MagicMock</span>
<span class="kn">from</span> <span class="nn">evennia</span> <span class="k">import</span> <span class="n">DefaultRoom</span><span class="p">,</span> <span class="n">DefaultExit</span><span class="p">,</span> <span class="n">ObjectDB</span>
<span class="kn">from</span> <span class="nn">evennia.commands.default.cmdset_character</span> <span class="k">import</span> <span class="n">CharacterCmdSet</span>
@ -97,7 +97,8 @@
<span class="c1"># ------------------------------------------------------------</span>
<div class="viewcode-block" id="CommandTest"><a class="viewcode-back" href="../../../../api/evennia.commands.default.tests.html#evennia.commands.default.tests.CommandTest">[docs]</a><span class="k">class</span> <span class="nc">CommandTest</span><span class="p">(</span><span class="n">EvenniaTest</span><span class="p">):</span>
<div class="viewcode-block" id="CommandTest"><a class="viewcode-back" href="../../../../api/evennia.commands.default.tests.html#evennia.commands.default.tests.CommandTest">[docs]</a><span class="nd">@patch</span><span class="p">(</span><span class="s2">&quot;evennia.server.portal.portal.LoopingCall&quot;</span><span class="p">,</span> <span class="n">new</span><span class="o">=</span><span class="n">MagicMock</span><span class="p">())</span>
<span class="k">class</span> <span class="nc">CommandTest</span><span class="p">(</span><span class="n">EvenniaTest</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> Tests a command</span>
<span class="sd"> &quot;&quot;&quot;</span>
@ -190,11 +191,18 @@
<span class="n">returned_msg</span> <span class="o">=</span> <span class="n">msg_sep</span><span class="o">.</span><span class="n">join</span><span class="p">(</span>
<span class="n">_RE</span><span class="o">.</span><span class="n">sub</span><span class="p">(</span><span class="s2">&quot;&quot;</span><span class="p">,</span> <span class="n">ansi</span><span class="o">.</span><span class="n">parse_ansi</span><span class="p">(</span><span class="n">mess</span><span class="p">,</span> <span class="n">strip_ansi</span><span class="o">=</span><span class="n">noansi</span><span class="p">))</span> <span class="k">for</span> <span class="n">mess</span> <span class="ow">in</span> <span class="n">stored_msg</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="n">msg</span> <span class="o">==</span> <span class="s2">&quot;&quot;</span> <span class="ow">and</span> <span class="n">returned_msg</span> <span class="ow">or</span> <span class="ow">not</span> <span class="n">returned_msg</span><span class="o">.</span><span class="n">startswith</span><span class="p">(</span><span class="n">msg</span><span class="o">.</span><span class="n">strip</span><span class="p">()):</span>
<span class="n">msg</span> <span class="o">=</span> <span class="n">msg</span><span class="o">.</span><span class="n">strip</span><span class="p">()</span>
<span class="k">if</span> <span class="n">msg</span> <span class="o">==</span> <span class="s2">&quot;&quot;</span> <span class="ow">and</span> <span class="n">returned_msg</span> <span class="ow">or</span> <span class="ow">not</span> <span class="n">returned_msg</span><span class="o">.</span><span class="n">startswith</span><span class="p">(</span><span class="n">msg</span><span class="p">):</span>
<span class="n">prt</span> <span class="o">=</span> <span class="s2">&quot;&quot;</span>
<span class="k">for</span> <span class="n">ic</span><span class="p">,</span> <span class="n">char</span> <span class="ow">in</span> <span class="nb">enumerate</span><span class="p">(</span><span class="n">msg</span><span class="p">):</span>
<span class="kn">import</span> <span class="nn">re</span>
<span class="n">prt</span> <span class="o">+=</span> <span class="n">char</span>
<span class="n">sep1</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;=&quot;</span> <span class="o">*</span> <span class="mi">30</span> <span class="o">+</span> <span class="s2">&quot;Wanted message&quot;</span> <span class="o">+</span> <span class="s2">&quot;=&quot;</span> <span class="o">*</span> <span class="mi">34</span> <span class="o">+</span> <span class="s2">&quot;</span><span class="se">\n</span><span class="s2">&quot;</span>
<span class="n">sep2</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;=&quot;</span> <span class="o">*</span> <span class="mi">30</span> <span class="o">+</span> <span class="s2">&quot;Returned message&quot;</span> <span class="o">+</span> <span class="s2">&quot;=&quot;</span> <span class="o">*</span> <span class="mi">32</span> <span class="o">+</span> <span class="s2">&quot;</span><span class="se">\n</span><span class="s2">&quot;</span>
<span class="n">sep3</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;=&quot;</span> <span class="o">*</span> <span class="mi">78</span>
<span class="n">retval</span> <span class="o">=</span> <span class="n">sep1</span> <span class="o">+</span> <span class="n">msg</span><span class="o">.</span><span class="n">strip</span><span class="p">()</span> <span class="o">+</span> <span class="n">sep2</span> <span class="o">+</span> <span class="n">returned_msg</span> <span class="o">+</span> <span class="n">sep3</span>
<span class="n">retval</span> <span class="o">=</span> <span class="n">sep1</span> <span class="o">+</span> <span class="n">msg</span> <span class="o">+</span> <span class="n">sep2</span> <span class="o">+</span> <span class="n">returned_msg</span> <span class="o">+</span> <span class="n">sep3</span>
<span class="k">raise</span> <span class="ne">AssertionError</span><span class="p">(</span><span class="n">retval</span><span class="p">)</span>
<span class="k">else</span><span class="p">:</span>
<span class="n">returned_msg</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">str</span><span class="p">(</span><span class="n">msg</span><span class="p">)</span> <span class="k">for</span> <span class="n">msg</span> <span class="ow">in</span> <span class="n">stored_msg</span><span class="p">)</span>
@ -400,11 +408,29 @@
<span class="bp">self</span><span class="o">.</span><span class="n">call</span><span class="p">(</span><span class="n">account</span><span class="o">.</span><span class="n">CmdOOC</span><span class="p">(),</span> <span class="s2">&quot;&quot;</span><span class="p">,</span> <span class="s2">&quot;You go OOC.&quot;</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">account</span><span class="p">)</span></div>
<div class="viewcode-block" id="TestAccount.test_ic"><a class="viewcode-back" href="../../../../api/evennia.commands.default.tests.html#evennia.commands.default.tests.TestAccount.test_ic">[docs]</a> <span class="k">def</span> <span class="nf">test_ic</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="bp">self</span><span class="o">.</span><span class="n">account</span><span class="o">.</span><span class="n">db</span><span class="o">.</span><span class="n">_playable_characters</span> <span class="o">=</span> <span class="p">[</span><span class="bp">self</span><span class="o">.</span><span class="n">char1</span><span class="p">]</span>
<span class="bp">self</span><span class="o">.</span><span class="n">account</span><span class="o">.</span><span class="n">unpuppet_object</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">session</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">call</span><span class="p">(</span>
<span class="n">account</span><span class="o">.</span><span class="n">CmdIC</span><span class="p">(),</span> <span class="s2">&quot;Char&quot;</span><span class="p">,</span> <span class="s2">&quot;You become Char.&quot;</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">account</span><span class="p">,</span> <span class="n">receiver</span><span class="o">=</span><span class="bp">self</span><span class="o">.</span><span class="n">char1</span>
<span class="p">)</span></div>
<div class="viewcode-block" id="TestAccount.test_ic__other_object"><a class="viewcode-back" href="../../../../api/evennia.commands.default.tests.html#evennia.commands.default.tests.TestAccount.test_ic__other_object">[docs]</a> <span class="k">def</span> <span class="nf">test_ic__other_object</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="bp">self</span><span class="o">.</span><span class="n">account</span><span class="o">.</span><span class="n">db</span><span class="o">.</span><span class="n">_playable_characters</span> <span class="o">=</span> <span class="p">[</span><span class="bp">self</span><span class="o">.</span><span class="n">obj1</span><span class="p">]</span>
<span class="bp">self</span><span class="o">.</span><span class="n">account</span><span class="o">.</span><span class="n">unpuppet_object</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">session</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">call</span><span class="p">(</span>
<span class="n">account</span><span class="o">.</span><span class="n">CmdIC</span><span class="p">(),</span> <span class="s2">&quot;Obj&quot;</span><span class="p">,</span> <span class="s2">&quot;You become Obj.&quot;</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">account</span><span class="p">,</span> <span class="n">receiver</span><span class="o">=</span><span class="bp">self</span><span class="o">.</span><span class="n">obj1</span>
<span class="p">)</span></div>
<div class="viewcode-block" id="TestAccount.test_ic__nonaccess"><a class="viewcode-back" href="../../../../api/evennia.commands.default.tests.html#evennia.commands.default.tests.TestAccount.test_ic__nonaccess">[docs]</a> <span class="k">def</span> <span class="nf">test_ic__nonaccess</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="bp">self</span><span class="o">.</span><span class="n">account</span><span class="o">.</span><span class="n">unpuppet_object</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">session</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">call</span><span class="p">(</span>
<span class="n">account</span><span class="o">.</span><span class="n">CmdIC</span><span class="p">(),</span>
<span class="s2">&quot;Nonexistent&quot;</span><span class="p">,</span>
<span class="s2">&quot;That is not a valid character choice.&quot;</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">account</span><span class="p">,</span>
<span class="n">receiver</span><span class="o">=</span><span class="bp">self</span><span class="o">.</span><span class="n">account</span><span class="p">,</span>
<span class="p">)</span></div>
<div class="viewcode-block" id="TestAccount.test_password"><a class="viewcode-back" href="../../../../api/evennia.commands.default.tests.html#evennia.commands.default.tests.TestAccount.test_password">[docs]</a> <span class="k">def</span> <span class="nf">test_password</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="bp">self</span><span class="o">.</span><span class="n">call</span><span class="p">(</span>
<span class="n">account</span><span class="o">.</span><span class="n">CmdPassword</span><span class="p">(),</span>
@ -510,10 +536,18 @@
<span class="bp">self</span><span class="o">.</span><span class="n">call</span><span class="p">(</span><span class="n">building</span><span class="o">.</span><span class="n">CmdExamine</span><span class="p">(),</span> <span class="s2">&quot;*TestAccount&quot;</span><span class="p">,</span> <span class="s2">&quot;Name/key: TestAccount&quot;</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">char1</span><span class="o">.</span><span class="n">db</span><span class="o">.</span><span class="n">test</span> <span class="o">=</span> <span class="s2">&quot;testval&quot;</span>
<span class="bp">self</span><span class="o">.</span><span class="n">call</span><span class="p">(</span><span class="n">building</span><span class="o">.</span><span class="n">CmdExamine</span><span class="p">(),</span> <span class="s2">&quot;self/test&quot;</span><span class="p">,</span> <span class="s2">&quot;Persistent attributes:</span><span class="se">\n</span><span class="s2"> test = testval&quot;</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">call</span><span class="p">(</span><span class="n">building</span><span class="o">.</span><span class="n">CmdExamine</span><span class="p">(),</span> <span class="s2">&quot;self/test&quot;</span><span class="p">,</span> <span class="s2">&quot;Persistent attribute(s):</span><span class="se">\n</span><span class="s2"> test = testval&quot;</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">call</span><span class="p">(</span><span class="n">building</span><span class="o">.</span><span class="n">CmdExamine</span><span class="p">(),</span> <span class="s2">&quot;NotFound&quot;</span><span class="p">,</span> <span class="s2">&quot;Could not find &#39;NotFound&#39;.&quot;</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">call</span><span class="p">(</span><span class="n">building</span><span class="o">.</span><span class="n">CmdExamine</span><span class="p">(),</span> <span class="s2">&quot;out&quot;</span><span class="p">,</span> <span class="s2">&quot;Name/key: out&quot;</span><span class="p">)</span>
<span class="c1"># escape inlinefuncs</span>
<span class="bp">self</span><span class="o">.</span><span class="n">char1</span><span class="o">.</span><span class="n">db</span><span class="o">.</span><span class="n">test2</span> <span class="o">=</span> <span class="s2">&quot;this is a $random() value.&quot;</span>
<span class="bp">self</span><span class="o">.</span><span class="n">call</span><span class="p">(</span>
<span class="n">building</span><span class="o">.</span><span class="n">CmdExamine</span><span class="p">(),</span>
<span class="s2">&quot;self/test2&quot;</span><span class="p">,</span>
<span class="s2">&quot;Persistent attribute(s):</span><span class="se">\n</span><span class="s2"> test2 = this is a \$random() value.&quot;</span><span class="p">,</span>
<span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">room1</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">script</span><span class="o">.</span><span class="vm">__class__</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">call</span><span class="p">(</span><span class="n">building</span><span class="o">.</span><span class="n">CmdExamine</span><span class="p">(),</span> <span class="s2">&quot;&quot;</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">account</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">script</span><span class="o">.</span><span class="vm">__class__</span><span class="p">)</span>
@ -559,7 +593,7 @@
<span class="bp">self</span><span class="o">.</span><span class="n">call</span><span class="p">(</span><span class="n">building</span><span class="o">.</span><span class="n">CmdSetAttribute</span><span class="p">(),</span> <span class="s2">&quot;Obj2/test2&quot;</span><span class="p">,</span> <span class="s2">&quot;Attribute Obj2/test2 = value2&quot;</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">call</span><span class="p">(</span><span class="n">building</span><span class="o">.</span><span class="n">CmdSetAttribute</span><span class="p">(),</span> <span class="s2">&quot;Obj2/NotFound&quot;</span><span class="p">,</span> <span class="s2">&quot;Obj2 has no attribute &#39;notfound&#39;.&quot;</span><span class="p">)</span>
<span class="k">with</span> <span class="n">mock</span><span class="o">.</span><span class="n">patch</span><span class="p">(</span><span class="s2">&quot;evennia.commands.default.building.EvEditor&quot;</span><span class="p">)</span> <span class="k">as</span> <span class="n">mock_ed</span><span class="p">:</span>
<span class="k">with</span> <span class="n">patch</span><span class="p">(</span><span class="s2">&quot;evennia.commands.default.building.EvEditor&quot;</span><span class="p">)</span> <span class="k">as</span> <span class="n">mock_ed</span><span class="p">:</span>
<span class="bp">self</span><span class="o">.</span><span class="n">call</span><span class="p">(</span><span class="n">building</span><span class="o">.</span><span class="n">CmdSetAttribute</span><span class="p">(),</span> <span class="s2">&quot;/edit Obj2/test3&quot;</span><span class="p">)</span>
<span class="n">mock_ed</span><span class="o">.</span><span class="n">assert_called_with</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">char1</span><span class="p">,</span> <span class="n">Anything</span><span class="p">,</span> <span class="n">Anything</span><span class="p">,</span> <span class="n">key</span><span class="o">=</span><span class="s2">&quot;Obj2/test3&quot;</span><span class="p">)</span>
@ -843,7 +877,7 @@
<span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">call</span><span class="p">(</span><span class="n">building</span><span class="o">.</span><span class="n">CmdDesc</span><span class="p">(),</span> <span class="s2">&quot;&quot;</span><span class="p">,</span> <span class="s2">&quot;Usage: &quot;</span><span class="p">)</span>
<span class="k">with</span> <span class="n">mock</span><span class="o">.</span><span class="n">patch</span><span class="p">(</span><span class="s2">&quot;evennia.commands.default.building.EvEditor&quot;</span><span class="p">)</span> <span class="k">as</span> <span class="n">mock_ed</span><span class="p">:</span>
<span class="k">with</span> <span class="n">patch</span><span class="p">(</span><span class="s2">&quot;evennia.commands.default.building.EvEditor&quot;</span><span class="p">)</span> <span class="k">as</span> <span class="n">mock_ed</span><span class="p">:</span>
<span class="bp">self</span><span class="o">.</span><span class="n">call</span><span class="p">(</span><span class="n">building</span><span class="o">.</span><span class="n">CmdDesc</span><span class="p">(),</span> <span class="s2">&quot;/edit&quot;</span><span class="p">)</span>
<span class="n">mock_ed</span><span class="o">.</span><span class="n">assert_called_with</span><span class="p">(</span>
<span class="bp">self</span><span class="o">.</span><span class="n">char1</span><span class="p">,</span>
@ -1058,9 +1092,9 @@
<span class="p">}</span>
<span class="p">)</span>
<span class="p">]</span>
<span class="k">with</span> <span class="n">mock</span><span class="o">.</span><span class="n">patch</span><span class="p">(</span>
<span class="k">with</span> <span class="n">patch</span><span class="p">(</span>
<span class="s2">&quot;evennia.commands.default.building.protlib.search_prototype&quot;</span><span class="p">,</span>
<span class="n">new</span><span class="o">=</span><span class="n">mock</span><span class="o">.</span><span class="n">MagicMock</span><span class="p">(</span><span class="n">return_value</span><span class="o">=</span><span class="n">test_prototype</span><span class="p">),</span>
<span class="n">new</span><span class="o">=</span><span class="n">MagicMock</span><span class="p">(</span><span class="n">return_value</span><span class="o">=</span><span class="n">test_prototype</span><span class="p">),</span>
<span class="p">)</span> <span class="k">as</span> <span class="n">mprot</span><span class="p">:</span>
<span class="bp">self</span><span class="o">.</span><span class="n">call</span><span class="p">(</span>
<span class="n">building</span><span class="o">.</span><span class="n">CmdTypeclass</span><span class="p">(),</span>
@ -1126,7 +1160,7 @@
<span class="bp">self</span><span class="o">.</span><span class="n">call</span><span class="p">(</span><span class="n">building</span><span class="o">.</span><span class="n">CmdFind</span><span class="p">(),</span> <span class="s2">&quot;/exact Obj&quot;</span><span class="p">,</span> <span class="s2">&quot;One Match&quot;</span><span class="p">)</span>
<span class="c1"># Test multitype filtering</span>
<span class="k">with</span> <span class="n">mock</span><span class="o">.</span><span class="n">patch</span><span class="p">(</span>
<span class="k">with</span> <span class="n">patch</span><span class="p">(</span>
<span class="s2">&quot;evennia.commands.default.building.CHAR_TYPECLASS&quot;</span><span class="p">,</span>
<span class="s2">&quot;evennia.objects.objects.DefaultCharacter&quot;</span><span class="p">,</span>
<span class="p">):</span>
@ -1166,7 +1200,7 @@
<span class="s2">&quot;= Obj&quot;</span><span class="p">,</span>
<span class="s2">&quot;To create a global script you need scripts/add &lt;typeclass&gt;.&quot;</span><span class="p">,</span>
<span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">call</span><span class="p">(</span><span class="n">building</span><span class="o">.</span><span class="n">CmdScript</span><span class="p">(),</span> <span class="s2">&quot;Obj = &quot;</span><span class="p">,</span> <span class="s2">&quot;dbref obj&quot;</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">call</span><span class="p">(</span><span class="n">building</span><span class="o">.</span><span class="n">CmdScript</span><span class="p">(),</span> <span class="s2">&quot;Obj = &quot;</span><span class="p">,</span> <span class="s2">&quot;dbref obj&quot;</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">call</span><span class="p">(</span>
<span class="n">building</span><span class="o">.</span><span class="n">CmdScript</span><span class="p">(),</span> <span class="s2">&quot;/start Obj&quot;</span><span class="p">,</span> <span class="s2">&quot;0 scripts started on Obj&quot;</span>
@ -1594,11 +1628,11 @@
<span class="bp">self</span><span class="o">.</span><span class="n">call</span><span class="p">(</span><span class="n">multimatch</span><span class="p">,</span> <span class="s2">&quot;look&quot;</span><span class="p">,</span> <span class="s2">&quot;&quot;</span><span class="p">)</span></div>
<div class="viewcode-block" id="TestSystemCommands.test_channelcommand"><a class="viewcode-back" href="../../../../api/evennia.commands.default.tests.html#evennia.commands.default.tests.TestSystemCommands.test_channelcommand">[docs]</a> <span class="nd">@mock</span><span class="o">.</span><span class="n">patch</span><span class="p">(</span><span class="s2">&quot;evennia.commands.default.syscommands.ChannelDB&quot;</span><span class="p">)</span>
<div class="viewcode-block" id="TestSystemCommands.test_channelcommand"><a class="viewcode-back" href="../../../../api/evennia.commands.default.tests.html#evennia.commands.default.tests.TestSystemCommands.test_channelcommand">[docs]</a> <span class="nd">@patch</span><span class="p">(</span><span class="s2">&quot;evennia.commands.default.syscommands.ChannelDB&quot;</span><span class="p">)</span>
<span class="k">def</span> <span class="nf">test_channelcommand</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">mock_channeldb</span><span class="p">):</span>
<span class="n">channel</span> <span class="o">=</span> <span class="n">mock</span><span class="o">.</span><span class="n">MagicMock</span><span class="p">()</span>
<span class="n">channel</span><span class="o">.</span><span class="n">msg</span> <span class="o">=</span> <span class="n">mock</span><span class="o">.</span><span class="n">MagicMock</span><span class="p">()</span>
<span class="n">mock_channeldb</span><span class="o">.</span><span class="n">objects</span><span class="o">.</span><span class="n">get_channel</span> <span class="o">=</span> <span class="n">mock</span><span class="o">.</span><span class="n">MagicMock</span><span class="p">(</span><span class="n">return_value</span><span class="o">=</span><span class="n">channel</span><span class="p">)</span>
<span class="n">channel</span> <span class="o">=</span> <span class="n">MagicMock</span><span class="p">()</span>
<span class="n">channel</span><span class="o">.</span><span class="n">msg</span> <span class="o">=</span> <span class="n">MagicMock</span><span class="p">()</span>
<span class="n">mock_channeldb</span><span class="o">.</span><span class="n">objects</span><span class="o">.</span><span class="n">get_channel</span> <span class="o">=</span> <span class="n">MagicMock</span><span class="p">(</span><span class="n">return_value</span><span class="o">=</span><span class="n">channel</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">call</span><span class="p">(</span><span class="n">syscommands</span><span class="o">.</span><span class="n">SystemSendToChannel</span><span class="p">(),</span> <span class="s2">&quot;public:Hello&quot;</span><span class="p">)</span>
<span class="n">channel</span><span class="o">.</span><span class="n">msg</span><span class="o">.</span><span class="n">assert_called</span><span class="p">()</span></div></div>

View file

@ -91,7 +91,9 @@
<span class="k">if</span> <span class="n">cdict</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s2">&quot;keep_log&quot;</span><span class="p">):</span>
<span class="bp">self</span><span class="o">.</span><span class="n">attributes</span><span class="o">.</span><span class="n">add</span><span class="p">(</span><span class="s2">&quot;keep_log&quot;</span><span class="p">,</span> <span class="n">cdict</span><span class="p">[</span><span class="s2">&quot;keep_log&quot;</span><span class="p">])</span>
<span class="k">if</span> <span class="n">cdict</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s2">&quot;desc&quot;</span><span class="p">):</span>
<span class="bp">self</span><span class="o">.</span><span class="n">attributes</span><span class="o">.</span><span class="n">add</span><span class="p">(</span><span class="s2">&quot;desc&quot;</span><span class="p">,</span> <span class="n">cdict</span><span class="p">[</span><span class="s2">&quot;desc&quot;</span><span class="p">])</span></div>
<span class="bp">self</span><span class="o">.</span><span class="n">attributes</span><span class="o">.</span><span class="n">add</span><span class="p">(</span><span class="s2">&quot;desc&quot;</span><span class="p">,</span> <span class="n">cdict</span><span class="p">[</span><span class="s2">&quot;desc&quot;</span><span class="p">])</span>
<span class="k">if</span> <span class="n">cdict</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s2">&quot;tags&quot;</span><span class="p">):</span>
<span class="bp">self</span><span class="o">.</span><span class="n">tags</span><span class="o">.</span><span class="n">batch_add</span><span class="p">(</span><span class="o">*</span><span class="n">cdict</span><span class="p">[</span><span class="s2">&quot;tags&quot;</span><span class="p">])</span></div>
<div class="viewcode-block" id="DefaultChannel.basetype_setup"><a class="viewcode-back" href="../../../api/evennia.comms.comms.html#evennia.comms.comms.DefaultChannel.basetype_setup">[docs]</a> <span class="k">def</span> <span class="nf">basetype_setup</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="c1"># delayed import of the channelhandler</span>
@ -435,7 +437,8 @@
<span class="sd"> to build senders for the message.</span>
<span class="sd"> sender_strings (list, optional): Name strings of senders. Used for external</span>
<span class="sd"> connections where the sender is not an account or object.</span>
<span class="sd"> When this is defined, external will be assumed.</span>
<span class="sd"> When this is defined, external will be assumed. The list will be </span>
<span class="sd"> filtered so each sender-string only occurs once.</span>
<span class="sd"> keep_log (bool or None, optional): This allows to temporarily change the logging status of</span>
<span class="sd"> this channel message. If `None`, the Channel&#39;s `keep_log` Attribute will</span>
<span class="sd"> be used. If `True` or `False`, that logging status will be used for this</span>
@ -466,6 +469,8 @@
<span class="n">msgobj</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">pre_send_message</span><span class="p">(</span><span class="n">msgobj</span><span class="p">)</span>
<span class="k">if</span> <span class="ow">not</span> <span class="n">msgobj</span><span class="p">:</span>
<span class="k">return</span> <span class="kc">False</span>
<span class="k">if</span> <span class="n">sender_strings</span><span class="p">:</span>
<span class="n">sender_strings</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">make_iter</span><span class="p">(</span><span class="n">sender_strings</span><span class="p">)))</span>
<span class="n">msgobj</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">message_transform</span><span class="p">(</span>
<span class="n">msgobj</span><span class="p">,</span> <span class="n">emit</span><span class="o">=</span><span class="n">emit</span><span class="p">,</span> <span class="n">sender_strings</span><span class="o">=</span><span class="n">sender_strings</span><span class="p">,</span> <span class="n">external</span><span class="o">=</span><span class="n">external</span>
<span class="p">)</span>

View file

@ -184,9 +184,9 @@
<span class="sd"> &quot;&quot;&quot;</span>
<span class="k">try</span><span class="p">:</span>
<span class="k">if</span> <span class="n">text</span> <span class="ow">and</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">text</span><span class="p">,</span> <span class="nb">tuple</span><span class="p">):</span>
<span class="n">text</span> <span class="o">=</span> <span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">_RE_GENDER_PRONOUN</span><span class="o">.</span><span class="n">sub</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">_get_pronoun</span><span class="p">,</span> <span class="n">text</span><span class="p">[</span><span class="mi">0</span><span class="p">]),</span> <span class="o">*</span><span class="n">text</span><span class="p">[</span><span class="mi">1</span><span class="p">:])</span>
<span class="n">text</span> <span class="o">=</span> <span class="p">(</span><span class="n">_RE_GENDER_PRONOUN</span><span class="o">.</span><span class="n">sub</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">_get_pronoun</span><span class="p">,</span> <span class="n">text</span><span class="p">[</span><span class="mi">0</span><span class="p">]),</span> <span class="o">*</span><span class="n">text</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">text</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_RE_GENDER_PRONOUN</span><span class="o">.</span><span class="n">sub</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">_get_pronoun</span><span class="p">,</span> <span class="n">text</span><span class="p">)</span>
<span class="n">text</span> <span class="o">=</span> <span class="n">_RE_GENDER_PRONOUN</span><span class="o">.</span><span class="n">sub</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">_get_pronoun</span><span class="p">,</span> <span class="n">text</span><span class="p">)</span>
<span class="k">except</span> <span class="ne">TypeError</span><span class="p">:</span>
<span class="k">pass</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>

View file

@ -369,6 +369,8 @@
<span class="sd">```</span>
<span class="sd">----</span>
<span class="sd">&quot;&quot;&quot;</span>

View file

@ -119,7 +119,7 @@
<span class="sd">instead of the default:</span>
<span class="sd"> class Character(TBRangeCharacter):</span>
<span class="sd"> </span>
<span class="sd">Do the same thing in your game&#39;s objects.py module for TBRangeObject:</span>
<span class="sd"> from evennia.contrib.turnbattle.tb_range import TBRangeObject</span>
@ -287,10 +287,10 @@
<div class="viewcode-block" id="at_defeat"><a class="viewcode-back" href="../../../../api/evennia.contrib.turnbattle.tb_range.html#evennia.contrib.turnbattle.tb_range.at_defeat">[docs]</a><span class="k">def</span> <span class="nf">at_defeat</span><span class="p">(</span><span class="n">defeated</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> Announces the defeat of a fighter in combat.</span>
<span class="sd"> </span>
<span class="sd"> Args:</span>
<span class="sd"> defeated (obj): Fighter that&#39;s been defeated.</span>
<span class="sd"> </span>
<span class="sd"> Notes:</span>
<span class="sd"> All this does is announce a defeat message by default, but if you</span>
<span class="sd"> want anything else to happen to defeated fighters (like putting them</span>
@ -341,11 +341,11 @@
<div class="viewcode-block" id="get_range"><a class="viewcode-back" href="../../../../api/evennia.contrib.turnbattle.tb_range.html#evennia.contrib.turnbattle.tb_range.get_range">[docs]</a><span class="k">def</span> <span class="nf">get_range</span><span class="p">(</span><span class="n">obj1</span><span class="p">,</span> <span class="n">obj2</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> Gets the combat range between two objects.</span>
<span class="sd"> </span>
<span class="sd"> Args:</span>
<span class="sd"> obj1 (obj): First object</span>
<span class="sd"> obj2 (obj): Second object</span>
<span class="sd"> </span>
<span class="sd"> Returns:</span>
<span class="sd"> range (int or None): Distance between two objects or None if not applicable</span>
<span class="sd"> &quot;&quot;&quot;</span>
@ -365,7 +365,7 @@
<div class="viewcode-block" id="distance_inc"><a class="viewcode-back" href="../../../../api/evennia.contrib.turnbattle.tb_range.html#evennia.contrib.turnbattle.tb_range.distance_inc">[docs]</a><span class="k">def</span> <span class="nf">distance_inc</span><span class="p">(</span><span class="n">mover</span><span class="p">,</span> <span class="n">target</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> Function that increases distance in range field between mover and target.</span>
<span class="sd"> </span>
<span class="sd"> Args:</span>
<span class="sd"> mover (obj): The object moving</span>
<span class="sd"> target (obj): The object to be moved away from</span>
@ -381,11 +381,11 @@
<div class="viewcode-block" id="approach"><a class="viewcode-back" href="../../../../api/evennia.contrib.turnbattle.tb_range.html#evennia.contrib.turnbattle.tb_range.approach">[docs]</a><span class="k">def</span> <span class="nf">approach</span><span class="p">(</span><span class="n">mover</span><span class="p">,</span> <span class="n">target</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> Manages a character&#39;s whole approach, including changes in ranges to other characters.</span>
<span class="sd"> </span>
<span class="sd"> Args:</span>
<span class="sd"> mover (obj): The object moving</span>
<span class="sd"> target (obj): The object to be moved toward</span>
<span class="sd"> </span>
<span class="sd"> Notes:</span>
<span class="sd"> The mover will also automatically move toward any objects that are closer to the</span>
<span class="sd"> target than the mover is. The mover will also move away from anything they started</span>
@ -395,7 +395,7 @@
<span class="k">def</span> <span class="nf">distance_dec</span><span class="p">(</span><span class="n">mover</span><span class="p">,</span> <span class="n">target</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> Helper function that decreases distance in range field between mover and target.</span>
<span class="sd"> </span>
<span class="sd"> Args:</span>
<span class="sd"> mover (obj): The object moving</span>
<span class="sd"> target (obj): The object to be moved toward</span>
@ -429,11 +429,11 @@
<div class="viewcode-block" id="withdraw"><a class="viewcode-back" href="../../../../api/evennia.contrib.turnbattle.tb_range.html#evennia.contrib.turnbattle.tb_range.withdraw">[docs]</a><span class="k">def</span> <span class="nf">withdraw</span><span class="p">(</span><span class="n">mover</span><span class="p">,</span> <span class="n">target</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> Manages a character&#39;s whole withdrawal, including changes in ranges to other characters.</span>
<span class="sd"> </span>
<span class="sd"> Args:</span>
<span class="sd"> mover (obj): The object moving</span>
<span class="sd"> target (obj): The object to be moved away from</span>
<span class="sd"> </span>
<span class="sd"> Notes:</span>
<span class="sd"> The mover will also automatically move away from objects that are close to the target</span>
<span class="sd"> of their withdrawl. The mover will never inadvertently move toward anything else while</span>
@ -581,7 +581,8 @@
<span class="sd"> room as its object.</span>
<span class="sd"> Fights persist until only one participant is left with any HP or all</span>
<span class="sd"> remaining participants choose to end the combat with the &#39;disengage&#39; command.</span>
<span class="sd"> remaining participants choose to end the combat with the &#39;disengage&#39;</span>
<span class="sd"> command.</span>
<span class="sd"> &quot;&quot;&quot;</span>
<div class="viewcode-block" id="TBRangeTurnHandler.at_script_creation"><a class="viewcode-back" href="../../../../api/evennia.contrib.turnbattle.tb_range.html#evennia.contrib.turnbattle.tb_range.TBRangeTurnHandler.at_script_creation">[docs]</a> <span class="k">def</span> <span class="nf">at_script_creation</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
@ -656,7 +657,7 @@
<div class="viewcode-block" id="TBRangeTurnHandler.init_range"><a class="viewcode-back" href="../../../../api/evennia.contrib.turnbattle.tb_range.html#evennia.contrib.turnbattle.tb_range.TBRangeTurnHandler.init_range">[docs]</a> <span class="k">def</span> <span class="nf">init_range</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">to_init</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> Initializes range values for an object at the start of a fight.</span>
<span class="sd"> </span>
<span class="sd"> Args:</span>
<span class="sd"> to_init (object): Object to initialize range field for.</span>
<span class="sd"> &quot;&quot;&quot;</span>
@ -679,14 +680,13 @@
<div class="viewcode-block" id="TBRangeTurnHandler.join_rangefield"><a class="viewcode-back" href="../../../../api/evennia.contrib.turnbattle.tb_range.html#evennia.contrib.turnbattle.tb_range.TBRangeTurnHandler.join_rangefield">[docs]</a> <span class="k">def</span> <span class="nf">join_rangefield</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">to_init</span><span class="p">,</span> <span class="n">anchor_obj</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span> <span class="n">add_distance</span><span class="o">=</span><span class="mi">0</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> Adds a new object to the range field of a fight in progress.</span>
<span class="sd"> </span>
<span class="sd"> Args:</span>
<span class="sd"> to_init (object): Object to initialize range field for.</span>
<span class="sd"> </span>
<span class="sd"> Keyword args:</span>
<span class="sd"> anchor_obj (object): Object to copy range values from, or None for a random object.</span>
<span class="sd"> add_distance (int): Distance to put between to_init object and anchor object.</span>
<span class="sd"> </span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="c1"># Get a list of room&#39;s contents without to_init object.</span>
<span class="n">contents</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">obj</span><span class="o">.</span><span class="n">contents</span>

View file

@ -95,9 +95,9 @@
<span class="n">text</span> <span class="o">=</span> <span class="n">text</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span> <span class="k">if</span> <span class="n">is_iter</span><span class="p">(</span><span class="n">text</span><span class="p">)</span> <span class="k">else</span> <span class="n">text</span>
<span class="k">if</span> <span class="n">from_obj</span><span class="p">:</span>
<span class="k">for</span> <span class="n">obj</span> <span class="ow">in</span> <span class="n">make_iter</span><span class="p">(</span><span class="n">from_obj</span><span class="p">):</span>
<span class="n">obj</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">{self.key}</span><span class="s2"> echoes back to you:</span><span class="se">\n\&quot;</span><span class="si">{text}</span><span class="se">\&quot;</span><span class="s2">.&quot;</span><span class="p">)</span>
<span class="n">obj</span><span class="o">.</span><span class="n">msg</span><span class="p">(</span><span class="n">f</span><span class="s1">&#39;</span><span class="si">{self.key}</span><span class="s1"> echoes back to you:</span><span class="se">\n</span><span class="s1">&quot;</span><span class="si">{text}</span><span class="s1">&quot;.&#39;</span><span class="p">)</span>
<span class="k">elif</span> <span class="bp">self</span><span class="o">.</span><span class="n">location</span><span class="p">:</span>
<span class="bp">self</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="n">f</span><span class="s2">&quot;</span><span class="si">{self.key}</span><span class="s2"> echoes back:</span><span class="se">\n\&quot;</span><span class="si">{text}</span><span class="se">\&quot;</span><span class="s2">.&quot;</span><span class="p">,</span> <span class="n">exclude</span><span class="o">=</span><span class="p">[</span><span class="bp">self</span><span class="p">])</span>
<span class="bp">self</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="n">f</span><span class="s1">&#39;</span><span class="si">{self.key}</span><span class="s1"> echoes back:</span><span class="se">\n</span><span class="s1">&quot;</span><span class="si">{text}</span><span class="s1">&quot;.&#39;</span><span class="p">,</span> <span class="n">exclude</span><span class="o">=</span><span class="p">[</span><span class="bp">self</span><span class="p">])</span>
<span class="k">else</span><span class="p">:</span>
<span class="c1"># no from_obj and no location, just log</span>
<span class="n">logger</span><span class="o">.</span><span class="n">log_msg</span><span class="p">(</span><span class="n">f</span><span class="s2">&quot;</span><span class="si">{self.key}</span><span class="s2">.msg was called without from_obj and .location is None.&quot;</span><span class="p">)</span></div></div>

View file

@ -580,7 +580,9 @@
<span class="sd"> Only true if accessed_obj has the specified tag and optional</span>
<span class="sd"> category.</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="k">return</span> <span class="nb">bool</span><span class="p">(</span><span class="n">accessed_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="o">*</span><span class="n">args</span><span class="p">))</span></div>
<span class="n">tagkey</span> <span class="o">=</span> <span class="n">args</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span> <span class="k">if</span> <span class="n">args</span> <span class="k">else</span> <span class="kc">None</span>
<span class="n">category</span> <span class="o">=</span> <span class="n">args</span><span class="p">[</span><span class="mi">1</span><span class="p">]</span> <span class="k">if</span> <span class="nb">len</span><span class="p">(</span><span class="n">args</span><span class="p">)</span> <span class="o">&gt;</span> <span class="mi">1</span> <span class="k">else</span> <span class="kc">None</span>
<span class="k">return</span> <span class="nb">bool</span><span class="p">(</span><span class="n">accessed_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">tagkey</span><span class="p">,</span> <span class="n">category</span><span class="o">=</span><span class="n">category</span><span class="p">))</span></div>
<div class="viewcode-block" id="inside"><a class="viewcode-back" href="../../../api/evennia.locks.lockfuncs.html#evennia.locks.lockfuncs.inside">[docs]</a><span class="k">def</span> <span class="nf">inside</span><span class="p">(</span><span class="n">accessing_obj</span><span class="p">,</span> <span class="n">accessed_obj</span><span class="p">,</span> <span class="o">*</span><span class="n">args</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">):</span>

View file

@ -277,7 +277,13 @@
<span class="n">elist</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">_</span><span class="p">(</span><span class="s2">&quot;Lock: lock-function &#39;</span><span class="si">%s</span><span class="s2">&#39; is not available.&quot;</span><span class="p">)</span> <span class="o">%</span> <span class="n">funcstring</span><span class="p">)</span>
<span class="k">continue</span>
<span class="n">args</span> <span class="o">=</span> <span class="nb">list</span><span class="p">(</span><span class="n">arg</span><span class="o">.</span><span class="n">strip</span><span class="p">()</span> <span class="k">for</span> <span class="n">arg</span> <span class="ow">in</span> <span class="n">rest</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">arg</span> <span class="ow">and</span> <span class="s2">&quot;=&quot;</span> <span class="ow">not</span> <span class="ow">in</span> <span class="n">arg</span><span class="p">)</span>
<span class="n">kwargs</span> <span class="o">=</span> <span class="nb">dict</span><span class="p">([</span><span class="n">arg</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">for</span> <span class="n">arg</span> <span class="ow">in</span> <span class="n">rest</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">arg</span> <span class="ow">and</span> <span class="s2">&quot;=&quot;</span> <span class="ow">in</span> <span class="n">arg</span><span class="p">])</span>
<span class="n">kwargs</span> <span class="o">=</span> <span class="nb">dict</span><span class="p">(</span>
<span class="p">[</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">arg</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">for</span> <span class="n">arg</span> <span class="ow">in</span> <span class="n">rest</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">arg</span> <span class="ow">and</span> <span class="s2">&quot;=&quot;</span> <span class="ow">in</span> <span class="n">arg</span>
<span class="p">]</span>
<span class="p">)</span>
<span class="n">lock_funcs</span><span class="o">.</span><span class="n">append</span><span class="p">((</span><span class="n">func</span><span class="p">,</span> <span class="n">args</span><span class="p">,</span> <span class="n">kwargs</span><span class="p">))</span>
<span class="n">evalstring</span> <span class="o">=</span> <span class="n">evalstring</span><span class="o">.</span><span class="n">replace</span><span class="p">(</span><span class="n">funcstring</span><span class="p">,</span> <span class="s2">&quot;</span><span class="si">%s</span><span class="s2">&quot;</span><span class="p">)</span>
<span class="k">if</span> <span class="nb">len</span><span class="p">(</span><span class="n">lock_funcs</span><span class="p">)</span> <span class="o">&lt;</span> <span class="n">nfuncs</span><span class="p">:</span>

Some files were not shown because too many files have changed in this diff Show more