evennia/docs/1.0-dev/_modules/evennia/comms/comms.html
2021-06-23 18:58:26 +02:00

952 lines
No EOL
96 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="kn">import</span> <span class="n">ContentType</span>
<span class="kn">from</span> <span class="nn">django.urls</span> <span class="kn">import</span> <span class="n">reverse</span>
<span class="kn">from</span> <span class="nn">django.utils.text</span> <span class="kn">import</span> <span class="n">slugify</span>
<span class="kn">from</span> <span class="nn">evennia.typeclasses.models</span> <span class="kn">import</span> <span class="n">TypeclassBase</span>
<span class="kn">from</span> <span class="nn">evennia.comms.models</span> <span class="kn">import</span> <span class="n">ChannelDB</span>
<span class="kn">from</span> <span class="nn">evennia.comms.managers</span> <span class="kn">import</span> <span class="n">ChannelManager</span>
<span class="kn">from</span> <span class="nn">evennia.utils</span> <span class="kn">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="kn">import</span> <span class="n">make_iter</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"> Class-level variables:</span>
<span class="sd"> - `send_to_online_only` (bool, default True) - if set, will only try to</span>
<span class="sd"> send to subscribers that are actually active. This is a useful optimization.</span>
<span class="sd"> - `log_file` (str, default `&quot;channel_{channelname}.log&quot;`). This is the</span>
<span class="sd"> log file to which the channel history will be saved. The `{channelname}` tag</span>
<span class="sd"> will be replaced by the key of the Channel. If an Attribute &#39;log_file&#39;</span>
<span class="sd"> is set, this will be used instead. If this is None and no Attribute is found,</span>
<span class="sd"> no history will be saved.</span>
<span class="sd"> - `channel_prefix_string` (str, default `&quot;[{channelname} ]&quot;`) - this is used</span>
<span class="sd"> as a simple template to get the channel prefix with `.channel_prefix()`.</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>
<span class="c1"># channel configuration</span>
<span class="c1"># only send to characters/accounts who has an active session (this is a</span>
<span class="c1"># good optimization since people can still recover history separately).</span>
<span class="n">send_to_online_only</span> <span class="o">=</span> <span class="kc">True</span>
<span class="c1"># store log in log file. `channel_key tag will be replace with key of channel.</span>
<span class="c1"># Will use log_file Attribute first, if given</span>
<span class="n">log_file</span> <span class="o">=</span> <span class="s2">&quot;channel_</span><span class="si">{channelname}</span><span class="s2">.log&quot;</span>
<span class="c1"># which prefix to use when showing were a message is coming from. Set to</span>
<span class="c1"># None to disable and set this later.</span>
<span class="n">channel_prefix_string</span> <span class="o">=</span> <span class="s2">&quot;[</span><span class="si">{channelname}</span><span class="s2">] &quot;</span>
<span class="c1"># default nick-alias replacements (default using the &#39;channel&#39; command)</span>
<span class="n">channel_msg_nick_pattern</span> <span class="o">=</span> <span class="sa">r</span><span class="s2">&quot;</span><span class="si">{alias}</span><span class="s2">\s*?|</span><span class="si">{alias}</span><span class="s2">\s+?(?P&lt;arg1&gt;.+?)&quot;</span>
<span class="n">channel_msg_nick_replacement</span> <span class="o">=</span> <span class="s2">&quot;channel </span><span class="si">{channelname}</span><span class="s2"> = $1&quot;</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="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="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>
<span class="c1"># make sure we don&#39;t have access to a same-named old channel&#39;s history.</span>
<span class="n">log_file</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">get_log_filename</span><span class="p">()</span>
<span class="n">logger</span><span class="o">.</span><span class="n">rotate_log_file</span><span class="p">(</span><span class="n">log_file</span><span class="p">,</span> <span class="n">num_lines_to_append</span><span class="o">=</span><span class="mi">0</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>
<span class="n">_log_file</span> <span class="o">=</span> <span class="kc">None</span>
<div class="viewcode-block" id="DefaultChannel.get_log_filename"><a class="viewcode-back" href="../../../api/evennia.comms.comms.html#evennia.comms.comms.DefaultChannel.get_log_filename">[docs]</a> <span class="k">def</span> <span class="nf">get_log_filename</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> File name to use for channel log.</span>
<span class="sd"> Returns:</span>
<span class="sd"> str: The filename to use (this is always assumed to be inside</span>
<span class="sd"> settings.LOG_DIR)</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="k">if</span> <span class="ow">not</span> <span class="bp">self</span><span class="o">.</span><span class="n">_log_file</span><span class="p">:</span>
<span class="bp">self</span><span class="o">.</span><span class="n">_log_file</span> <span class="o">=</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="bp">self</span><span class="o">.</span><span class="n">log_file</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">channelname</span><span class="o">=</span><span class="bp">self</span><span class="o">.</span><span class="n">key</span><span class="o">.</span><span class="n">lower</span><span class="p">()))</span>
<span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">_log_file</span></div>
<div class="viewcode-block" id="DefaultChannel.set_log_filename"><a class="viewcode-back" href="../../../api/evennia.comms.comms.html#evennia.comms.comms.DefaultChannel.set_log_filename">[docs]</a> <span class="k">def</span> <span class="nf">set_log_filename</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">filename</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> Set a custom log filename.</span>
<span class="sd"> Args:</span>
<span class="sd"> filename (str): The filename to set. This is a path starting from</span>
<span class="sd"> inside the settings.LOG_DIR location.</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">add</span><span class="p">(</span><span class="s2">&quot;log_file&quot;</span><span class="p">,</span> <span class="n">filename</span><span class="p">)</span></div>
<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">banlist</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">ban_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"> Returns:</span>
<span class="sd"> bool: True if muting was successful, False if we were already</span>
<span class="sd"> muted.</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 from the list of muted subscribers. A muted subscriber</span>
<span class="sd"> will no longer see channel messages, 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"> Returns:</span>
<span class="sd"> bool: True if unmuting was successful, False if we were already</span>
<span class="sd"> unmuted.</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="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.ban"><a class="viewcode-back" href="../../../api/evennia.comms.comms.html#evennia.comms.comms.DefaultChannel.ban">[docs]</a> <span class="k">def</span> <span class="nf">ban</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">target</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"> Ban a given user from connecting to the channel. This will not stop</span>
<span class="sd"> users already connected, so the user must be booted for this to take</span>
<span class="sd"> effect.</span>
<span class="sd"> Args:</span>
<span class="sd"> target (Object or Account): The entity to unmute. This need not</span>
<span class="sd"> be a subscriber.</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"> bool: True if banning was successful, False if target was already</span>
<span class="sd"> banned.</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="n">banlist</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">banlist</span>
<span class="k">if</span> <span class="n">target</span> <span class="ow">not</span> <span class="ow">in</span> <span class="n">banlist</span><span class="p">:</span>
<span class="n">banlist</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">target</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">ban_list</span> <span class="o">=</span> <span class="n">banlist</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.unban"><a class="viewcode-back" href="../../../api/evennia.comms.comms.html#evennia.comms.comms.DefaultChannel.unban">[docs]</a> <span class="k">def</span> <span class="nf">unban</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">target</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"> Un-Ban a given user. This will not reconnect them - they will still</span>
<span class="sd"> have to reconnect and set up aliases anew.</span>
<span class="sd"> Args:</span>
<span class="sd"> target (Object or Account): The entity to unmute. This need not</span>
<span class="sd"> be a subscriber.</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"> bool: True if unbanning was successful, False if target was not</span>
<span class="sd"> previously banned.</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="n">banlist</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">banlist</span><span class="p">)</span>
<span class="k">if</span> <span class="n">target</span> <span class="ow">in</span> <span class="n">banlist</span><span class="p">:</span>
<span class="n">banlist</span> <span class="o">=</span> <span class="p">[</span><span class="n">banned</span> <span class="k">for</span> <span class="n">banned</span> <span class="ow">in</span> <span class="n">banlist</span> <span class="k">if</span> <span class="n">banned</span> <span class="o">!=</span> <span class="n">target</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">ban_list</span> <span class="o">=</span> <span class="n">banlist</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="n">subscriber</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">banlist</span> <span class="ow">or</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">creator</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"> creator (Account or Object): Entity to associate with this channel</span>
<span class="sd"> (used for tracking)</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">creator</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">creator</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.</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="k">for</span> <span class="n">subscriber</span> <span class="ow">in</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="bp">self</span><span class="o">.</span><span class="n">disconnect</span><span class="p">(</span><span class="n">subscriber</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></div>
<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="sd">&quot;&quot;&quot;</span>
<span class="sd"> Hook method. How the channel should prefix itself for users.</span>
<span class="sd"> Returns:</span>
<span class="sd"> str: The channel prefix.</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">channel_prefix_string</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">channelname</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.add_user_channel_alias"><a class="viewcode-back" href="../../../api/evennia.comms.comms.html#evennia.comms.comms.DefaultChannel.add_user_channel_alias">[docs]</a> <span class="k">def</span> <span class="nf">add_user_channel_alias</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">user</span><span class="p">,</span> <span class="n">alias</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"> Add a personal user-alias for this channel to a given subscriber.</span>
<span class="sd"> Args:</span>
<span class="sd"> user (Object or Account): The one to alias this channel.</span>
<span class="sd"> alias (str): The desired alias.</span>
<span class="sd"> Note:</span>
<span class="sd"> This is tightly coupled to the default `channel` command. If you</span>
<span class="sd"> change that, you need to change this as well.</span>
<span class="sd"> We add two nicks - one is a plain `alias -&gt; channel.key` that</span>
<span class="sd"> users need to be able to reference this channel easily. The other</span>
<span class="sd"> is a templated nick to easily be able to send messages to the</span>
<span class="sd"> channel without needing to give the full `channel` command. The</span>
<span class="sd"> structure of this nick is given by `self.channel_msg_nick_pattern`</span>
<span class="sd"> and `self.channel_msg_nick_replacement`. By default it maps</span>
<span class="sd"> `alias &lt;msg&gt; -&gt; channel &lt;channelname&gt; = &lt;msg&gt;`, so that you can</span>
<span class="sd"> for example just write `pub Hello` to send a message.</span>
<span class="sd"> The alias created is `alias $1 -&gt; channel channel = $1`, to allow</span>
<span class="sd"> for sending to channel using the main channel command.</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="n">chan_key</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">key</span><span class="o">.</span><span class="n">lower</span><span class="p">()</span>
<span class="c1"># the message-pattern allows us to type the channel on its own without</span>
<span class="c1"># needing to use the `channel` command explicitly.</span>
<span class="n">msg_nick_pattern</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">channel_msg_nick_pattern</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">alias</span><span class="o">=</span><span class="n">alias</span><span class="p">)</span>
<span class="n">msg_nick_replacement</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">channel_msg_nick_replacement</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">channelname</span><span class="o">=</span><span class="n">chan_key</span><span class="p">)</span>
<span class="n">user</span><span class="o">.</span><span class="n">nicks</span><span class="o">.</span><span class="n">add</span><span class="p">(</span><span class="n">msg_nick_pattern</span><span class="p">,</span> <span class="n">msg_nick_replacement</span><span class="p">,</span> <span class="n">category</span><span class="o">=</span><span class="s2">&quot;inputline&quot;</span><span class="p">,</span>
<span class="n">pattern_is_regex</span><span class="o">=</span><span class="kc">True</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">)</span>
<span class="k">if</span> <span class="n">chan_key</span> <span class="o">!=</span> <span class="n">alias</span><span class="p">:</span>
<span class="c1"># this allows for using the alias for general channel lookups</span>
<span class="n">user</span><span class="o">.</span><span class="n">nicks</span><span class="o">.</span><span class="n">add</span><span class="p">(</span><span class="n">alias</span><span class="p">,</span> <span class="n">chan_key</span><span class="p">,</span> <span class="n">category</span><span class="o">=</span><span class="s2">&quot;channel&quot;</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">)</span></div>
<div class="viewcode-block" id="DefaultChannel.remove_user_channel_alias"><a class="viewcode-back" href="../../../api/evennia.comms.comms.html#evennia.comms.comms.DefaultChannel.remove_user_channel_alias">[docs]</a> <span class="nd">@classmethod</span>
<span class="k">def</span> <span class="nf">remove_user_channel_alias</span><span class="p">(</span><span class="bp">cls</span><span class="p">,</span> <span class="n">user</span><span class="p">,</span> <span class="n">alias</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"> Remove a personal channel alias from a user.</span>
<span class="sd"> Args:</span>
<span class="sd"> user (Object or Account): The user to remove an alias from.</span>
<span class="sd"> alias (str): The alias to remove.</span>
<span class="sd"> **kwargs: Unused by default. Can be used to pass extra variables</span>
<span class="sd"> into a custom implementation.</span>
<span class="sd"> Notes:</span>
<span class="sd"> The channel-alias actually consists of two aliases - one</span>
<span class="sd"> channel-based one for searching channels with the alias and one</span>
<span class="sd"> inputline one for doing the &#39;channelalias msg&#39; - call.</span>
<span class="sd"> This is a classmethod because it doesn&#39;t actually operate on the</span>
<span class="sd"> channel instance.</span>
<span class="sd"> It sits on the channel because the nick structure for this is</span>
<span class="sd"> pretty complex and needs to be located in a central place (rather</span>
<span class="sd"> on, say, the channel command).</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="n">user</span><span class="o">.</span><span class="n">nicks</span><span class="o">.</span><span class="n">remove</span><span class="p">(</span><span class="n">alias</span><span class="p">,</span> <span class="n">category</span><span class="o">=</span><span class="s2">&quot;channel&quot;</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">)</span>
<span class="n">msg_nick_pattern</span> <span class="o">=</span> <span class="bp">cls</span><span class="o">.</span><span class="n">channel_msg_nick_pattern</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">alias</span><span class="o">=</span><span class="n">alias</span><span class="p">)</span>
<span class="n">user</span><span class="o">.</span><span class="n">nicks</span><span class="o">.</span><span class="n">remove</span><span class="p">(</span><span class="n">msg_nick_pattern</span><span class="p">,</span> <span class="n">category</span><span class="o">=</span><span class="s2">&quot;inputline&quot;</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">)</span></div>
<div class="viewcode-block" id="DefaultChannel.at_pre_msg"><a class="viewcode-back" href="../../../api/evennia.comms.comms.html#evennia.comms.comms.DefaultChannel.at_pre_msg">[docs]</a> <span class="k">def</span> <span class="nf">at_pre_msg</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="o">**</span><span class="n">kwargs</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> Called before the starting of sending the message to a receiver. This</span>
<span class="sd"> is called before any hooks on the receiver itself. If this returns</span>
<span class="sd"> None/False, the sending will be aborted.</span>
<span class="sd"> Args:</span>
<span class="sd"> message (str): The message to send.</span>
<span class="sd"> **kwargs (any): Keywords passed on from `.msg`. This includes</span>
<span class="sd"> `senders`.</span>
<span class="sd"> Returns:</span>
<span class="sd"> str, False or None: Any custom changes made to the message. If</span>
<span class="sd"> falsy, no message will be sent.</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="k">return</span> <span class="n">message</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">message</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">bypass_mute</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"> Send message to channel, causing it to be distributed to all non-muted</span>
<span class="sd"> subscribed users of that channel.</span>
<span class="sd"> Args:</span>
<span class="sd"> message (str): The message to send.</span>
<span class="sd"> senders (Object, Account or list, optional): If not given, there is</span>
<span class="sd"> no way to associate one or more senders with the message (like</span>
<span class="sd"> a broadcast message or similar).</span>
<span class="sd"> bypass_mute (bool, optional): If set, always send, regardless of</span>
<span class="sd"> individual mute-state of subscriber. This can be used for</span>
<span class="sd"> global announcements or warnings/alerts.</span>
<span class="sd"> **kwargs (any): This will be passed on to all hooks. Use `no_prefix`</span>
<span class="sd"> to exclude the channel prefix.</span>
<span class="sd"> Notes:</span>
<span class="sd"> The call hook calling sequence is:</span>
<span class="sd"> - `msg = channel.at_pre_msg(message, **kwargs)` (aborts for all if return None)</span>
<span class="sd"> - `msg = receiver.at_pre_channel_msg(msg, channel, **kwargs)` (aborts for receiver if return None)</span>
<span class="sd"> - `receiver.at_channel_msg(msg, channel, **kwargs)`</span>
<span class="sd"> - `receiver.at_post_channel_msg(msg, channel, **kwargs)``</span>
<span class="sd"> Called after all receivers are processed:</span>
<span class="sd"> - `channel.at_post_all_msg(message, **kwargs)`</span>
<span class="sd"> (where the senders/bypass_mute are embedded into **kwargs for</span>
<span class="sd"> later access in hooks)</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="bp">self</span><span class="o">.</span><span class="n">send_to_online_only</span><span class="p">:</span>
<span class="n">receivers</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">receivers</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">if</span> <span class="ow">not</span> <span class="n">bypass_mute</span><span class="p">:</span>
<span class="n">receivers</span> <span class="o">=</span> <span class="p">[</span><span class="n">receiver</span> <span class="k">for</span> <span class="n">receiver</span> <span class="ow">in</span> <span class="n">receivers</span> <span class="k">if</span> <span class="n">receiver</span> <span class="ow">not</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="n">send_kwargs</span> <span class="o">=</span> <span class="p">{</span><span class="s1">&#39;senders&#39;</span><span class="p">:</span> <span class="n">senders</span><span class="p">,</span> <span class="s1">&#39;bypass_mute&#39;</span><span class="p">:</span> <span class="n">bypass_mute</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">}</span>
<span class="c1"># pre-send hook</span>
<span class="n">message</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">at_pre_msg</span><span class="p">(</span><span class="n">message</span><span class="p">,</span> <span class="o">**</span><span class="n">send_kwargs</span><span class="p">)</span>
<span class="k">if</span> <span class="n">message</span> <span class="ow">in</span> <span class="p">(</span><span class="kc">None</span><span class="p">,</span> <span class="kc">False</span><span class="p">):</span>
<span class="k">return</span>
<span class="k">for</span> <span class="n">receiver</span> <span class="ow">in</span> <span class="n">receivers</span><span class="p">:</span>
<span class="c1"># send to each individual subscriber</span>
<span class="k">try</span><span class="p">:</span>
<span class="n">recv_message</span> <span class="o">=</span> <span class="n">receiver</span><span class="o">.</span><span class="n">at_pre_channel_msg</span><span class="p">(</span><span class="n">message</span><span class="p">,</span> <span class="bp">self</span><span class="p">,</span> <span class="o">**</span><span class="n">send_kwargs</span><span class="p">)</span>
<span class="k">if</span> <span class="n">recv_message</span> <span class="ow">in</span> <span class="p">(</span><span class="kc">None</span><span class="p">,</span> <span class="kc">False</span><span class="p">):</span>
<span class="k">return</span>
<span class="n">receiver</span><span class="o">.</span><span class="n">channel_msg</span><span class="p">(</span><span class="n">recv_message</span><span class="p">,</span> <span class="bp">self</span><span class="p">,</span> <span class="o">**</span><span class="n">send_kwargs</span><span class="p">)</span>
<span class="n">receiver</span><span class="o">.</span><span class="n">at_post_channel_msg</span><span class="p">(</span><span class="n">recv_message</span><span class="p">,</span> <span class="bp">self</span><span class="p">,</span> <span class="o">**</span><span class="n">send_kwargs</span><span class="p">)</span>
<span class="k">except</span> <span class="ne">Exception</span><span class="p">:</span>
<span class="n">logger</span><span class="o">.</span><span class="n">log_trace</span><span class="p">(</span><span class="sa">f</span><span class="s2">&quot;Error sending channel message to </span><span class="si">{</span><span class="n">receiver</span><span class="si">}</span><span class="s2">.&quot;</span><span class="p">)</span>
<span class="c1"># post-send hook</span>
<span class="bp">self</span><span class="o">.</span><span class="n">at_post_msg</span><span class="p">(</span><span class="n">message</span><span class="p">,</span> <span class="o">**</span><span class="n">send_kwargs</span><span class="p">)</span></div>
<div class="viewcode-block" id="DefaultChannel.at_post_msg"><a class="viewcode-back" href="../../../api/evennia.comms.comms.html#evennia.comms.comms.DefaultChannel.at_post_msg">[docs]</a> <span class="k">def</span> <span class="nf">at_post_msg</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="o">**</span><span class="n">kwargs</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> This is called after sending to *all* valid recipients. It is normally</span>
<span class="sd"> used for logging/channel history.</span>
<span class="sd"> Args:</span>
<span class="sd"> message (str): The message sent.</span>
<span class="sd"> **kwargs (any): Keywords passed on from `msg`, including `senders`.</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="c1"># save channel history to log file</span>
<span class="n">log_file</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">get_log_filename</span><span class="p">()</span>
<span class="k">if</span> <span class="n">log_file</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">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">kwargs</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s2">&quot;senders&quot;</span><span class="p">,</span> <span class="p">[]))</span>
<span class="n">senders</span> <span class="o">=</span> <span class="sa">f</span><span class="s2">&quot;</span><span class="si">{</span><span class="n">senders</span><span class="si">}</span><span class="s2">: &quot;</span> <span class="k">if</span> <span class="n">senders</span> <span class="k">else</span> <span class="s2">&quot;&quot;</span>
<span class="n">message</span> <span class="o">=</span> <span class="sa">f</span><span class="s2">&quot;</span><span class="si">{</span><span class="n">senders</span><span class="si">}{</span><span class="n">message</span><span class="si">}</span><span class="s2">&quot;</span>
<span class="n">logger</span><span class="o">.</span><span class="n">log_file</span><span class="p">(</span><span class="n">message</span><span class="p">,</span> <span class="n">log_file</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"> Notes:</span>
<span class="sd"> By default this adds the needed channel nicks to the joiner.</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="n">key_and_aliases</span> <span class="o">=</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">lower</span><span class="p">()]</span> <span class="o">+</span> <span class="p">[</span><span class="n">alias</span><span class="o">.</span><span class="n">lower</span><span class="p">()</span> <span class="k">for</span> <span class="n">alias</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">aliases</span><span class="o">.</span><span class="n">all</span><span class="p">()]</span>
<span class="k">for</span> <span class="n">key_or_alias</span> <span class="ow">in</span> <span class="n">key_and_aliases</span><span class="p">:</span>
<span class="bp">self</span><span class="o">.</span><span class="n">add_user_channel_alias</span><span class="p">(</span><span class="n">joiner</span><span class="p">,</span> <span class="n">key_or_alias</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">)</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="n">chan_key</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">key</span><span class="o">.</span><span class="n">lower</span><span class="p">()</span>
<span class="n">key_or_aliases</span> <span class="o">=</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">lower</span><span class="p">()]</span> <span class="o">+</span> <span class="p">[</span><span class="n">alias</span><span class="o">.</span><span class="n">lower</span><span class="p">()</span> <span class="k">for</span> <span class="n">alias</span> <span class="ow">in</span> <span class="bp">self</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">nicktuples</span> <span class="o">=</span> <span class="n">leaver</span><span class="o">.</span><span class="n">nicks</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="n">category</span><span class="o">=</span><span class="s2">&quot;channel&quot;</span><span class="p">,</span> <span class="n">return_tuple</span><span class="o">=</span><span class="kc">True</span><span class="p">,</span> <span class="n">return_list</span><span class="o">=</span><span class="kc">True</span><span class="p">)</span>
<span class="n">key_or_aliases</span> <span class="o">+=</span> <span class="p">[</span><span class="n">tup</span><span class="p">[</span><span class="mi">2</span><span class="p">]</span> <span class="k">for</span> <span class="n">tup</span> <span class="ow">in</span> <span class="n">nicktuples</span> <span class="k">if</span> <span class="n">tup</span><span class="p">[</span><span class="mi">3</span><span class="p">]</span><span class="o">.</span><span class="n">lower</span><span class="p">()</span> <span class="o">==</span> <span class="n">chan_key</span><span class="p">]</span>
<span class="k">for</span> <span class="n">key_or_alias</span> <span class="ow">in</span> <span class="n">key_or_aliases</span><span class="p">:</span>
<span class="bp">self</span><span class="o">.</span><span class="n">remove_user_channel_alias</span><span class="p">(</span><span class="n">leaver</span><span class="p">,</span> <span class="n">key_or_alias</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">)</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="ne">Exception</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"> ::</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="ne">Exception</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"> ::</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="ne">Exception</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="ne">Exception</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>
<span class="c1"># TODO Evennia 1.0+ removed hooks. Remove in 1.1.</span>
<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="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="k">raise</span> <span class="ne">RuntimeError</span><span class="p">(</span><span class="s2">&quot;Channel.message_transform is no longer used in 1.0+. &quot;</span>
<span class="s2">&quot;Use Account/Object.at_pre_channel_msg instead.&quot;</span><span class="p">)</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="k">raise</span> <span class="ne">RuntimeError</span><span class="p">(</span><span class="s2">&quot;Channel.distribute_message is no longer used in 1.0+.&quot;</span><span class="p">)</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="k">raise</span> <span class="ne">RuntimeError</span><span class="p">(</span><span class="s2">&quot;Channel.format_senders is no longer used in 1.0+. &quot;</span>
<span class="s2">&quot;Use Account/Object.at_pre_channel_msg instead.&quot;</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="k">raise</span> <span class="ne">RuntimeError</span><span class="p">(</span><span class="s2">&quot;Channel.pose_transform is no longer used in 1.0+. &quot;</span>
<span class="s2">&quot;Use Account/Object.at_pre_channel_msg instead.&quot;</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="k">raise</span> <span class="ne">RuntimeError</span><span class="p">(</span><span class="s2">&quot;Channel.format_external is no longer used in 1.0+. &quot;</span>
<span class="s2">&quot;Use Account/Object.at_pre_channel_msg instead.&quot;</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="k">raise</span> <span class="ne">RuntimeError</span><span class="p">(</span><span class="s2">&quot;Channel.format_message is no longer used in 1.0+. &quot;</span>
<span class="s2">&quot;Use Account/Object.at_pre_channel_msg instead.&quot;</span><span class="p">)</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="k">raise</span> <span class="ne">RuntimeError</span><span class="p">(</span><span class="s2">&quot;Channel.pre_send_message was renamed to Channel.at_pre_msg.&quot;</span><span class="p">)</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="k">raise</span> <span class="ne">RuntimeError</span><span class="p">(</span><span class="s2">&quot;Channel.post_send_message was renamed to Channel.at_post_msg.&quot;</span><span class="p">)</span></div></div>
</pre></div>
<div class="clearer"></div>
</div>
</div>
</div>
<div class="sphinxsidebar" role="navigation" aria-label="main navigation">
<div class="sphinxsidebarwrapper">
<p class="logo"><a href="../../../index.html">
<img class="logo" src="../../../_static/evennia_logo.png" alt="Logo"/>
</a></p>
<div id="searchbox" style="display: none" role="search">
<h3 id="searchlabel">Quick search</h3>
<div class="searchformwrapper">
<form class="search" action="../../../search.html" method="get">
<input type="text" name="q" aria-labelledby="searchlabel" />
<input type="submit" value="Go" />
</form>
</div>
</div>
<script>$('#searchbox').show(0);</script><h3>Links</h3>
<ul>
<li><a href="https://www.evennia.com">Home page</a> </li>
<li><a href="https://github.com/evennia/evennia">Evennia Github</a> </li>
<li><a href="http://games.evennia.com">Game Index</a> </li>
<li><a href="http://webchat.freenode.net/?channels=evennia&uio=MT1mYWxzZSY5PXRydWUmMTE9MTk1JjEyPXRydWUbb">IRC</a> -
<a href="https://discord.gg/NecFePw">Discord</a> -
<a href="https://groups.google.com/forum/#%21forum/evennia">Forums</a>
</li>
<li><a href="http://evennia.blogspot.com/">Evennia Dev blog</a> </li>
</ul>
<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>