evennia/docs/1.0-dev/_modules/evennia/comms/comms.html
2020-11-14 13:44:49 +01:00

917 lines
No EOL
88 KiB
HTML

<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>evennia.comms.comms &#8212; Evennia 1.0-dev documentation</title>
<link rel="stylesheet" href="../../../_static/nature.css" type="text/css" />
<link rel="stylesheet" href="../../../_static/pygments.css" type="text/css" />
<script id="documentation_options" data-url_root="../../../" src="../../../_static/documentation_options.js"></script>
<script src="../../../_static/jquery.js"></script>
<script src="../../../_static/underscore.js"></script>
<script src="../../../_static/doctools.js"></script>
<script src="../../../_static/language_data.js"></script>
<link rel="shortcut icon" href="../../../_static/favicon.ico"/>
<link rel="index" title="Index" href="../../../genindex.html" />
<link rel="search" title="Search" href="../../../search.html" />
</head><body>
<div class="related" role="navigation" aria-label="related navigation">
<h3>Navigation</h3>
<ul>
<li class="right" style="margin-right: 10px">
<a href="../../../genindex.html" title="General Index"
accesskey="I">index</a></li>
<li class="right" >
<a href="../../../py-modindex.html" title="Python Module Index"
>modules</a> |</li>
<li class="nav-item nav-item-0"><a href="../../../index.html">Evennia 1.0-dev</a> &#187;</li>
<li class="nav-item nav-item-1"><a href="../../index.html" >Module code</a> &#187;</li>
<li class="nav-item nav-item-2"><a href="../../evennia.html" accesskey="U">evennia</a> &#187;</li>
<li class="nav-item nav-item-this"><a href="">evennia.comms.comms</a></li>
</ul>
<div class="develop">develop branch</div>
</div>
<div class="document">
<div class="documentwrapper">
<div class="bodywrapper">
<div class="body" role="main">
<h1>Source code for evennia.comms.comms</h1><div class="highlight"><pre>
<span></span><span class="sd">&quot;&quot;&quot;</span>
<span class="sd">Base typeclass for in-game Channels.</span>
<span class="sd">&quot;&quot;&quot;</span>
<span class="kn">from</span> <span class="nn">django.contrib.contenttypes.models</span> <span class="k">import</span> <span class="n">ContentType</span>
<span class="kn">from</span> <span class="nn">django.urls</span> <span class="k">import</span> <span class="n">reverse</span>
<span class="kn">from</span> <span class="nn">django.utils.text</span> <span class="k">import</span> <span class="n">slugify</span>
<span class="kn">from</span> <span class="nn">evennia.typeclasses.models</span> <span class="k">import</span> <span class="n">TypeclassBase</span>
<span class="kn">from</span> <span class="nn">evennia.comms.models</span> <span class="k">import</span> <span class="n">TempMsg</span><span class="p">,</span> <span class="n">ChannelDB</span>
<span class="kn">from</span> <span class="nn">evennia.comms.managers</span> <span class="k">import</span> <span class="n">ChannelManager</span>
<span class="kn">from</span> <span class="nn">evennia.utils</span> <span class="k">import</span> <span class="n">create</span><span class="p">,</span> <span class="n">logger</span>
<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="n">_CHANNEL_HANDLER</span> <span class="o">=</span> <span class="kc">None</span>
<div class="viewcode-block" id="DefaultChannel"><a class="viewcode-back" href="../../../api/evennia.comms.comms.html#evennia.comms.comms.DefaultChannel">[docs]</a><span class="k">class</span> <span class="nc">DefaultChannel</span><span class="p">(</span><span class="n">ChannelDB</span><span class="p">,</span> <span class="n">metaclass</span><span class="o">=</span><span class="n">TypeclassBase</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> This is the base class for all Channel Comms. Inherit from this to</span>
<span class="sd"> create different types of communication channels.</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="n">objects</span> <span class="o">=</span> <span class="n">ChannelManager</span><span class="p">()</span>
<div class="viewcode-block" id="DefaultChannel.at_first_save"><a class="viewcode-back" href="../../../api/evennia.comms.comms.html#evennia.comms.comms.DefaultChannel.at_first_save">[docs]</a> <span class="k">def</span> <span class="nf">at_first_save</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> Called by the typeclass system the very first time the channel</span>
<span class="sd"> is saved to the database. Generally, don&#39;t overload this but</span>
<span class="sd"> the hooks called by this method.</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="bp">self</span><span class="o">.</span><span class="n">basetype_setup</span><span class="p">()</span>
<span class="bp">self</span><span class="o">.</span><span class="n">at_channel_creation</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;log_file&quot;</span><span class="p">,</span> <span class="s2">&quot;channel_</span><span class="si">%s</span><span class="s2">.log&quot;</span> <span class="o">%</span> <span class="bp">self</span><span class="o">.</span><span class="n">key</span><span class="p">)</span>
<span class="k">if</span> <span class="nb">hasattr</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="s2">&quot;_createdict&quot;</span><span class="p">):</span>
<span class="c1"># this is only set if the channel was created</span>
<span class="c1"># with the utils.create.create_channel function.</span>
<span class="n">cdict</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_createdict</span>
<span class="k">if</span> <span class="ow">not</span> <span class="n">cdict</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s2">&quot;key&quot;</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">db_key</span><span class="p">:</span>
<span class="bp">self</span><span class="o">.</span><span class="n">db_key</span> <span class="o">=</span> <span class="s2">&quot;#i&quot;</span> <span class="o">%</span> <span class="bp">self</span><span class="o">.</span><span class="n">dbid</span>
<span class="k">elif</span> <span class="n">cdict</span><span class="p">[</span><span class="s2">&quot;key&quot;</span><span class="p">]</span> <span class="ow">and</span> <span class="bp">self</span><span class="o">.</span><span class="n">key</span> <span class="o">!=</span> <span class="n">cdict</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="o">=</span> <span class="n">cdict</span><span class="p">[</span><span class="s2">&quot;key&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;aliases&quot;</span><span class="p">):</span>
<span class="bp">self</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">cdict</span><span class="p">[</span><span class="s2">&quot;aliases&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;locks&quot;</span><span class="p">):</span>
<span class="bp">self</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">cdict</span><span class="p">[</span><span class="s2">&quot;locks&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;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>
<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>
<span class="k">global</span> <span class="n">_CHANNEL_HANDLER</span>
<span class="k">if</span> <span class="ow">not</span> <span class="n">_CHANNEL_HANDLER</span><span class="p">:</span>
<span class="kn">from</span> <span class="nn">evennia.comms.channelhandler</span> <span class="k">import</span> <span class="n">CHANNEL_HANDLER</span> <span class="k">as</span> <span class="n">_CHANNEL_HANDLER</span>
<span class="c1"># register ourselves with the channelhandler.</span>
<span class="n">_CHANNEL_HANDLER</span><span class="o">.</span><span class="n">add</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">locks</span><span class="o">.</span><span class="n">add</span><span class="p">(</span><span class="s2">&quot;send:all();listen:all();control:perm(Admin)&quot;</span><span class="p">)</span></div>
<div class="viewcode-block" id="DefaultChannel.at_channel_creation"><a class="viewcode-back" href="../../../api/evennia.comms.comms.html#evennia.comms.comms.DefaultChannel.at_channel_creation">[docs]</a> <span class="k">def</span> <span class="nf">at_channel_creation</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> Called once, when the channel is first created.</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="k">pass</span></div>
<span class="c1"># helper methods, for easy overloading</span>
<div class="viewcode-block" id="DefaultChannel.has_connection"><a class="viewcode-back" href="../../../api/evennia.comms.comms.html#evennia.comms.comms.DefaultChannel.has_connection">[docs]</a> <span class="k">def</span> <span class="nf">has_connection</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">subscriber</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> Checks so this account is actually listening</span>
<span class="sd"> to this channel.</span>
<span class="sd"> Args:</span>
<span class="sd"> subscriber (Account or Object): Entity to check.</span>
<span class="sd"> Returns:</span>
<span class="sd"> has_sub (bool): Whether the subscriber is subscribing to</span>
<span class="sd"> this channel or not.</span>
<span class="sd"> Notes:</span>
<span class="sd"> This will first try Account subscribers and only try Object</span>
<span class="sd"> if the Account fails.</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="n">has_sub</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">subscriptions</span><span class="o">.</span><span class="n">has</span><span class="p">(</span><span class="n">subscriber</span><span class="p">)</span>
<span class="k">if</span> <span class="ow">not</span> <span class="n">has_sub</span> <span class="ow">and</span> <span class="nb">hasattr</span><span class="p">(</span><span class="n">subscriber</span><span class="p">,</span> <span class="s2">&quot;account&quot;</span><span class="p">):</span>
<span class="c1"># it&#39;s common to send an Object when we</span>
<span class="c1"># by default only allow Accounts to subscribe.</span>
<span class="n">has_sub</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">subscriptions</span><span class="o">.</span><span class="n">has</span><span class="p">(</span><span class="n">subscriber</span><span class="o">.</span><span class="n">account</span><span class="p">)</span>
<span class="k">return</span> <span class="n">has_sub</span></div>
<span class="nd">@property</span>
<span class="k">def</span> <span class="nf">mutelist</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">db</span><span class="o">.</span><span class="n">mute_list</span> <span class="ow">or</span> <span class="p">[]</span>
<span class="nd">@property</span>
<span class="k">def</span> <span class="nf">wholist</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="n">subs</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">subscriptions</span><span class="o">.</span><span class="n">all</span><span class="p">()</span>
<span class="n">muted</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">mutelist</span><span class="p">)</span>
<span class="n">listening</span> <span class="o">=</span> <span class="p">[</span><span class="n">ob</span> <span class="k">for</span> <span class="n">ob</span> <span class="ow">in</span> <span class="n">subs</span> <span class="k">if</span> <span class="n">ob</span><span class="o">.</span><span class="n">is_connected</span> <span class="ow">and</span> <span class="n">ob</span> <span class="ow">not</span> <span class="ow">in</span> <span class="n">muted</span><span class="p">]</span>
<span class="k">if</span> <span class="n">subs</span><span class="p">:</span>
<span class="c1"># display listening subscribers in bold</span>
<span class="n">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="p">[</span>
<span class="n">account</span><span class="o">.</span><span class="n">key</span> <span class="k">if</span> <span class="n">account</span> <span class="ow">not</span> <span class="ow">in</span> <span class="n">listening</span> <span class="k">else</span> <span class="s2">&quot;|w</span><span class="si">%s</span><span class="s2">|n&quot;</span> <span class="o">%</span> <span class="n">account</span><span class="o">.</span><span class="n">key</span>
<span class="k">for</span> <span class="n">account</span> <span class="ow">in</span> <span class="n">subs</span>
<span class="p">]</span>
<span class="p">)</span>
<span class="k">else</span><span class="p">:</span>
<span class="n">string</span> <span class="o">=</span> <span class="s2">&quot;&lt;None&gt;&quot;</span>
<span class="k">return</span> <span class="n">string</span>
<div class="viewcode-block" id="DefaultChannel.mute"><a class="viewcode-back" href="../../../api/evennia.comms.comms.html#evennia.comms.comms.DefaultChannel.mute">[docs]</a> <span class="k">def</span> <span class="nf">mute</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">subscriber</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"> Adds an entity to the list of muted subscribers.</span>
<span class="sd"> A muted subscriber will no longer see channel messages,</span>
<span class="sd"> but may use channel commands.</span>
<span class="sd"> Args:</span>
<span class="sd"> subscriber (Object or Account): Subscriber to mute.</span>
<span class="sd"> **kwargs (dict): Arbitrary, optional arguments for users</span>
<span class="sd"> overriding the call (unused by default).</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="n">mutelist</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">mutelist</span>
<span class="k">if</span> <span class="n">subscriber</span> <span class="ow">not</span> <span class="ow">in</span> <span class="n">mutelist</span><span class="p">:</span>
<span class="n">mutelist</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">subscriber</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">mute_list</span> <span class="o">=</span> <span class="n">mutelist</span>
<span class="k">return</span> <span class="kc">True</span>
<span class="k">return</span> <span class="kc">False</span></div>
<div class="viewcode-block" id="DefaultChannel.unmute"><a class="viewcode-back" href="../../../api/evennia.comms.comms.html#evennia.comms.comms.DefaultChannel.unmute">[docs]</a> <span class="k">def</span> <span class="nf">unmute</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">subscriber</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"> Removes an entity to the list of muted subscribers. A muted subscriber will no longer see channel messages,</span>
<span class="sd"> but may use channel commands.</span>
<span class="sd"> Args:</span>
<span class="sd"> subscriber (Object or Account): The subscriber to unmute.</span>
<span class="sd"> **kwargs (dict): Arbitrary, optional arguments for users</span>
<span class="sd"> overriding the call (unused by default).</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="n">mutelist</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">mutelist</span>
<span class="k">if</span> <span class="n">subscriber</span> <span class="ow">in</span> <span class="n">mutelist</span><span class="p">:</span>
<span class="n">mutelist</span><span class="o">.</span><span class="n">remove</span><span class="p">(</span><span class="n">subscriber</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">mute_list</span> <span class="o">=</span> <span class="n">mutelist</span>
<span class="k">return</span> <span class="kc">True</span>
<span class="k">return</span> <span class="kc">False</span></div>
<div class="viewcode-block" id="DefaultChannel.connect"><a class="viewcode-back" href="../../../api/evennia.comms.comms.html#evennia.comms.comms.DefaultChannel.connect">[docs]</a> <span class="k">def</span> <span class="nf">connect</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">subscriber</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"> Connect the user to this channel. This checks access.</span>
<span class="sd"> Args:</span>
<span class="sd"> subscriber (Account or Object): the entity to subscribe</span>
<span class="sd"> to this channel.</span>
<span class="sd"> **kwargs (dict): Arbitrary, optional arguments for users</span>
<span class="sd"> overriding the call (unused by default).</span>
<span class="sd"> Returns:</span>
<span class="sd"> success (bool): Whether or not the addition was</span>
<span class="sd"> successful.</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="c1"># check access</span>
<span class="k">if</span> <span class="ow">not</span> <span class="bp">self</span><span class="o">.</span><span class="n">access</span><span class="p">(</span><span class="n">subscriber</span><span class="p">,</span> <span class="s2">&quot;listen&quot;</span><span class="p">):</span>
<span class="k">return</span> <span class="kc">False</span>
<span class="c1"># pre-join hook</span>
<span class="n">connect</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">pre_join_channel</span><span class="p">(</span><span class="n">subscriber</span><span class="p">)</span>
<span class="k">if</span> <span class="ow">not</span> <span class="n">connect</span><span class="p">:</span>
<span class="k">return</span> <span class="kc">False</span>
<span class="c1"># subscribe</span>
<span class="bp">self</span><span class="o">.</span><span class="n">subscriptions</span><span class="o">.</span><span class="n">add</span><span class="p">(</span><span class="n">subscriber</span><span class="p">)</span>
<span class="c1"># unmute</span>
<span class="bp">self</span><span class="o">.</span><span class="n">unmute</span><span class="p">(</span><span class="n">subscriber</span><span class="p">)</span>
<span class="c1"># post-join hook</span>
<span class="bp">self</span><span class="o">.</span><span class="n">post_join_channel</span><span class="p">(</span><span class="n">subscriber</span><span class="p">)</span>
<span class="k">return</span> <span class="kc">True</span></div>
<div class="viewcode-block" id="DefaultChannel.disconnect"><a class="viewcode-back" href="../../../api/evennia.comms.comms.html#evennia.comms.comms.DefaultChannel.disconnect">[docs]</a> <span class="k">def</span> <span class="nf">disconnect</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">subscriber</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"> Disconnect entity from this channel.</span>
<span class="sd"> Args:</span>
<span class="sd"> subscriber (Account of Object): the</span>
<span class="sd"> entity to disconnect.</span>
<span class="sd"> **kwargs (dict): Arbitrary, optional arguments for users</span>
<span class="sd"> overriding the call (unused by default).</span>
<span class="sd"> Returns:</span>
<span class="sd"> success (bool): Whether or not the removal was</span>
<span class="sd"> successful.</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="c1"># pre-disconnect hook</span>
<span class="n">disconnect</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">pre_leave_channel</span><span class="p">(</span><span class="n">subscriber</span><span class="p">)</span>
<span class="k">if</span> <span class="ow">not</span> <span class="n">disconnect</span><span class="p">:</span>
<span class="k">return</span> <span class="kc">False</span>
<span class="c1"># disconnect</span>
<span class="bp">self</span><span class="o">.</span><span class="n">subscriptions</span><span class="o">.</span><span class="n">remove</span><span class="p">(</span><span class="n">subscriber</span><span class="p">)</span>
<span class="c1"># unmute</span>
<span class="bp">self</span><span class="o">.</span><span class="n">unmute</span><span class="p">(</span><span class="n">subscriber</span><span class="p">)</span>
<span class="c1"># post-disconnect hook</span>
<span class="bp">self</span><span class="o">.</span><span class="n">post_leave_channel</span><span class="p">(</span><span class="n">subscriber</span><span class="p">)</span>
<span class="k">return</span> <span class="kc">True</span></div>
<div class="viewcode-block" id="DefaultChannel.access"><a class="viewcode-back" href="../../../api/evennia.comms.comms.html#evennia.comms.comms.DefaultChannel.access">[docs]</a> <span class="k">def</span> <span class="nf">access</span><span class="p">(</span>
<span class="bp">self</span><span class="p">,</span>
<span class="n">accessing_obj</span><span class="p">,</span>
<span class="n">access_type</span><span class="o">=</span><span class="s2">&quot;listen&quot;</span><span class="p">,</span>
<span class="n">default</span><span class="o">=</span><span class="kc">False</span><span class="p">,</span>
<span class="n">no_superuser_bypass</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>
<span class="sd"> Determines if another object has permission to access.</span>
<span class="sd"> Args:</span>
<span class="sd"> accessing_obj (Object): Object trying to access this one.</span>
<span class="sd"> access_type (str, optional): Type of access sought.</span>
<span class="sd"> default (bool, optional): What to return if no lock of access_type was found</span>
<span class="sd"> no_superuser_bypass (bool, optional): Turns off superuser</span>
<span class="sd"> lock bypass. Be careful with this one.</span>
<span class="sd"> **kwargs (dict): Arbitrary, optional arguments for users</span>
<span class="sd"> overriding the call (unused by default).</span>
<span class="sd"> Returns:</span>
<span class="sd"> return (bool): Result of lock check.</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">locks</span><span class="o">.</span><span class="n">check</span><span class="p">(</span>
<span class="n">accessing_obj</span><span class="p">,</span>
<span class="n">access_type</span><span class="o">=</span><span class="n">access_type</span><span class="p">,</span>
<span class="n">default</span><span class="o">=</span><span class="n">default</span><span class="p">,</span>
<span class="n">no_superuser_bypass</span><span class="o">=</span><span class="n">no_superuser_bypass</span><span class="p">,</span>
<span class="p">)</span></div>
<div class="viewcode-block" id="DefaultChannel.create"><a class="viewcode-back" href="../../../api/evennia.comms.comms.html#evennia.comms.comms.DefaultChannel.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="o">=</span><span class="kc">None</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"> Creates a basic Channel with default parameters, unless otherwise</span>
<span class="sd"> specified or extended.</span>
<span class="sd"> Provides a friendlier interface to the utils.create_channel() function.</span>
<span class="sd"> Args:</span>
<span class="sd"> key (str): This must be unique.</span>
<span class="sd"> account (Account): Account to attribute this object to.</span>
<span class="sd"> Keyword Args:</span>
<span class="sd"> aliases (list of str): List of alternative (likely shorter) keynames.</span>
<span class="sd"> description (str): A description of the channel, for use in listings.</span>
<span class="sd"> locks (str): Lockstring.</span>
<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"> ip (str): IP address of creator (for object auditing).</span>
<span class="sd"> Returns:</span>
<span class="sd"> channel (Channel): A newly created Channel.</span>
<span class="sd"> errors (list): A list of errors in string form, if any.</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="n">errors</span> <span class="o">=</span> <span class="p">[]</span>
<span class="n">obj</span> <span class="o">=</span> <span class="kc">None</span>
<span class="n">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="s2">&quot;&quot;</span><span class="p">)</span>
<span class="k">try</span><span class="p">:</span>
<span class="n">kwargs</span><span class="p">[</span><span class="s2">&quot;desc&quot;</span><span class="p">]</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">kwargs</span><span class="p">[</span><span class="s2">&quot;typeclass&quot;</span><span class="p">]</span> <span class="o">=</span> <span class="n">kwargs</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s2">&quot;typeclass&quot;</span><span class="p">,</span> <span class="bp">cls</span><span class="p">)</span>
<span class="n">obj</span> <span class="o">=</span> <span class="n">create</span><span class="o">.</span><span class="n">create_channel</span><span class="p">(</span><span class="n">key</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="c1"># Record creator id and creation IP</span>
<span class="k">if</span> <span class="n">ip</span><span class="p">:</span>
<span class="n">obj</span><span class="o">.</span><span class="n">db</span><span class="o">.</span><span class="n">creator_ip</span> <span class="o">=</span> <span class="n">ip</span>
<span class="k">if</span> <span class="n">account</span><span class="p">:</span>
<span class="n">obj</span><span class="o">.</span><span class="n">db</span><span class="o">.</span><span class="n">creator_id</span> <span class="o">=</span> <span class="n">account</span><span class="o">.</span><span class="n">id</span>
<span class="k">except</span> <span class="ne">Exception</span> <span class="k">as</span> <span class="n">exc</span><span class="p">:</span>
<span class="n">errors</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="s2">&quot;An error occurred while creating this &#39;</span><span class="si">%s</span><span class="s2">&#39; object.&quot;</span> <span class="o">%</span> <span class="n">key</span><span class="p">)</span>
<span class="n">logger</span><span class="o">.</span><span class="n">log_err</span><span class="p">(</span><span class="n">exc</span><span class="p">)</span>
<span class="k">return</span> <span class="n">obj</span><span class="p">,</span> <span class="n">errors</span></div>
<div class="viewcode-block" id="DefaultChannel.delete"><a class="viewcode-back" href="../../../api/evennia.comms.comms.html#evennia.comms.comms.DefaultChannel.delete">[docs]</a> <span class="k">def</span> <span class="nf">delete</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> Deletes channel while also cleaning up channelhandler.</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="bp">self</span><span class="o">.</span><span class="n">attributes</span><span class="o">.</span><span class="n">clear</span><span class="p">()</span>
<span class="bp">self</span><span class="o">.</span><span class="n">aliases</span><span class="o">.</span><span class="n">clear</span><span class="p">()</span>
<span class="nb">super</span><span class="p">()</span><span class="o">.</span><span class="n">delete</span><span class="p">()</span>
<span class="kn">from</span> <span class="nn">evennia.comms.channelhandler</span> <span class="k">import</span> <span class="n">CHANNELHANDLER</span>
<span class="n">CHANNELHANDLER</span><span class="o">.</span><span class="n">update</span><span class="p">()</span></div>
<div class="viewcode-block" id="DefaultChannel.message_transform"><a class="viewcode-back" href="../../../api/evennia.comms.comms.html#evennia.comms.comms.DefaultChannel.message_transform">[docs]</a> <span class="k">def</span> <span class="nf">message_transform</span><span class="p">(</span>
<span class="bp">self</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="kc">False</span><span class="p">,</span> <span class="n">prefix</span><span class="o">=</span><span class="kc">True</span><span class="p">,</span> <span class="n">sender_strings</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span> <span class="n">external</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="sd">&quot;&quot;&quot;</span>
<span class="sd"> Generates the formatted string sent to listeners on a channel.</span>
<span class="sd"> Args:</span>
<span class="sd"> msgobj (Msg): Message object to send.</span>
<span class="sd"> emit (bool, optional): In emit mode the message is not associated</span>
<span class="sd"> with a specific sender name.</span>
<span class="sd"> prefix (bool, optional): Prefix `msg` with a text given by `self.channel_prefix`.</span>
<span class="sd"> sender_strings (list, optional): Used by bots etc, one string per external sender.</span>
<span class="sd"> external (bool, optional): If this is an external sender or not.</span>
<span class="sd"> **kwargs (dict): Arbitrary, optional arguments for users</span>
<span class="sd"> overriding the call (unused by default).</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="k">if</span> <span class="n">sender_strings</span> <span class="ow">or</span> <span class="n">external</span><span class="p">:</span>
<span class="n">body</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">format_external</span><span class="p">(</span><span class="n">msgobj</span><span class="p">,</span> <span class="n">sender_strings</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="k">else</span><span class="p">:</span>
<span class="n">body</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">format_message</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="k">if</span> <span class="n">prefix</span><span class="p">:</span>
<span class="n">body</span> <span class="o">=</span> <span class="s2">&quot;</span><span class="si">%s%s</span><span class="s2">&quot;</span> <span class="o">%</span> <span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">channel_prefix</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">body</span><span class="p">)</span>
<span class="n">msgobj</span><span class="o">.</span><span class="n">message</span> <span class="o">=</span> <span class="n">body</span>
<span class="k">return</span> <span class="n">msgobj</span></div>
<div class="viewcode-block" id="DefaultChannel.distribute_message"><a class="viewcode-back" href="../../../api/evennia.comms.comms.html#evennia.comms.comms.DefaultChannel.distribute_message">[docs]</a> <span class="k">def</span> <span class="nf">distribute_message</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">msgobj</span><span class="p">,</span> <span class="n">online</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="sd">&quot;&quot;&quot;</span>
<span class="sd"> Method for grabbing all listeners that a message should be</span>
<span class="sd"> sent to on this channel, and sending them a message.</span>
<span class="sd"> Args:</span>
<span class="sd"> msgobj (Msg or TempMsg): Message to distribute.</span>
<span class="sd"> online (bool): Only send to receivers who are actually online</span>
<span class="sd"> (not currently used):</span>
<span class="sd"> **kwargs (dict): Arbitrary, optional arguments for users</span>
<span class="sd"> overriding the call (unused by default).</span>
<span class="sd"> Notes:</span>
<span class="sd"> This is also where logging happens, if enabled.</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="c1"># get all accounts or objects connected to this channel and send to them</span>
<span class="k">if</span> <span class="n">online</span><span class="p">:</span>
<span class="n">subs</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">subscriptions</span><span class="o">.</span><span class="n">online</span><span class="p">()</span>
<span class="k">else</span><span class="p">:</span>
<span class="n">subs</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">subscriptions</span><span class="o">.</span><span class="n">all</span><span class="p">()</span>
<span class="k">for</span> <span class="n">entity</span> <span class="ow">in</span> <span class="n">subs</span><span class="p">:</span>
<span class="c1"># if the entity is muted, we don&#39;t send them a message</span>
<span class="k">if</span> <span class="n">entity</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">mutelist</span><span class="p">:</span>
<span class="k">continue</span>
<span class="k">try</span><span class="p">:</span>
<span class="c1"># note our addition of the from_channel keyword here. This could be checked</span>
<span class="c1"># by a custom account.msg() to treat channel-receives differently.</span>
<span class="n">entity</span><span class="o">.</span><span class="n">msg</span><span class="p">(</span>
<span class="n">msgobj</span><span class="o">.</span><span class="n">message</span><span class="p">,</span> <span class="n">from_obj</span><span class="o">=</span><span class="n">msgobj</span><span class="o">.</span><span class="n">senders</span><span class="p">,</span> <span class="n">options</span><span class="o">=</span><span class="p">{</span><span class="s2">&quot;from_channel&quot;</span><span class="p">:</span> <span class="bp">self</span><span class="o">.</span><span class="n">id</span><span class="p">}</span>
<span class="p">)</span>
<span class="k">except</span> <span class="ne">AttributeError</span> <span class="k">as</span> <span class="n">e</span><span class="p">:</span>
<span class="n">logger</span><span class="o">.</span><span class="n">log_trace</span><span class="p">(</span><span class="s2">&quot;</span><span class="si">%s</span><span class="se">\n</span><span class="s2">Cannot send msg to &#39;</span><span class="si">%s</span><span class="s2">&#39;.&quot;</span> <span class="o">%</span> <span class="p">(</span><span class="n">e</span><span class="p">,</span> <span class="n">entity</span><span class="p">))</span>
<span class="k">if</span> <span class="n">msgobj</span><span class="o">.</span><span class="n">keep_log</span><span class="p">:</span>
<span class="c1"># log to file</span>
<span class="n">logger</span><span class="o">.</span><span class="n">log_file</span><span class="p">(</span>
<span class="n">msgobj</span><span class="o">.</span><span class="n">message</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">get</span><span class="p">(</span><span class="s2">&quot;log_file&quot;</span><span class="p">)</span> <span class="ow">or</span> <span class="s2">&quot;channel_</span><span class="si">%s</span><span class="s2">.log&quot;</span> <span class="o">%</span> <span class="bp">self</span><span class="o">.</span><span class="n">key</span>
<span class="p">)</span></div>
<div class="viewcode-block" id="DefaultChannel.msg"><a class="viewcode-back" href="../../../api/evennia.comms.comms.html#evennia.comms.comms.DefaultChannel.msg">[docs]</a> <span class="k">def</span> <span class="nf">msg</span><span class="p">(</span>
<span class="bp">self</span><span class="p">,</span>
<span class="n">msgobj</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="n">senders</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span>
<span class="n">sender_strings</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">None</span><span class="p">,</span>
<span class="n">online</span><span class="o">=</span><span class="kc">False</span><span class="p">,</span>
<span class="n">emit</span><span class="o">=</span><span class="kc">False</span><span class="p">,</span>
<span class="n">external</span><span class="o">=</span><span class="kc">False</span><span class="p">,</span>
<span class="p">):</span>
<span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> Send the given message to all accounts connected to channel. Note that</span>
<span class="sd"> no permission-checking is done here; it is assumed to have been</span>
<span class="sd"> done before calling this method. The optional keywords are not used if</span>
<span class="sd"> persistent is False.</span>
<span class="sd"> Args:</span>
<span class="sd"> msgobj (Msg, TempMsg or str): If a Msg/TempMsg, the remaining</span>
<span class="sd"> keywords will be ignored (since the Msg/TempMsg object already</span>
<span class="sd"> has all the data). If a string, this will either be sent as-is</span>
<span class="sd"> (if persistent=False) or it will be used together with `header`</span>
<span class="sd"> and `senders` keywords to create a Msg instance on the fly.</span>
<span class="sd"> header (str, optional): A header for building the message.</span>
<span class="sd"> senders (Object, Account or list, optional): Optional if persistent=False, used</span>
<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. 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>
<span class="sd"> message only (note that for unlogged channels, a `True` value here will</span>
<span class="sd"> create a new log file only for this message).</span>
<span class="sd"> online (bool, optional) - If this is set true, only messages people who are</span>
<span class="sd"> online. Otherwise, messages all accounts connected. This can</span>
<span class="sd"> make things faster, but may not trigger listeners on accounts</span>
<span class="sd"> that are offline.</span>
<span class="sd"> emit (bool, optional) - Signals to the message formatter that this message is</span>
<span class="sd"> not to be directly associated with a name.</span>
<span class="sd"> external (bool, optional): Treat this message as being</span>
<span class="sd"> agnostic of its sender.</span>
<span class="sd"> Returns:</span>
<span class="sd"> success (bool): Returns `True` if message sending was</span>
<span class="sd"> successful, `False` otherwise.</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="n">senders</span> <span class="o">=</span> <span class="n">make_iter</span><span class="p">(</span><span class="n">senders</span><span class="p">)</span> <span class="k">if</span> <span class="n">senders</span> <span class="k">else</span> <span class="p">[]</span>
<span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">msgobj</span><span class="p">,</span> <span class="nb">str</span><span class="p">):</span>
<span class="c1"># given msgobj is a string - convert to msgobject (always TempMsg)</span>
<span class="n">msgobj</span> <span class="o">=</span> <span class="n">TempMsg</span><span class="p">(</span><span class="n">senders</span><span class="o">=</span><span class="n">senders</span><span class="p">,</span> <span class="n">header</span><span class="o">=</span><span class="n">header</span><span class="p">,</span> <span class="n">message</span><span class="o">=</span><span class="n">msgobj</span><span class="p">,</span> <span class="n">channels</span><span class="o">=</span><span class="p">[</span><span class="bp">self</span><span class="p">])</span>
<span class="c1"># we store the logging setting for use in distribute_message()</span>
<span class="n">msgobj</span><span class="o">.</span><span class="n">keep_log</span> <span class="o">=</span> <span class="n">keep_log</span> <span class="k">if</span> <span class="n">keep_log</span> <span class="ow">is</span> <span class="ow">not</span> <span class="kc">None</span> <span class="k">else</span> <span class="bp">self</span><span class="o">.</span><span class="n">db</span><span class="o">.</span><span class="n">keep_log</span>
<span class="c1"># start the sending</span>
<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>
<span class="bp">self</span><span class="o">.</span><span class="n">distribute_message</span><span class="p">(</span><span class="n">msgobj</span><span class="p">,</span> <span class="n">online</span><span class="o">=</span><span class="n">online</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">post_send_message</span><span class="p">(</span><span class="n">msgobj</span><span class="p">)</span>
<span class="k">return</span> <span class="kc">True</span></div>
<div class="viewcode-block" id="DefaultChannel.tempmsg"><a class="viewcode-back" href="../../../api/evennia.comms.comms.html#evennia.comms.comms.DefaultChannel.tempmsg">[docs]</a> <span class="k">def</span> <span class="nf">tempmsg</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">message</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="n">senders</span><span class="o">=</span><span class="kc">None</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> A wrapper for sending non-persistent messages.</span>
<span class="sd"> Args:</span>
<span class="sd"> message (str): Message to send.</span>
<span class="sd"> header (str, optional): Header of message to send.</span>
<span class="sd"> senders (Object or list, optional): Senders of message to send.</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="bp">self</span><span class="o">.</span><span class="n">msg</span><span class="p">(</span><span class="n">message</span><span class="p">,</span> <span class="n">senders</span><span class="o">=</span><span class="n">senders</span><span class="p">,</span> <span class="n">header</span><span class="o">=</span><span class="n">header</span><span class="p">,</span> <span class="n">keep_log</span><span class="o">=</span><span class="kc">False</span><span class="p">)</span></div>
<span class="c1"># hooks</span>
<div class="viewcode-block" id="DefaultChannel.channel_prefix"><a class="viewcode-back" href="../../../api/evennia.comms.comms.html#evennia.comms.comms.DefaultChannel.channel_prefix">[docs]</a> <span class="k">def</span> <span class="nf">channel_prefix</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">msg</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span> <span class="n">emit</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="sd">&quot;&quot;&quot;</span>
<span class="sd"> Hook method. How the channel should prefix itself for users.</span>
<span class="sd"> Args:</span>
<span class="sd"> msg (str, optional): Prefix text</span>
<span class="sd"> emit (bool, optional): Switches to emit mode, which usually</span>
<span class="sd"> means to not prefix the channel&#39;s info.</span>
<span class="sd"> **kwargs (dict): Arbitrary, optional arguments for users</span>
<span class="sd"> overriding the call (unused by default).</span>
<span class="sd"> Returns:</span>
<span class="sd"> prefix (str): The created channel prefix.</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="k">return</span> <span class="s2">&quot;&quot;</span> <span class="k">if</span> <span class="n">emit</span> <span class="k">else</span> <span class="s2">&quot;[</span><span class="si">%s</span><span class="s2">] &quot;</span> <span class="o">%</span> <span class="bp">self</span><span class="o">.</span><span class="n">key</span></div>
<div class="viewcode-block" id="DefaultChannel.format_senders"><a class="viewcode-back" href="../../../api/evennia.comms.comms.html#evennia.comms.comms.DefaultChannel.format_senders">[docs]</a> <span class="k">def</span> <span class="nf">format_senders</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">senders</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"> Hook method. Function used to format a list of sender names.</span>
<span class="sd"> Args:</span>
<span class="sd"> senders (list): Sender object names.</span>
<span class="sd"> **kwargs (dict): Arbitrary, optional arguments for users</span>
<span class="sd"> overriding the call (unused by default).</span>
<span class="sd"> Returns:</span>
<span class="sd"> formatted_list (str): The list of names formatted appropriately.</span>
<span class="sd"> Notes:</span>
<span class="sd"> This function exists separately so that external sources</span>
<span class="sd"> can use it to format source names in the same manner as</span>
<span class="sd"> normal object/account names.</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="k">if</span> <span class="ow">not</span> <span class="n">senders</span><span class="p">:</span>
<span class="k">return</span> <span class="s2">&quot;&quot;</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="n">senders</span><span class="p">)</span></div>
<div class="viewcode-block" id="DefaultChannel.pose_transform"><a class="viewcode-back" href="../../../api/evennia.comms.comms.html#evennia.comms.comms.DefaultChannel.pose_transform">[docs]</a> <span class="k">def</span> <span class="nf">pose_transform</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">msgobj</span><span class="p">,</span> <span class="n">sender_string</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"> Hook method. Detects if the sender is posing, and modifies the</span>
<span class="sd"> message accordingly.</span>
<span class="sd"> Args:</span>
<span class="sd"> msgobj (Msg or TempMsg): The message to analyze for a pose.</span>
<span class="sd"> sender_string (str): The name of the sender/poser.</span>
<span class="sd"> **kwargs (dict): Arbitrary, optional arguments for users</span>
<span class="sd"> overriding the call (unused by default).</span>
<span class="sd"> Returns:</span>
<span class="sd"> string (str): A message that combines the `sender_string`</span>
<span class="sd"> component with `msg` in different ways depending on if a</span>
<span class="sd"> pose was performed or not (this must be analyzed by the</span>
<span class="sd"> hook).</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="n">pose</span> <span class="o">=</span> <span class="kc">False</span>
<span class="n">message</span> <span class="o">=</span> <span class="n">msgobj</span><span class="o">.</span><span class="n">message</span>
<span class="n">message_start</span> <span class="o">=</span> <span class="n">message</span><span class="o">.</span><span class="n">lstrip</span><span class="p">()</span>
<span class="k">if</span> <span class="n">message_start</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="s2">&quot;;&quot;</span><span class="p">)):</span>
<span class="n">pose</span> <span class="o">=</span> <span class="kc">True</span>
<span class="n">message</span> <span class="o">=</span> <span class="n">message</span><span class="p">[</span><span class="mi">1</span><span class="p">:]</span>
<span class="k">if</span> <span class="ow">not</span> <span class="n">message</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="s2">&quot;&#39;&quot;</span><span class="p">,</span> <span class="s2">&quot;,&quot;</span><span class="p">)):</span>
<span class="k">if</span> <span class="ow">not</span> <span class="n">message</span><span class="o">.</span><span class="n">startswith</span><span class="p">(</span><span class="s2">&quot; &quot;</span><span class="p">):</span>
<span class="n">message</span> <span class="o">=</span> <span class="s2">&quot; &quot;</span> <span class="o">+</span> <span class="n">message</span>
<span class="k">if</span> <span class="n">pose</span><span class="p">:</span>
<span class="k">return</span> <span class="s2">&quot;</span><span class="si">%s%s</span><span class="s2">&quot;</span> <span class="o">%</span> <span class="p">(</span><span class="n">sender_string</span><span class="p">,</span> <span class="n">message</span><span class="p">)</span>
<span class="k">else</span><span class="p">:</span>
<span class="k">return</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">sender_string</span><span class="p">,</span> <span class="n">message</span><span class="p">)</span></div>
<div class="viewcode-block" id="DefaultChannel.format_external"><a class="viewcode-back" href="../../../api/evennia.comms.comms.html#evennia.comms.comms.DefaultChannel.format_external">[docs]</a> <span class="k">def</span> <span class="nf">format_external</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">msgobj</span><span class="p">,</span> <span class="n">senders</span><span class="p">,</span> <span class="n">emit</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="sd">&quot;&quot;&quot;</span>
<span class="sd"> Hook method. Used for formatting external messages. This is</span>
<span class="sd"> needed as a separate operation because the senders of external</span>
<span class="sd"> messages may not be in-game objects/accounts, and so cannot</span>
<span class="sd"> have things like custom user preferences.</span>
<span class="sd"> Args:</span>
<span class="sd"> msgobj (Msg or TempMsg): The message to send.</span>
<span class="sd"> senders (list): Strings, one per sender.</span>
<span class="sd"> emit (bool, optional): A sender-agnostic message or not.</span>
<span class="sd"> **kwargs (dict): Arbitrary, optional arguments for users</span>
<span class="sd"> overriding the call (unused by default).</span>
<span class="sd"> Returns:</span>
<span class="sd"> transformed (str): A formatted string.</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="k">if</span> <span class="n">emit</span> <span class="ow">or</span> <span class="ow">not</span> <span class="n">senders</span><span class="p">:</span>
<span class="k">return</span> <span class="n">msgobj</span><span class="o">.</span><span class="n">message</span>
<span class="n">senders</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">senders</span><span class="p">)</span>
<span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">pose_transform</span><span class="p">(</span><span class="n">msgobj</span><span class="p">,</span> <span class="n">senders</span><span class="p">)</span></div>
<div class="viewcode-block" id="DefaultChannel.format_message"><a class="viewcode-back" href="../../../api/evennia.comms.comms.html#evennia.comms.comms.DefaultChannel.format_message">[docs]</a> <span class="k">def</span> <span class="nf">format_message</span><span class="p">(</span><span class="bp">self</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="kc">False</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"> Hook method. Formats a message body for display.</span>
<span class="sd"> Args:</span>
<span class="sd"> msgobj (Msg or TempMsg): The message object to send.</span>
<span class="sd"> emit (bool, optional): The message is agnostic of senders.</span>
<span class="sd"> **kwargs (dict): Arbitrary, optional arguments for users</span>
<span class="sd"> overriding the call (unused by default).</span>
<span class="sd"> Returns:</span>
<span class="sd"> transformed (str): The formatted message.</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="c1"># We don&#39;t want to count things like external sources as senders for</span>
<span class="c1"># the purpose of constructing the message string.</span>
<span class="n">senders</span> <span class="o">=</span> <span class="p">[</span><span class="n">sender</span> <span class="k">for</span> <span class="n">sender</span> <span class="ow">in</span> <span class="n">msgobj</span><span class="o">.</span><span class="n">senders</span> <span class="k">if</span> <span class="nb">hasattr</span><span class="p">(</span><span class="n">sender</span><span class="p">,</span> <span class="s2">&quot;key&quot;</span><span class="p">)]</span>
<span class="k">if</span> <span class="ow">not</span> <span class="n">senders</span><span class="p">:</span>
<span class="n">emit</span> <span class="o">=</span> <span class="kc">True</span>
<span class="k">if</span> <span class="n">emit</span><span class="p">:</span>
<span class="k">return</span> <span class="n">msgobj</span><span class="o">.</span><span class="n">message</span>
<span class="k">else</span><span class="p">:</span>
<span class="n">senders</span> <span class="o">=</span> <span class="p">[</span><span class="n">sender</span><span class="o">.</span><span class="n">key</span> <span class="k">for</span> <span class="n">sender</span> <span class="ow">in</span> <span class="n">msgobj</span><span class="o">.</span><span class="n">senders</span><span class="p">]</span>
<span class="n">senders</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">senders</span><span class="p">)</span>
<span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">pose_transform</span><span class="p">(</span><span class="n">msgobj</span><span class="p">,</span> <span class="n">senders</span><span class="p">)</span></div>
<div class="viewcode-block" id="DefaultChannel.pre_join_channel"><a class="viewcode-back" href="../../../api/evennia.comms.comms.html#evennia.comms.comms.DefaultChannel.pre_join_channel">[docs]</a> <span class="k">def</span> <span class="nf">pre_join_channel</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">joiner</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"> Hook method. Runs right before a channel is joined. If this</span>
<span class="sd"> returns a false value, channel joining is aborted.</span>
<span class="sd"> Args:</span>
<span class="sd"> joiner (object): The joining object.</span>
<span class="sd"> **kwargs (dict): Arbitrary, optional arguments for users</span>
<span class="sd"> overriding the call (unused by default).</span>
<span class="sd"> Returns:</span>
<span class="sd"> should_join (bool): If `False`, channel joining is aborted.</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="k">return</span> <span class="kc">True</span></div>
<div class="viewcode-block" id="DefaultChannel.post_join_channel"><a class="viewcode-back" href="../../../api/evennia.comms.comms.html#evennia.comms.comms.DefaultChannel.post_join_channel">[docs]</a> <span class="k">def</span> <span class="nf">post_join_channel</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">joiner</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"> Hook method. Runs right after an object or account joins a channel.</span>
<span class="sd"> Args:</span>
<span class="sd"> joiner (object): The joining object.</span>
<span class="sd"> **kwargs (dict): Arbitrary, optional arguments for users</span>
<span class="sd"> overriding the call (unused by default).</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="k">pass</span></div>
<div class="viewcode-block" id="DefaultChannel.pre_leave_channel"><a class="viewcode-back" href="../../../api/evennia.comms.comms.html#evennia.comms.comms.DefaultChannel.pre_leave_channel">[docs]</a> <span class="k">def</span> <span class="nf">pre_leave_channel</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">leaver</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"> Hook method. Runs right before a user leaves a channel. If this returns a false</span>
<span class="sd"> value, leaving the channel will be aborted.</span>
<span class="sd"> Args:</span>
<span class="sd"> leaver (object): The leaving object.</span>
<span class="sd"> **kwargs (dict): Arbitrary, optional arguments for users</span>
<span class="sd"> overriding the call (unused by default).</span>
<span class="sd"> Returns:</span>
<span class="sd"> should_leave (bool): If `False`, channel parting is aborted.</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="k">return</span> <span class="kc">True</span></div>
<div class="viewcode-block" id="DefaultChannel.post_leave_channel"><a class="viewcode-back" href="../../../api/evennia.comms.comms.html#evennia.comms.comms.DefaultChannel.post_leave_channel">[docs]</a> <span class="k">def</span> <span class="nf">post_leave_channel</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">leaver</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"> Hook method. Runs right after an object or account leaves a channel.</span>
<span class="sd"> Args:</span>
<span class="sd"> leaver (object): The leaving object.</span>
<span class="sd"> **kwargs (dict): Arbitrary, optional arguments for users</span>
<span class="sd"> overriding the call (unused by default).</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="k">pass</span></div>
<div class="viewcode-block" id="DefaultChannel.pre_send_message"><a class="viewcode-back" href="../../../api/evennia.comms.comms.html#evennia.comms.comms.DefaultChannel.pre_send_message">[docs]</a> <span class="k">def</span> <span class="nf">pre_send_message</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">msg</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"> Hook method. Runs before a message is sent to the channel and</span>
<span class="sd"> should return the message object, after any transformations.</span>
<span class="sd"> If the message is to be discarded, return a false value.</span>
<span class="sd"> Args:</span>
<span class="sd"> msg (Msg or TempMsg): Message to send.</span>
<span class="sd"> **kwargs (dict): Arbitrary, optional arguments for users</span>
<span class="sd"> overriding the call (unused by default).</span>
<span class="sd"> Returns:</span>
<span class="sd"> result (Msg, TempMsg or bool): If False, abort send.</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="k">return</span> <span class="n">msg</span></div>
<div class="viewcode-block" id="DefaultChannel.post_send_message"><a class="viewcode-back" href="../../../api/evennia.comms.comms.html#evennia.comms.comms.DefaultChannel.post_send_message">[docs]</a> <span class="k">def</span> <span class="nf">post_send_message</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">msg</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"> Hook method. Run after a message is sent to the channel.</span>
<span class="sd"> Args:</span>
<span class="sd"> msg (Msg or TempMsg): Message sent.</span>
<span class="sd"> **kwargs (dict): Arbitrary, optional arguments for users</span>
<span class="sd"> overriding the call (unused by default).</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="k">pass</span></div>
<div class="viewcode-block" id="DefaultChannel.at_init"><a class="viewcode-back" href="../../../api/evennia.comms.comms.html#evennia.comms.comms.DefaultChannel.at_init">[docs]</a> <span class="k">def</span> <span class="nf">at_init</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> Hook method. This is always called whenever this channel is</span>
<span class="sd"> initiated -- that is, whenever it its typeclass is cached from</span>
<span class="sd"> memory. This happens on-demand first time the channel is used</span>
<span class="sd"> or activated in some way after being created but also after</span>
<span class="sd"> each server restart or reload.</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="k">pass</span></div>
<span class="c1">#</span>
<span class="c1"># Web/Django methods</span>
<span class="c1">#</span>
<div class="viewcode-block" id="DefaultChannel.web_get_admin_url"><a class="viewcode-back" href="../../../api/evennia.comms.comms.html#evennia.comms.comms.DefaultChannel.web_get_admin_url">[docs]</a> <span class="k">def</span> <span class="nf">web_get_admin_url</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> Returns the URI path for the Django Admin page for this object.</span>
<span class="sd"> ex. Account#1 = &#39;/admin/accounts/accountdb/1/change/&#39;</span>
<span class="sd"> Returns:</span>
<span class="sd"> path (str): URI path to Django Admin page for object.</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="n">content_type</span> <span class="o">=</span> <span class="n">ContentType</span><span class="o">.</span><span class="n">objects</span><span class="o">.</span><span class="n">get_for_model</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="vm">__class__</span><span class="p">)</span>
<span class="k">return</span> <span class="n">reverse</span><span class="p">(</span>
<span class="s2">&quot;admin:</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="n">content_type</span><span class="o">.</span><span class="n">app_label</span><span class="p">,</span> <span class="n">content_type</span><span class="o">.</span><span class="n">model</span><span class="p">),</span> <span class="n">args</span><span class="o">=</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">id</span><span class="p">,)</span>
<span class="p">)</span></div>
<div class="viewcode-block" id="DefaultChannel.web_get_create_url"><a class="viewcode-back" href="../../../api/evennia.comms.comms.html#evennia.comms.comms.DefaultChannel.web_get_create_url">[docs]</a> <span class="nd">@classmethod</span>
<span class="k">def</span> <span class="nf">web_get_create_url</span><span class="p">(</span><span class="bp">cls</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> Returns the URI path for a View that allows users to create new</span>
<span class="sd"> instances of this object.</span>
<span class="sd"> ex. Chargen = &#39;/characters/create/&#39;</span>
<span class="sd"> For this to work, the developer must have defined a named view somewhere</span>
<span class="sd"> in urls.py that follows the format &#39;modelname-action&#39;, so in this case</span>
<span class="sd"> a named view of &#39;channel-create&#39; would be referenced by this method.</span>
<span class="sd"> ex.</span>
<span class="sd"> url(r&#39;channels/create/&#39;, ChannelCreateView.as_view(), name=&#39;channel-create&#39;)</span>
<span class="sd"> If no View has been created and defined in urls.py, returns an</span>
<span class="sd"> HTML anchor.</span>
<span class="sd"> This method is naive and simply returns a path. Securing access to</span>
<span class="sd"> the actual view and limiting who can create new objects is the</span>
<span class="sd"> developer&#39;s responsibility.</span>
<span class="sd"> Returns:</span>
<span class="sd"> path (str): URI path to object creation page, if defined.</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="k">try</span><span class="p">:</span>
<span class="k">return</span> <span class="n">reverse</span><span class="p">(</span><span class="s2">&quot;</span><span class="si">%s</span><span class="s2">-create&quot;</span> <span class="o">%</span> <span class="n">slugify</span><span class="p">(</span><span class="bp">cls</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="k">except</span><span class="p">:</span>
<span class="k">return</span> <span class="s2">&quot;#&quot;</span></div>
<div class="viewcode-block" id="DefaultChannel.web_get_detail_url"><a class="viewcode-back" href="../../../api/evennia.comms.comms.html#evennia.comms.comms.DefaultChannel.web_get_detail_url">[docs]</a> <span class="k">def</span> <span class="nf">web_get_detail_url</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> Returns the URI path for a View that allows users to view details for</span>
<span class="sd"> this object.</span>
<span class="sd"> ex. Oscar (Character) = &#39;/characters/oscar/1/&#39;</span>
<span class="sd"> For this to work, the developer must have defined a named view somewhere</span>
<span class="sd"> in urls.py that follows the format &#39;modelname-action&#39;, so in this case</span>
<span class="sd"> a named view of &#39;channel-detail&#39; would be referenced by this method.</span>
<span class="sd"> ex.</span>
<span class="sd"> url(r&#39;channels/(?P&lt;slug&gt;[\w\d\-]+)/$&#39;,</span>
<span class="sd"> ChannelDetailView.as_view(), name=&#39;channel-detail&#39;)</span>
<span class="sd"> If no View has been created and defined in urls.py, returns an</span>
<span class="sd"> HTML anchor.</span>
<span class="sd"> This method is naive and simply returns a path. Securing access to</span>
<span class="sd"> the actual view and limiting who can view this object is the developer&#39;s</span>
<span class="sd"> responsibility.</span>
<span class="sd"> Returns:</span>
<span class="sd"> path (str): URI path to object detail page, if defined.</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="k">try</span><span class="p">:</span>
<span class="k">return</span> <span class="n">reverse</span><span class="p">(</span>
<span class="s2">&quot;</span><span class="si">%s</span><span class="s2">-detail&quot;</span> <span class="o">%</span> <span class="n">slugify</span><span class="p">(</span><span class="bp">self</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="n">kwargs</span><span class="o">=</span><span class="p">{</span><span class="s2">&quot;slug&quot;</span><span class="p">:</span> <span class="n">slugify</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">db_key</span><span class="p">)},</span>
<span class="p">)</span>
<span class="k">except</span><span class="p">:</span>
<span class="k">return</span> <span class="s2">&quot;#&quot;</span></div>
<div class="viewcode-block" id="DefaultChannel.web_get_update_url"><a class="viewcode-back" href="../../../api/evennia.comms.comms.html#evennia.comms.comms.DefaultChannel.web_get_update_url">[docs]</a> <span class="k">def</span> <span class="nf">web_get_update_url</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> Returns the URI path for a View that allows users to update this</span>
<span class="sd"> object.</span>
<span class="sd"> ex. Oscar (Character) = &#39;/characters/oscar/1/change/&#39;</span>
<span class="sd"> For this to work, the developer must have defined a named view somewhere</span>
<span class="sd"> in urls.py that follows the format &#39;modelname-action&#39;, so in this case</span>
<span class="sd"> a named view of &#39;channel-update&#39; would be referenced by this method.</span>
<span class="sd"> ex.</span>
<span class="sd"> url(r&#39;channels/(?P&lt;slug&gt;[\w\d\-]+)/(?P&lt;pk&gt;[0-9]+)/change/$&#39;,</span>
<span class="sd"> ChannelUpdateView.as_view(), name=&#39;channel-update&#39;)</span>
<span class="sd"> If no View has been created and defined in urls.py, returns an</span>
<span class="sd"> HTML anchor.</span>
<span class="sd"> This method is naive and simply returns a path. Securing access to</span>
<span class="sd"> the actual view and limiting who can modify objects is the developer&#39;s</span>
<span class="sd"> responsibility.</span>
<span class="sd"> Returns:</span>
<span class="sd"> path (str): URI path to object update page, if defined.</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="k">try</span><span class="p">:</span>
<span class="k">return</span> <span class="n">reverse</span><span class="p">(</span>
<span class="s2">&quot;</span><span class="si">%s</span><span class="s2">-update&quot;</span> <span class="o">%</span> <span class="n">slugify</span><span class="p">(</span><span class="bp">self</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="n">kwargs</span><span class="o">=</span><span class="p">{</span><span class="s2">&quot;slug&quot;</span><span class="p">:</span> <span class="n">slugify</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">db_key</span><span class="p">)},</span>
<span class="p">)</span>
<span class="k">except</span><span class="p">:</span>
<span class="k">return</span> <span class="s2">&quot;#&quot;</span></div>
<div class="viewcode-block" id="DefaultChannel.web_get_delete_url"><a class="viewcode-back" href="../../../api/evennia.comms.comms.html#evennia.comms.comms.DefaultChannel.web_get_delete_url">[docs]</a> <span class="k">def</span> <span class="nf">web_get_delete_url</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> Returns the URI path for a View that allows users to delete this object.</span>
<span class="sd"> ex. Oscar (Character) = &#39;/characters/oscar/1/delete/&#39;</span>
<span class="sd"> For this to work, the developer must have defined a named view somewhere</span>
<span class="sd"> in urls.py that follows the format &#39;modelname-action&#39;, so in this case</span>
<span class="sd"> a named view of &#39;channel-delete&#39; would be referenced by this method.</span>
<span class="sd"> ex.</span>
<span class="sd"> url(r&#39;channels/(?P&lt;slug&gt;[\w\d\-]+)/(?P&lt;pk&gt;[0-9]+)/delete/$&#39;,</span>
<span class="sd"> ChannelDeleteView.as_view(), name=&#39;channel-delete&#39;)</span>
<span class="sd"> If no View has been created and defined in urls.py, returns an</span>
<span class="sd"> HTML anchor.</span>
<span class="sd"> This method is naive and simply returns a path. Securing access to</span>
<span class="sd"> the actual view and limiting who can delete this object is the developer&#39;s</span>
<span class="sd"> responsibility.</span>
<span class="sd"> Returns:</span>
<span class="sd"> path (str): URI path to object deletion page, if defined.</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="k">try</span><span class="p">:</span>
<span class="k">return</span> <span class="n">reverse</span><span class="p">(</span>
<span class="s2">&quot;</span><span class="si">%s</span><span class="s2">-delete&quot;</span> <span class="o">%</span> <span class="n">slugify</span><span class="p">(</span><span class="bp">self</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="n">kwargs</span><span class="o">=</span><span class="p">{</span><span class="s2">&quot;slug&quot;</span><span class="p">:</span> <span class="n">slugify</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">db_key</span><span class="p">)},</span>
<span class="p">)</span>
<span class="k">except</span><span class="p">:</span>
<span class="k">return</span> <span class="s2">&quot;#&quot;</span></div>
<span class="c1"># Used by Django Sites/Admin</span>
<span class="n">get_absolute_url</span> <span class="o">=</span> <span class="n">web_get_detail_url</span></div>
</pre></div>
<div class="clearer"></div>
</div>
</div>
</div>
<div class="sphinxsidebar" role="navigation" aria-label="main navigation">
<div class="sphinxsidebarwrapper">
<p class="logo"><a href="../../../index.html">
<img class="logo" src="../../../_static/evennia_logo.png" alt="Logo"/>
</a></p>
<div id="searchbox" style="display: none" role="search">
<h3 id="searchlabel">Quick search</h3>
<div class="searchformwrapper">
<form class="search" action="../../../search.html" method="get">
<input type="text" name="q" aria-labelledby="searchlabel" />
<input type="submit" value="Go" />
</form>
</div>
</div>
<script>$('#searchbox').show(0);</script>
<h3>Versions</h3>
<ul>
<li><a href="comms.html">1.0-dev (develop branch)</a></li>
<li><a href="../../../../0.9.5/index.html">0.9.5 (v0.9.5 branch)</a></li>
</ul>
</div>
</div>
<div class="clearer"></div>
</div>
<div class="related" role="navigation" aria-label="related navigation">
<h3>Navigation</h3>
<ul>
<li class="right" style="margin-right: 10px">
<a href="../../../genindex.html" title="General Index"
>index</a></li>
<li class="right" >
<a href="../../../py-modindex.html" title="Python Module Index"
>modules</a> |</li>
<li class="nav-item nav-item-0"><a href="../../../index.html">Evennia 1.0-dev</a> &#187;</li>
<li class="nav-item nav-item-1"><a href="../../index.html" >Module code</a> &#187;</li>
<li class="nav-item nav-item-2"><a href="../../evennia.html" >evennia</a> &#187;</li>
<li class="nav-item nav-item-this"><a href="">evennia.comms.comms</a></li>
</ul>
<div class="develop">develop branch</div>
</div>
<div class="footer" role="contentinfo">
&#169; Copyright 2020, The Evennia developer community.
Created using <a href="https://www.sphinx-doc.org/">Sphinx</a> 3.2.1.
</div>
</body>
</html>