mirror of
https://github.com/evennia/evennia.git
synced 2026-03-29 20:17:16 +02:00
418 lines
No EOL
42 KiB
HTML
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 — 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> »</li>
|
|
<li class="nav-item nav-item-1"><a href="../../index.html" >Module code</a> »</li>
|
|
<li class="nav-item nav-item-2"><a href="../../evennia.html" accesskey="U">evennia</a> »</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">"""</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 'newbie', we want to be able to just write</span>
|
|
|
|
<span class="sd"> newbie Hello!</span>
|
|
|
|
<span class="sd">For this to work, 'newbie', 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 'commands' that the cmdhandler can</span>
|
|
<span class="sd">import and look through.</span>
|
|
|
|
<span class="sd">> 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'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">"""</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">"""</span>
|
|
<span class="sd"> {channelkey} channel</span>
|
|
|
|
<span class="sd"> {channeldesc}</span>
|
|
|
|
<span class="sd"> Usage:</span>
|
|
<span class="sd"> {lower_channelkey} <message></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 <start> 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"> """</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">"general"</span>
|
|
<span class="n">help_category</span> <span class="o">=</span> <span class="s2">"Channel Names"</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">"\s.*?|/history.*?"</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">"""</span>
|
|
<span class="sd"> Simple parser</span>
|
|
<span class="sd"> """</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">":"</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">"/history"</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">"""</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"> """</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">"Say what?"</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">"Channel '</span><span class="si">%s</span><span class="s2">' not found."</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">"You are not connected to channel '</span><span class="si">%s</span><span class="s2">'."</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">"send"</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">"You are not permitted to send to channel '</span><span class="si">%s</span><span class="s2">'."</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">"on"</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">"account"</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">"You start listening to </span><span class="si">%s</span><span class="s2">."</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">"You were already listening to </span><span class="si">%s</span><span class="s2">."</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">"off"</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">"account"</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">"You stop listening to </span><span class="si">%s</span><span class="s2">."</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">"You were already not listening to </span><span class="si">%s</span><span class="s2">."</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">"log_file"</span><span class="p">,</span> <span class="n">default</span><span class="o">=</span><span class="s2">"channel_</span><span class="si">%s</span><span class="s2">.log"</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">""</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">"[-]"</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">"[-]"</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">"account"</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">"You currently have </span><span class="si">%s</span><span class="s2"> muted."</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">"""</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"> """</span>
|
|
<span class="k">return</span> <span class="n">_</span><span class="p">(</span><span class="s2">" (channel)"</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">"""</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'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"> """</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">"""</span>
|
|
<span class="sd"> Initializes the channel handler's internal state.</span>
|
|
|
|
<span class="sd"> """</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">"""</span>
|
|
<span class="sd"> Returns the string representation of the handler</span>
|
|
|
|
<span class="sd"> """</span>
|
|
<span class="k">return</span> <span class="s2">", "</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">"""</span>
|
|
<span class="sd"> Reset the cache storage.</span>
|
|
|
|
<span class="sd"> """</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">"""</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"> """</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">"cmd:all();</span><span class="si">%s</span><span class="s2">"</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">"Channel names"</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">"desc"</span><span class="p">,</span> <span class="n">default</span><span class="o">=</span><span class="s2">""</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">"""</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"> """</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">"""</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"> """</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">"""</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"> """</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">"""</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"> """</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">"send"</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">"ChannelCmdSet"</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> »</li>
|
|
<li class="nav-item nav-item-1"><a href="../../index.html" >Module code</a> »</li>
|
|
<li class="nav-item nav-item-2"><a href="../../evennia.html" >evennia</a> »</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">
|
|
© Copyright 2020, The Evennia developer community.
|
|
Created using <a href="https://www.sphinx-doc.org/">Sphinx</a> 3.2.1.
|
|
</div>
|
|
</body>
|
|
</html> |