evennia/docs/0.9.5/_modules/evennia/comms/channelhandler.html
2020-11-14 11:55:52 +01:00

418 lines
No EOL
42 KiB
HTML

<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>evennia.comms.channelhandler &#8212; Evennia 0.9.5 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 0.9.5</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.channelhandler</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.channelhandler</h1><div class="highlight"><pre>
<span></span><span class="sd">&quot;&quot;&quot;</span>
<span class="sd">The channel handler, accessed from this module as CHANNEL_HANDLER is a</span>
<span class="sd">singleton that handles the stored set of channels and how they are</span>
<span class="sd">represented against the cmdhandler.</span>
<span class="sd">If there is a channel named &#39;newbie&#39;, we want to be able to just write</span>
<span class="sd"> newbie Hello!</span>
<span class="sd">For this to work, &#39;newbie&#39;, the name of the channel, must be</span>
<span class="sd">identified by the cmdhandler as a command name. The channelhandler</span>
<span class="sd">stores all channels as custom &#39;commands&#39; that the cmdhandler can</span>
<span class="sd">import and look through.</span>
<span class="sd">&gt; Warning - channel names take precedence over command names, so make</span>
<span class="sd">sure to not pick clashing channel names.</span>
<span class="sd">Unless deleting a channel you normally don&#39;t need to bother about the</span>
<span class="sd">channelhandler at all - the create_channel method handles the update.</span>
<span class="sd">To delete a channel cleanly, delete the channel object, then call</span>
<span class="sd">update() on the channelhandler. Or use Channel.objects.delete() which</span>
<span class="sd">does this for you.</span>
<span class="sd">&quot;&quot;&quot;</span>
<span class="kn">from</span> <span class="nn">django.conf</span> <span class="k">import</span> <span class="n">settings</span>
<span class="kn">from</span> <span class="nn">evennia.commands</span> <span class="k">import</span> <span class="n">cmdset</span><span class="p">,</span> <span class="n">command</span>
<span class="kn">from</span> <span class="nn">evennia.utils.logger</span> <span class="k">import</span> <span class="n">tail_log_file</span>
<span class="kn">from</span> <span class="nn">evennia.utils.utils</span> <span class="k">import</span> <span class="n">class_from_module</span>
<span class="kn">from</span> <span class="nn">django.utils.translation</span> <span class="k">import</span> <span class="n">gettext</span> <span class="k">as</span> <span class="n">_</span>
<span class="c1"># we must late-import these since any overloads are likely to</span>
<span class="c1"># themselves be using these classes leading to a circular import.</span>
<span class="n">_CHANNEL_HANDLER_CLASS</span> <span class="o">=</span> <span class="kc">None</span>
<span class="n">_CHANNEL_COMMAND_CLASS</span> <span class="o">=</span> <span class="kc">None</span>
<span class="n">_CHANNELDB</span> <span class="o">=</span> <span class="kc">None</span>
<div class="viewcode-block" id="ChannelCommand"><a class="viewcode-back" href="../../../api/evennia.comms.channelhandler.html#evennia.comms.channelhandler.ChannelCommand">[docs]</a><span class="k">class</span> <span class="nc">ChannelCommand</span><span class="p">(</span><span class="n">command</span><span class="o">.</span><span class="n">Command</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> {channelkey} channel</span>
<span class="sd"> {channeldesc}</span>
<span class="sd"> Usage:</span>
<span class="sd"> {lower_channelkey} &lt;message&gt;</span>
<span class="sd"> {lower_channelkey}/history [start]</span>
<span class="sd"> {lower_channelkey} off - mutes the channel</span>
<span class="sd"> {lower_channelkey} on - unmutes the channel</span>
<span class="sd"> Switch:</span>
<span class="sd"> history: View 20 previous messages, either from the end or</span>
<span class="sd"> from &lt;start&gt; number of messages from the end.</span>
<span class="sd"> Example:</span>
<span class="sd"> {lower_channelkey} Hello World!</span>
<span class="sd"> {lower_channelkey}/history</span>
<span class="sd"> {lower_channelkey}/history 30</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="c1"># ^note that channeldesc and lower_channelkey will be filled</span>
<span class="c1"># automatically by ChannelHandler</span>
<span class="c1"># this flag is what identifies this cmd as a channel cmd</span>
<span class="c1"># and branches off to the system send-to-channel command</span>
<span class="c1"># (which is customizable by admin)</span>
<span class="n">is_channel</span> <span class="o">=</span> <span class="kc">True</span>
<span class="n">key</span> <span class="o">=</span> <span class="s2">&quot;general&quot;</span>
<span class="n">help_category</span> <span class="o">=</span> <span class="s2">&quot;Channel Names&quot;</span>
<span class="n">obj</span> <span class="o">=</span> <span class="kc">None</span>
<span class="n">arg_regex</span> <span class="o">=</span> <span class="sa">r</span><span class="s2">&quot;\s.*?|/history.*?&quot;</span>
<div class="viewcode-block" id="ChannelCommand.parse"><a class="viewcode-back" href="../../../api/evennia.comms.channelhandler.html#evennia.comms.channelhandler.ChannelCommand.parse">[docs]</a> <span class="k">def</span> <span class="nf">parse</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> Simple parser</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="c1"># cmdhandler sends channame:msg here.</span>
<span class="n">channelname</span><span class="p">,</span> <span class="n">msg</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">args</span><span class="o">.</span><span class="n">split</span><span class="p">(</span><span class="s2">&quot;:&quot;</span><span class="p">,</span> <span class="mi">1</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">history_start</span> <span class="o">=</span> <span class="kc">None</span>
<span class="k">if</span> <span class="n">msg</span><span class="o">.</span><span class="n">startswith</span><span class="p">(</span><span class="s2">&quot;/history&quot;</span><span class="p">):</span>
<span class="n">arg</span> <span class="o">=</span> <span class="n">msg</span><span class="p">[</span><span class="mi">8</span><span class="p">:]</span>
<span class="k">try</span><span class="p">:</span>
<span class="bp">self</span><span class="o">.</span><span class="n">history_start</span> <span class="o">=</span> <span class="nb">int</span><span class="p">(</span><span class="n">arg</span><span class="p">)</span> <span class="k">if</span> <span class="n">arg</span> <span class="k">else</span> <span class="mi">0</span>
<span class="k">except</span> <span class="ne">ValueError</span><span class="p">:</span>
<span class="c1"># if no valid number was given, ignore it</span>
<span class="k">pass</span>
<span class="bp">self</span><span class="o">.</span><span class="n">args</span> <span class="o">=</span> <span class="p">(</span><span class="n">channelname</span><span class="o">.</span><span class="n">strip</span><span class="p">(),</span> <span class="n">msg</span><span class="o">.</span><span class="n">strip</span><span class="p">())</span></div>
<div class="viewcode-block" id="ChannelCommand.func"><a class="viewcode-back" href="../../../api/evennia.comms.channelhandler.html#evennia.comms.channelhandler.ChannelCommand.func">[docs]</a> <span class="k">def</span> <span class="nf">func</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> Create a new message and send it to channel, using</span>
<span class="sd"> the already formatted input.</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="k">global</span> <span class="n">_CHANNELDB</span>
<span class="k">if</span> <span class="ow">not</span> <span class="n">_CHANNELDB</span><span class="p">:</span>
<span class="kn">from</span> <span class="nn">evennia.comms.models</span> <span class="k">import</span> <span class="n">ChannelDB</span> <span class="k">as</span> <span class="n">_CHANNELDB</span>
<span class="n">channelkey</span><span class="p">,</span> <span class="n">msg</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">args</span>
<span class="n">caller</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">caller</span>
<span class="k">if</span> <span class="ow">not</span> <span class="n">msg</span><span class="p">:</span>
<span class="bp">self</span><span class="o">.</span><span class="n">msg</span><span class="p">(</span><span class="n">_</span><span class="p">(</span><span class="s2">&quot;Say what?&quot;</span><span class="p">))</span>
<span class="k">return</span>
<span class="n">channel</span> <span class="o">=</span> <span class="n">_CHANNELDB</span><span class="o">.</span><span class="n">objects</span><span class="o">.</span><span class="n">get_channel</span><span class="p">(</span><span class="n">channelkey</span><span class="p">)</span>
<span class="k">if</span> <span class="ow">not</span> <span class="n">channel</span><span class="p">:</span>
<span class="bp">self</span><span class="o">.</span><span class="n">msg</span><span class="p">(</span><span class="n">_</span><span class="p">(</span><span class="s2">&quot;Channel &#39;</span><span class="si">%s</span><span class="s2">&#39; not found.&quot;</span><span class="p">)</span> <span class="o">%</span> <span class="n">channelkey</span><span class="p">)</span>
<span class="k">return</span>
<span class="k">if</span> <span class="ow">not</span> <span class="n">channel</span><span class="o">.</span><span class="n">has_connection</span><span class="p">(</span><span class="n">caller</span><span class="p">):</span>
<span class="n">string</span> <span class="o">=</span> <span class="n">_</span><span class="p">(</span><span class="s2">&quot;You are not connected to channel &#39;</span><span class="si">%s</span><span class="s2">&#39;.&quot;</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">msg</span><span class="p">(</span><span class="n">string</span> <span class="o">%</span> <span class="n">channelkey</span><span class="p">)</span>
<span class="k">return</span>
<span class="k">if</span> <span class="ow">not</span> <span class="n">channel</span><span class="o">.</span><span class="n">access</span><span class="p">(</span><span class="n">caller</span><span class="p">,</span> <span class="s2">&quot;send&quot;</span><span class="p">):</span>
<span class="n">string</span> <span class="o">=</span> <span class="n">_</span><span class="p">(</span><span class="s2">&quot;You are not permitted to send to channel &#39;</span><span class="si">%s</span><span class="s2">&#39;.&quot;</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">msg</span><span class="p">(</span><span class="n">string</span> <span class="o">%</span> <span class="n">channelkey</span><span class="p">)</span>
<span class="k">return</span>
<span class="k">if</span> <span class="n">msg</span> <span class="o">==</span> <span class="s2">&quot;on&quot;</span><span class="p">:</span>
<span class="n">caller</span> <span class="o">=</span> <span class="n">caller</span> <span class="k">if</span> <span class="ow">not</span> <span class="nb">hasattr</span><span class="p">(</span><span class="n">caller</span><span class="p">,</span> <span class="s2">&quot;account&quot;</span><span class="p">)</span> <span class="k">else</span> <span class="n">caller</span><span class="o">.</span><span class="n">account</span>
<span class="n">unmuted</span> <span class="o">=</span> <span class="n">channel</span><span class="o">.</span><span class="n">unmute</span><span class="p">(</span><span class="n">caller</span><span class="p">)</span>
<span class="k">if</span> <span class="n">unmuted</span><span class="p">:</span>
<span class="bp">self</span><span class="o">.</span><span class="n">msg</span><span class="p">(</span><span class="n">_</span><span class="p">(</span><span class="s2">&quot;You start listening to </span><span class="si">%s</span><span class="s2">.&quot;</span><span class="p">)</span> <span class="o">%</span> <span class="n">channel</span><span class="p">)</span>
<span class="k">return</span>
<span class="bp">self</span><span class="o">.</span><span class="n">msg</span><span class="p">(</span><span class="n">_</span><span class="p">(</span><span class="s2">&quot;You were already listening to </span><span class="si">%s</span><span class="s2">.&quot;</span><span class="p">)</span> <span class="o">%</span> <span class="n">channel</span><span class="p">)</span>
<span class="k">return</span>
<span class="k">if</span> <span class="n">msg</span> <span class="o">==</span> <span class="s2">&quot;off&quot;</span><span class="p">:</span>
<span class="n">caller</span> <span class="o">=</span> <span class="n">caller</span> <span class="k">if</span> <span class="ow">not</span> <span class="nb">hasattr</span><span class="p">(</span><span class="n">caller</span><span class="p">,</span> <span class="s2">&quot;account&quot;</span><span class="p">)</span> <span class="k">else</span> <span class="n">caller</span><span class="o">.</span><span class="n">account</span>
<span class="n">muted</span> <span class="o">=</span> <span class="n">channel</span><span class="o">.</span><span class="n">mute</span><span class="p">(</span><span class="n">caller</span><span class="p">)</span>
<span class="k">if</span> <span class="n">muted</span><span class="p">:</span>
<span class="bp">self</span><span class="o">.</span><span class="n">msg</span><span class="p">(</span><span class="n">_</span><span class="p">(</span><span class="s2">&quot;You stop listening to </span><span class="si">%s</span><span class="s2">.&quot;</span><span class="p">)</span> <span class="o">%</span> <span class="n">channel</span><span class="p">)</span>
<span class="k">return</span>
<span class="bp">self</span><span class="o">.</span><span class="n">msg</span><span class="p">(</span><span class="n">_</span><span class="p">(</span><span class="s2">&quot;You were already not listening to </span><span class="si">%s</span><span class="s2">.&quot;</span><span class="p">)</span> <span class="o">%</span> <span class="n">channel</span><span class="p">)</span>
<span class="k">return</span>
<span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">history_start</span> <span class="ow">is</span> <span class="ow">not</span> <span class="kc">None</span><span class="p">:</span>
<span class="c1"># Try to view history</span>
<span class="n">log_file</span> <span class="o">=</span> <span class="n">channel</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="n">default</span><span class="o">=</span><span class="s2">&quot;channel_</span><span class="si">%s</span><span class="s2">.log&quot;</span> <span class="o">%</span> <span class="n">channel</span><span class="o">.</span><span class="n">key</span><span class="p">)</span>
<span class="k">def</span> <span class="nf">send_msg</span><span class="p">(</span><span class="n">lines</span><span class="p">):</span>
<span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">msg</span><span class="p">(</span>
<span class="s2">&quot;&quot;</span><span class="o">.</span><span class="n">join</span><span class="p">(</span><span class="n">line</span><span class="o">.</span><span class="n">split</span><span class="p">(</span><span class="s2">&quot;[-]&quot;</span><span class="p">,</span> <span class="mi">1</span><span class="p">)[</span><span class="mi">1</span><span class="p">]</span> <span class="k">if</span> <span class="s2">&quot;[-]&quot;</span> <span class="ow">in</span> <span class="n">line</span> <span class="k">else</span> <span class="n">line</span> <span class="k">for</span> <span class="n">line</span> <span class="ow">in</span> <span class="n">lines</span><span class="p">)</span>
<span class="p">)</span>
<span class="n">tail_log_file</span><span class="p">(</span><span class="n">log_file</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">history_start</span><span class="p">,</span> <span class="mi">20</span><span class="p">,</span> <span class="n">callback</span><span class="o">=</span><span class="n">send_msg</span><span class="p">)</span>
<span class="k">else</span><span class="p">:</span>
<span class="n">caller</span> <span class="o">=</span> <span class="n">caller</span> <span class="k">if</span> <span class="ow">not</span> <span class="nb">hasattr</span><span class="p">(</span><span class="n">caller</span><span class="p">,</span> <span class="s2">&quot;account&quot;</span><span class="p">)</span> <span class="k">else</span> <span class="n">caller</span><span class="o">.</span><span class="n">account</span>
<span class="k">if</span> <span class="n">caller</span> <span class="ow">in</span> <span class="n">channel</span><span class="o">.</span><span class="n">mutelist</span><span class="p">:</span>
<span class="bp">self</span><span class="o">.</span><span class="n">msg</span><span class="p">(</span><span class="n">_</span><span class="p">(</span><span class="s2">&quot;You currently have </span><span class="si">%s</span><span class="s2"> muted.&quot;</span><span class="p">)</span> <span class="o">%</span> <span class="n">channel</span><span class="p">)</span>
<span class="k">return</span>
<span class="n">channel</span><span class="o">.</span><span class="n">msg</span><span class="p">(</span><span class="n">msg</span><span class="p">,</span> <span class="n">senders</span><span class="o">=</span><span class="bp">self</span><span class="o">.</span><span class="n">caller</span><span class="p">,</span> <span class="n">online</span><span class="o">=</span><span class="kc">True</span><span class="p">)</span></div>
<div class="viewcode-block" id="ChannelCommand.get_extra_info"><a class="viewcode-back" href="../../../api/evennia.comms.channelhandler.html#evennia.comms.channelhandler.ChannelCommand.get_extra_info">[docs]</a> <span class="k">def</span> <span class="nf">get_extra_info</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">caller</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> Let users know that this command is for communicating on a channel.</span>
<span class="sd"> Args:</span>
<span class="sd"> caller (TypedObject): A Character or Account who has entered an ambiguous command.</span>
<span class="sd"> Returns:</span>
<span class="sd"> A string with identifying information to disambiguate the object, conventionally with a preceding space.</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="k">return</span> <span class="n">_</span><span class="p">(</span><span class="s2">&quot; (channel)&quot;</span><span class="p">)</span></div></div>
<div class="viewcode-block" id="ChannelHandler"><a class="viewcode-back" href="../../../api/evennia.comms.channelhandler.html#evennia.comms.channelhandler.ChannelHandler">[docs]</a><span class="k">class</span> <span class="nc">ChannelHandler</span><span class="p">(</span><span class="nb">object</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> The ChannelHandler manages all active in-game channels and</span>
<span class="sd"> dynamically creates channel commands for users so that they can</span>
<span class="sd"> just give the channel&#39;s key or alias to write to it. Whenever a</span>
<span class="sd"> new channel is created in the database, the update() method on</span>
<span class="sd"> this handler must be called to sync it with the database (this is</span>
<span class="sd"> done automatically if creating the channel with</span>
<span class="sd"> evennia.create_channel())</span>
<span class="sd"> &quot;&quot;&quot;</span>
<div class="viewcode-block" id="ChannelHandler.__init__"><a class="viewcode-back" href="../../../api/evennia.comms.channelhandler.html#evennia.comms.channelhandler.ChannelHandler.__init__">[docs]</a> <span class="k">def</span> <span class="nf">__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"> Initializes the channel handler&#39;s internal state.</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="bp">self</span><span class="o">.</span><span class="n">_cached_channel_cmds</span> <span class="o">=</span> <span class="p">{}</span>
<span class="bp">self</span><span class="o">.</span><span class="n">_cached_cmdsets</span> <span class="o">=</span> <span class="p">{}</span>
<span class="bp">self</span><span class="o">.</span><span class="n">_cached_channels</span> <span class="o">=</span> <span class="p">{}</span></div>
<span class="k">def</span> <span class="nf">__str__</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 string representation of the handler</span>
<span class="sd"> &quot;&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="nb">str</span><span class="p">(</span><span class="n">cmd</span><span class="p">)</span> <span class="k">for</span> <span class="n">cmd</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">_cached_channel_cmds</span><span class="p">)</span>
<div class="viewcode-block" id="ChannelHandler.clear"><a class="viewcode-back" href="../../../api/evennia.comms.channelhandler.html#evennia.comms.channelhandler.ChannelHandler.clear">[docs]</a> <span class="k">def</span> <span class="nf">clear</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> Reset the cache storage.</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="bp">self</span><span class="o">.</span><span class="n">_cached_channel_cmds</span> <span class="o">=</span> <span class="p">{}</span>
<span class="bp">self</span><span class="o">.</span><span class="n">_cached_cmdsets</span> <span class="o">=</span> <span class="p">{}</span>
<span class="bp">self</span><span class="o">.</span><span class="n">_cached_channels</span> <span class="o">=</span> <span class="p">{}</span></div>
<div class="viewcode-block" id="ChannelHandler.add"><a class="viewcode-back" href="../../../api/evennia.comms.channelhandler.html#evennia.comms.channelhandler.ChannelHandler.add">[docs]</a> <span class="k">def</span> <span class="nf">add</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">channel</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> Add an individual channel to the handler. This is called</span>
<span class="sd"> whenever a new channel is created.</span>
<span class="sd"> Args:</span>
<span class="sd"> channel (Channel): The channel to add.</span>
<span class="sd"> Notes:</span>
<span class="sd"> To remove a channel, simply delete the channel object and</span>
<span class="sd"> run self.update on the handler. This should usually be</span>
<span class="sd"> handled automatically by one of the deletion methos of</span>
<span class="sd"> the Channel itself.</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="k">global</span> <span class="n">_CHANNEL_COMMAND_CLASS</span>
<span class="k">if</span> <span class="ow">not</span> <span class="n">_CHANNEL_COMMAND_CLASS</span><span class="p">:</span>
<span class="n">_CHANNEL_COMMAND_CLASS</span> <span class="o">=</span> <span class="n">class_from_module</span><span class="p">(</span><span class="n">settings</span><span class="o">.</span><span class="n">CHANNEL_COMMAND_CLASS</span><span class="p">)</span>
<span class="c1"># map the channel to a searchable command</span>
<span class="n">cmd</span> <span class="o">=</span> <span class="n">_CHANNEL_COMMAND_CLASS</span><span class="p">(</span>
<span class="n">key</span><span class="o">=</span><span class="n">channel</span><span class="o">.</span><span class="n">key</span><span class="o">.</span><span class="n">strip</span><span class="p">()</span><span class="o">.</span><span class="n">lower</span><span class="p">(),</span>
<span class="n">aliases</span><span class="o">=</span><span class="n">channel</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">locks</span><span class="o">=</span><span class="s2">&quot;cmd:all();</span><span class="si">%s</span><span class="s2">&quot;</span> <span class="o">%</span> <span class="n">channel</span><span class="o">.</span><span class="n">locks</span><span class="p">,</span>
<span class="n">help_category</span><span class="o">=</span><span class="s2">&quot;Channel names&quot;</span><span class="p">,</span>
<span class="n">obj</span><span class="o">=</span><span class="n">channel</span><span class="p">,</span>
<span class="n">is_channel</span><span class="o">=</span><span class="kc">True</span><span class="p">,</span>
<span class="p">)</span>
<span class="c1"># format the help entry</span>
<span class="n">key</span> <span class="o">=</span> <span class="n">channel</span><span class="o">.</span><span class="n">key</span>
<span class="n">cmd</span><span class="o">.</span><span class="vm">__doc__</span> <span class="o">=</span> <span class="n">cmd</span><span class="o">.</span><span class="vm">__doc__</span><span class="o">.</span><span class="n">format</span><span class="p">(</span>
<span class="n">channelkey</span><span class="o">=</span><span class="n">key</span><span class="p">,</span>
<span class="n">lower_channelkey</span><span class="o">=</span><span class="n">key</span><span class="o">.</span><span class="n">strip</span><span class="p">()</span><span class="o">.</span><span class="n">lower</span><span class="p">(),</span>
<span class="n">channeldesc</span><span class="o">=</span><span class="n">channel</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;desc&quot;</span><span class="p">,</span> <span class="n">default</span><span class="o">=</span><span class="s2">&quot;&quot;</span><span class="p">)</span><span class="o">.</span><span class="n">strip</span><span class="p">(),</span>
<span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">_cached_channel_cmds</span><span class="p">[</span><span class="n">channel</span><span class="p">]</span> <span class="o">=</span> <span class="n">cmd</span>
<span class="bp">self</span><span class="o">.</span><span class="n">_cached_channels</span><span class="p">[</span><span class="n">key</span><span class="p">]</span> <span class="o">=</span> <span class="n">channel</span>
<span class="bp">self</span><span class="o">.</span><span class="n">_cached_cmdsets</span> <span class="o">=</span> <span class="p">{}</span></div>
<span class="n">add_channel</span> <span class="o">=</span> <span class="n">add</span> <span class="c1"># legacy alias</span>
<div class="viewcode-block" id="ChannelHandler.remove"><a class="viewcode-back" href="../../../api/evennia.comms.channelhandler.html#evennia.comms.channelhandler.ChannelHandler.remove">[docs]</a> <span class="k">def</span> <span class="nf">remove</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">channel</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> Remove channel from channelhandler. This will also delete it.</span>
<span class="sd"> Args:</span>
<span class="sd"> channel (Channel): Channel to remove/delete.</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="k">if</span> <span class="n">channel</span><span class="o">.</span><span class="n">pk</span><span class="p">:</span>
<span class="n">channel</span><span class="o">.</span><span class="n">delete</span><span class="p">()</span>
<span class="bp">self</span><span class="o">.</span><span class="n">update</span><span class="p">()</span></div>
<div class="viewcode-block" id="ChannelHandler.update"><a class="viewcode-back" href="../../../api/evennia.comms.channelhandler.html#evennia.comms.channelhandler.ChannelHandler.update">[docs]</a> <span class="k">def</span> <span class="nf">update</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> Updates the handler completely, including removing old removed</span>
<span class="sd"> Channel objects. This must be called after deleting a Channel.</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="k">global</span> <span class="n">_CHANNELDB</span>
<span class="k">if</span> <span class="ow">not</span> <span class="n">_CHANNELDB</span><span class="p">:</span>
<span class="kn">from</span> <span class="nn">evennia.comms.models</span> <span class="k">import</span> <span class="n">ChannelDB</span> <span class="k">as</span> <span class="n">_CHANNELDB</span>
<span class="bp">self</span><span class="o">.</span><span class="n">_cached_channel_cmds</span> <span class="o">=</span> <span class="p">{}</span>
<span class="bp">self</span><span class="o">.</span><span class="n">_cached_cmdsets</span> <span class="o">=</span> <span class="p">{}</span>
<span class="bp">self</span><span class="o">.</span><span class="n">_cached_channels</span> <span class="o">=</span> <span class="p">{}</span>
<span class="k">for</span> <span class="n">channel</span> <span class="ow">in</span> <span class="n">_CHANNELDB</span><span class="o">.</span><span class="n">objects</span><span class="o">.</span><span class="n">get_all_channels</span><span class="p">():</span>
<span class="bp">self</span><span class="o">.</span><span class="n">add</span><span class="p">(</span><span class="n">channel</span><span class="p">)</span></div>
<div class="viewcode-block" id="ChannelHandler.get"><a class="viewcode-back" href="../../../api/evennia.comms.channelhandler.html#evennia.comms.channelhandler.ChannelHandler.get">[docs]</a> <span class="k">def</span> <span class="nf">get</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">channelname</span><span class="o">=</span><span class="kc">None</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> Get a channel from the handler, or all channels</span>
<span class="sd"> Args:</span>
<span class="sd"> channelame (str, optional): Channel key, case insensitive.</span>
<span class="sd"> Returns</span>
<span class="sd"> channels (list): The matching channels in a list, or all</span>
<span class="sd"> channels in the handler.</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="k">if</span> <span class="n">channelname</span><span class="p">:</span>
<span class="n">channel</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_cached_channels</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="n">channelname</span><span class="o">.</span><span class="n">lower</span><span class="p">(),</span> <span class="kc">None</span><span class="p">)</span>
<span class="k">return</span> <span class="p">[</span><span class="n">channel</span><span class="p">]</span> <span class="k">if</span> <span class="n">channel</span> <span class="k">else</span> <span class="p">[]</span>
<span class="k">return</span> <span class="nb">list</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">_cached_channels</span><span class="o">.</span><span class="n">values</span><span class="p">())</span></div>
<div class="viewcode-block" id="ChannelHandler.get_cmdset"><a class="viewcode-back" href="../../../api/evennia.comms.channelhandler.html#evennia.comms.channelhandler.ChannelHandler.get_cmdset">[docs]</a> <span class="k">def</span> <span class="nf">get_cmdset</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">source_object</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> Retrieve cmdset for channels this source_object has</span>
<span class="sd"> access to send to.</span>
<span class="sd"> Args:</span>
<span class="sd"> source_object (Object): An object subscribing to one</span>
<span class="sd"> or more channels.</span>
<span class="sd"> Returns:</span>
<span class="sd"> cmdsets (list): The Channel-Cmdsets `source_object` has</span>
<span class="sd"> access to.</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="k">if</span> <span class="n">source_object</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">_cached_cmdsets</span><span class="p">:</span>
<span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">_cached_cmdsets</span><span class="p">[</span><span class="n">source_object</span><span class="p">]</span>
<span class="k">else</span><span class="p">:</span>
<span class="c1"># create a new cmdset holding all viable channels</span>
<span class="n">chan_cmdset</span> <span class="o">=</span> <span class="kc">None</span>
<span class="n">chan_cmds</span> <span class="o">=</span> <span class="p">[</span>
<span class="n">channelcmd</span>
<span class="k">for</span> <span class="n">channel</span><span class="p">,</span> <span class="n">channelcmd</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">_cached_channel_cmds</span><span class="o">.</span><span class="n">items</span><span class="p">()</span>
<span class="k">if</span> <span class="n">channel</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">source_object</span><span class="p">)</span>
<span class="ow">and</span> <span class="n">channelcmd</span><span class="o">.</span><span class="n">access</span><span class="p">(</span><span class="n">source_object</span><span class="p">,</span> <span class="s2">&quot;send&quot;</span><span class="p">)</span>
<span class="p">]</span>
<span class="k">if</span> <span class="n">chan_cmds</span><span class="p">:</span>
<span class="n">chan_cmdset</span> <span class="o">=</span> <span class="n">cmdset</span><span class="o">.</span><span class="n">CmdSet</span><span class="p">()</span>
<span class="n">chan_cmdset</span><span class="o">.</span><span class="n">key</span> <span class="o">=</span> <span class="s2">&quot;ChannelCmdSet&quot;</span>
<span class="n">chan_cmdset</span><span class="o">.</span><span class="n">priority</span> <span class="o">=</span> <span class="mi">101</span>
<span class="n">chan_cmdset</span><span class="o">.</span><span class="n">duplicates</span> <span class="o">=</span> <span class="kc">True</span>
<span class="k">for</span> <span class="n">cmd</span> <span class="ow">in</span> <span class="n">chan_cmds</span><span class="p">:</span>
<span class="n">chan_cmdset</span><span class="o">.</span><span class="n">add</span><span class="p">(</span><span class="n">cmd</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">_cached_cmdsets</span><span class="p">[</span><span class="n">source_object</span><span class="p">]</span> <span class="o">=</span> <span class="n">chan_cmdset</span>
<span class="k">return</span> <span class="n">chan_cmdset</span></div></div>
<span class="c1"># set up the singleton</span>
<span class="n">CHANNEL_HANDLER</span> <span class="o">=</span> <span class="n">class_from_module</span><span class="p">(</span><span class="n">settings</span><span class="o">.</span><span class="n">CHANNEL_HANDLER_CLASS</span><span class="p">)()</span>
<span class="n">CHANNELHANDLER</span> <span class="o">=</span> <span class="n">CHANNEL_HANDLER</span> <span class="c1"># legacy</span>
</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="../../../../1.0-dev/index.html">1.0-dev (develop branch)</a></li>
<li><a href="channelhandler.html">0.9.5 (master branch)</a></li>
</ul>
</div>
</div>
<div class="clearer"></div>
</div>
<div class="related" role="navigation" aria-label="related navigation">
<h3>Navigation</h3>
<ul>
<li class="right" style="margin-right: 10px">
<a href="../../../genindex.html" title="General Index"
>index</a></li>
<li class="right" >
<a href="../../../py-modindex.html" title="Python Module Index"
>modules</a> |</li>
<li class="nav-item nav-item-0"><a href="../../../index.html">Evennia 0.9.5</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.channelhandler</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>