evennia/docs/0.9.5/_modules/evennia/server/inputfuncs.html
2020-10-13 00:23:58 +02:00

707 lines
No EOL
77 KiB
HTML

<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta charset="utf-8" />
<title>evennia.server.inputfuncs &#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 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>
</ul>
</div>
<div class="document">
<div class="documentwrapper">
<div class="bodywrapper">
<div class="body" role="main">
<h1>Source code for evennia.server.inputfuncs</h1><div class="highlight"><pre>
<span></span><span class="sd">&quot;&quot;&quot;</span>
<span class="sd">Functions for processing input commands.</span>
<span class="sd">All global functions in this module whose name does not start with &quot;_&quot;</span>
<span class="sd">is considered an inputfunc. Each function must have the following</span>
<span class="sd">callsign (where inputfunc name is always lower-case, no matter what the</span>
<span class="sd">OOB input name looked like):</span>
<span class="sd"> inputfunc(session, *args, **kwargs)</span>
<span class="sd">Where &quot;options&quot; is always one of the kwargs, containing eventual</span>
<span class="sd">protocol-options.</span>
<span class="sd">There is one special function, the &quot;default&quot; function, which is called</span>
<span class="sd">on a no-match. It has this callsign:</span>
<span class="sd"> default(session, cmdname, *args, **kwargs)</span>
<span class="sd">Evennia knows which modules to use for inputfuncs by</span>
<span class="sd">settings.INPUT_FUNC_MODULES.</span>
<span class="sd">&quot;&quot;&quot;</span>
<span class="kn">import</span> <span class="nn">importlib</span>
<span class="kn">from</span> <span class="nn">codecs</span> <span class="k">import</span> <span class="n">lookup</span> <span class="k">as</span> <span class="n">codecs_lookup</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.cmdhandler</span> <span class="k">import</span> <span class="n">cmdhandler</span>
<span class="kn">from</span> <span class="nn">evennia.accounts.models</span> <span class="k">import</span> <span class="n">AccountDB</span>
<span class="kn">from</span> <span class="nn">evennia.utils.logger</span> <span class="k">import</span> <span class="n">log_err</span>
<span class="kn">from</span> <span class="nn">evennia.utils.utils</span> <span class="k">import</span> <span class="n">to_str</span>
<span class="n">BrowserSessionStore</span> <span class="o">=</span> <span class="n">importlib</span><span class="o">.</span><span class="n">import_module</span><span class="p">(</span><span class="n">settings</span><span class="o">.</span><span class="n">SESSION_ENGINE</span><span class="p">)</span><span class="o">.</span><span class="n">SessionStore</span>
<span class="c1"># always let &quot;idle&quot; work since we use this in the webclient</span>
<span class="n">_IDLE_COMMAND</span> <span class="o">=</span> <span class="n">settings</span><span class="o">.</span><span class="n">IDLE_COMMAND</span>
<span class="n">_IDLE_COMMAND</span> <span class="o">=</span> <span class="p">(</span><span class="n">_IDLE_COMMAND</span><span class="p">,)</span> <span class="k">if</span> <span class="n">_IDLE_COMMAND</span> <span class="o">==</span> <span class="s2">&quot;idle&quot;</span> <span class="k">else</span> <span class="p">(</span><span class="n">_IDLE_COMMAND</span><span class="p">,</span> <span class="s2">&quot;idle&quot;</span><span class="p">)</span>
<span class="n">_GA</span> <span class="o">=</span> <span class="nb">object</span><span class="o">.</span><span class="fm">__getattribute__</span>
<span class="n">_SA</span> <span class="o">=</span> <span class="nb">object</span><span class="o">.</span><span class="fm">__setattr__</span>
<span class="k">def</span> <span class="nf">_NA</span><span class="p">(</span><span class="n">o</span><span class="p">):</span>
<span class="k">return</span> <span class="s2">&quot;N/A&quot;</span>
<span class="n">_ERROR_INPUT</span> <span class="o">=</span> <span class="s2">&quot;Inputfunc </span><span class="si">{name}</span><span class="s2">(</span><span class="si">{session}</span><span class="s2">): Wrong/unrecognized input: </span><span class="si">{inp}</span><span class="s2">&quot;</span>
<span class="c1"># All global functions are inputfuncs available to process inputs</span>
<div class="viewcode-block" id="text"><a class="viewcode-back" href="../../../api/evennia.server.inputfuncs.html#evennia.server.inputfuncs.text">[docs]</a><span class="k">def</span> <span class="nf">text</span><span class="p">(</span><span class="n">session</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"> Main text input from the client. This will execute a command</span>
<span class="sd"> string on the server.</span>
<span class="sd"> Args:</span>
<span class="sd"> session (Session): The active Session to receive the input.</span>
<span class="sd"> text (str): First arg is used as text-command input. Other</span>
<span class="sd"> arguments are ignored.</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="c1"># from evennia.server.profiling.timetrace import timetrace</span>
<span class="c1"># text = timetrace(text, &quot;ServerSession.data_in&quot;)</span>
<span class="n">txt</span> <span class="o">=</span> <span class="n">args</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span> <span class="k">if</span> <span class="n">args</span> <span class="k">else</span> <span class="kc">None</span>
<span class="c1"># explicitly check for None since text can be an empty string, which is</span>
<span class="c1"># also valid</span>
<span class="k">if</span> <span class="n">txt</span> <span class="ow">is</span> <span class="kc">None</span><span class="p">:</span>
<span class="k">return</span>
<span class="c1"># this is treated as a command input</span>
<span class="c1"># handle the &#39;idle&#39; command</span>
<span class="k">if</span> <span class="n">txt</span><span class="o">.</span><span class="n">strip</span><span class="p">()</span> <span class="ow">in</span> <span class="n">_IDLE_COMMAND</span><span class="p">:</span>
<span class="n">session</span><span class="o">.</span><span class="n">update_session_counters</span><span class="p">(</span><span class="n">idle</span><span class="o">=</span><span class="kc">True</span><span class="p">)</span>
<span class="k">return</span>
<span class="k">if</span> <span class="n">session</span><span class="o">.</span><span class="n">account</span><span class="p">:</span>
<span class="c1"># nick replacement</span>
<span class="n">puppet</span> <span class="o">=</span> <span class="n">session</span><span class="o">.</span><span class="n">puppet</span>
<span class="k">if</span> <span class="n">puppet</span><span class="p">:</span>
<span class="n">txt</span> <span class="o">=</span> <span class="n">puppet</span><span class="o">.</span><span class="n">nicks</span><span class="o">.</span><span class="n">nickreplace</span><span class="p">(</span>
<span class="n">txt</span><span class="p">,</span> <span class="n">categories</span><span class="o">=</span><span class="p">(</span><span class="s2">&quot;inputline&quot;</span><span class="p">,</span> <span class="s2">&quot;channel&quot;</span><span class="p">),</span> <span class="n">include_account</span><span class="o">=</span><span class="kc">True</span>
<span class="p">)</span>
<span class="k">else</span><span class="p">:</span>
<span class="n">txt</span> <span class="o">=</span> <span class="n">session</span><span class="o">.</span><span class="n">account</span><span class="o">.</span><span class="n">nicks</span><span class="o">.</span><span class="n">nickreplace</span><span class="p">(</span>
<span class="n">txt</span><span class="p">,</span> <span class="n">categories</span><span class="o">=</span><span class="p">(</span><span class="s2">&quot;inputline&quot;</span><span class="p">,</span> <span class="s2">&quot;channel&quot;</span><span class="p">),</span> <span class="n">include_account</span><span class="o">=</span><span class="kc">False</span>
<span class="p">)</span>
<span class="n">kwargs</span><span class="o">.</span><span class="n">pop</span><span class="p">(</span><span class="s2">&quot;options&quot;</span><span class="p">,</span> <span class="kc">None</span><span class="p">)</span>
<span class="n">cmdhandler</span><span class="p">(</span><span class="n">session</span><span class="p">,</span> <span class="n">txt</span><span class="p">,</span> <span class="n">callertype</span><span class="o">=</span><span class="s2">&quot;session&quot;</span><span class="p">,</span> <span class="n">session</span><span class="o">=</span><span class="n">session</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">)</span>
<span class="n">session</span><span class="o">.</span><span class="n">update_session_counters</span><span class="p">()</span></div>
<div class="viewcode-block" id="bot_data_in"><a class="viewcode-back" href="../../../api/evennia.server.inputfuncs.html#evennia.server.inputfuncs.bot_data_in">[docs]</a><span class="k">def</span> <span class="nf">bot_data_in</span><span class="p">(</span><span class="n">session</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"> Text input from the IRC and RSS bots.</span>
<span class="sd"> This will trigger the execute_cmd method on the bots in-game counterpart.</span>
<span class="sd"> Args:</span>
<span class="sd"> session (Session): The active Session to receive the input.</span>
<span class="sd"> text (str): First arg is text input. Other arguments are ignored.</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="n">txt</span> <span class="o">=</span> <span class="n">args</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span> <span class="k">if</span> <span class="n">args</span> <span class="k">else</span> <span class="kc">None</span>
<span class="c1"># Explicitly check for None since text can be an empty string, which is</span>
<span class="c1"># also valid</span>
<span class="k">if</span> <span class="n">txt</span> <span class="ow">is</span> <span class="kc">None</span><span class="p">:</span>
<span class="k">return</span>
<span class="c1"># this is treated as a command input</span>
<span class="c1"># handle the &#39;idle&#39; command</span>
<span class="k">if</span> <span class="n">txt</span><span class="o">.</span><span class="n">strip</span><span class="p">()</span> <span class="ow">in</span> <span class="n">_IDLE_COMMAND</span><span class="p">:</span>
<span class="n">session</span><span class="o">.</span><span class="n">update_session_counters</span><span class="p">(</span><span class="n">idle</span><span class="o">=</span><span class="kc">True</span><span class="p">)</span>
<span class="k">return</span>
<span class="n">kwargs</span><span class="o">.</span><span class="n">pop</span><span class="p">(</span><span class="s2">&quot;options&quot;</span><span class="p">,</span> <span class="kc">None</span><span class="p">)</span>
<span class="c1"># Trigger the execute_cmd method of the corresponding bot.</span>
<span class="n">session</span><span class="o">.</span><span class="n">account</span><span class="o">.</span><span class="n">execute_cmd</span><span class="p">(</span><span class="n">session</span><span class="o">=</span><span class="n">session</span><span class="p">,</span> <span class="n">txt</span><span class="o">=</span><span class="n">txt</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">)</span>
<span class="n">session</span><span class="o">.</span><span class="n">update_session_counters</span><span class="p">()</span></div>
<div class="viewcode-block" id="echo"><a class="viewcode-back" href="../../../api/evennia.server.inputfuncs.html#evennia.server.inputfuncs.echo">[docs]</a><span class="k">def</span> <span class="nf">echo</span><span class="p">(</span><span class="n">session</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"> Echo test function</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="n">session</span><span class="o">.</span><span class="n">data_out</span><span class="p">(</span><span class="n">text</span><span class="o">=</span><span class="s2">&quot;Echo returns: </span><span class="si">%s</span><span class="s2">&quot;</span> <span class="o">%</span> <span class="n">args</span><span class="p">)</span></div>
<div class="viewcode-block" id="default"><a class="viewcode-back" href="../../../api/evennia.server.inputfuncs.html#evennia.server.inputfuncs.default">[docs]</a><span class="k">def</span> <span class="nf">default</span><span class="p">(</span><span class="n">session</span><span class="p">,</span> <span class="n">cmdname</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"> Default catch-function. This is like all other input functions except</span>
<span class="sd"> it will get `cmdname` as the first argument.</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="n">err</span> <span class="o">=</span> <span class="p">(</span>
<span class="s2">&quot;Session </span><span class="si">{sessid}</span><span class="s2">: Input command not recognized:</span><span class="se">\n</span><span class="s2">&quot;</span>
<span class="s2">&quot; name: &#39;</span><span class="si">{cmdname}</span><span class="s2">&#39;</span><span class="se">\n</span><span class="s2">&quot;</span>
<span class="s2">&quot; args, kwargs: </span><span class="si">{args}</span><span class="s2">, </span><span class="si">{kwargs}</span><span class="s2">&quot;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span>
<span class="n">sessid</span><span class="o">=</span><span class="n">session</span><span class="o">.</span><span class="n">sessid</span><span class="p">,</span> <span class="n">cmdname</span><span class="o">=</span><span class="n">cmdname</span><span class="p">,</span> <span class="n">args</span><span class="o">=</span><span class="n">args</span><span class="p">,</span> <span class="n">kwargs</span><span class="o">=</span><span class="n">kwargs</span>
<span class="p">)</span>
<span class="p">)</span>
<span class="k">if</span> <span class="n">session</span><span class="o">.</span><span class="n">protocol_flags</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s2">&quot;INPUTDEBUG&quot;</span><span class="p">,</span> <span class="kc">False</span><span class="p">):</span>
<span class="n">session</span><span class="o">.</span><span class="n">msg</span><span class="p">(</span><span class="n">err</span><span class="p">)</span>
<span class="n">log_err</span><span class="p">(</span><span class="n">err</span><span class="p">)</span></div>
<span class="n">_CLIENT_OPTIONS</span> <span class="o">=</span> <span class="p">(</span>
<span class="s2">&quot;ANSI&quot;</span><span class="p">,</span>
<span class="s2">&quot;XTERM256&quot;</span><span class="p">,</span>
<span class="s2">&quot;MXP&quot;</span><span class="p">,</span>
<span class="s2">&quot;UTF-8&quot;</span><span class="p">,</span>
<span class="s2">&quot;SCREENREADER&quot;</span><span class="p">,</span>
<span class="s2">&quot;ENCODING&quot;</span><span class="p">,</span>
<span class="s2">&quot;MCCP&quot;</span><span class="p">,</span>
<span class="s2">&quot;SCREENHEIGHT&quot;</span><span class="p">,</span>
<span class="s2">&quot;SCREENWIDTH&quot;</span><span class="p">,</span>
<span class="s2">&quot;INPUTDEBUG&quot;</span><span class="p">,</span>
<span class="s2">&quot;RAW&quot;</span><span class="p">,</span>
<span class="s2">&quot;NOCOLOR&quot;</span><span class="p">,</span>
<span class="s2">&quot;NOGOAHEAD&quot;</span><span class="p">,</span>
<span class="p">)</span>
<div class="viewcode-block" id="client_options"><a class="viewcode-back" href="../../../api/evennia.server.inputfuncs.html#evennia.server.inputfuncs.client_options">[docs]</a><span class="k">def</span> <span class="nf">client_options</span><span class="p">(</span><span class="n">session</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"> This allows the client an OOB way to inform us about its name and capabilities.</span>
<span class="sd"> This will be integrated into the session settings</span>
<span class="sd"> Keyword Args:</span>
<span class="sd"> get (bool): If this is true, return the settings as a dict</span>
<span class="sd"> (ignore all other kwargs).</span>
<span class="sd"> client (str): A client identifier, like &quot;mushclient&quot;.</span>
<span class="sd"> version (str): A client version</span>
<span class="sd"> ansi (bool): Supports ansi colors</span>
<span class="sd"> xterm256 (bool): Supports xterm256 colors or not</span>
<span class="sd"> mxp (bool): Supports MXP or not</span>
<span class="sd"> utf-8 (bool): Supports UTF-8 or not</span>
<span class="sd"> screenreader (bool): Screen-reader mode on/off</span>
<span class="sd"> mccp (bool): MCCP compression on/off</span>
<span class="sd"> screenheight (int): Screen height in lines</span>
<span class="sd"> screenwidth (int): Screen width in characters</span>
<span class="sd"> inputdebug (bool): Debug input functions</span>
<span class="sd"> nocolor (bool): Strip color</span>
<span class="sd"> raw (bool): Turn off parsing</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="n">old_flags</span> <span class="o">=</span> <span class="n">session</span><span class="o">.</span><span class="n">protocol_flags</span>
<span class="k">if</span> <span class="ow">not</span> <span class="n">kwargs</span> <span class="ow">or</span> <span class="n">kwargs</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s2">&quot;get&quot;</span><span class="p">,</span> <span class="kc">False</span><span class="p">):</span>
<span class="c1"># return current settings</span>
<span class="n">options</span> <span class="o">=</span> <span class="nb">dict</span><span class="p">((</span><span class="n">key</span><span class="p">,</span> <span class="n">old_flags</span><span class="p">[</span><span class="n">key</span><span class="p">])</span> <span class="k">for</span> <span class="n">key</span> <span class="ow">in</span> <span class="n">old_flags</span> <span class="k">if</span> <span class="n">key</span><span class="o">.</span><span class="n">upper</span><span class="p">()</span> <span class="ow">in</span> <span class="n">_CLIENT_OPTIONS</span><span class="p">)</span>
<span class="n">session</span><span class="o">.</span><span class="n">msg</span><span class="p">(</span><span class="n">client_options</span><span class="o">=</span><span class="n">options</span><span class="p">)</span>
<span class="k">return</span>
<span class="k">def</span> <span class="nf">validate_encoding</span><span class="p">(</span><span class="n">val</span><span class="p">):</span>
<span class="c1"># helper: change encoding</span>
<span class="k">try</span><span class="p">:</span>
<span class="n">codecs_lookup</span><span class="p">(</span><span class="n">val</span><span class="p">)</span>
<span class="k">except</span> <span class="ne">LookupError</span><span class="p">:</span>
<span class="k">raise</span> <span class="ne">RuntimeError</span><span class="p">(</span><span class="s2">&quot;The encoding &#39;|w</span><span class="si">%s</span><span class="s2">|n&#39; is invalid. &quot;</span> <span class="o">%</span> <span class="n">val</span><span class="p">)</span>
<span class="k">return</span> <span class="n">val</span>
<span class="k">def</span> <span class="nf">validate_size</span><span class="p">(</span><span class="n">val</span><span class="p">):</span>
<span class="k">return</span> <span class="p">{</span><span class="mi">0</span><span class="p">:</span> <span class="nb">int</span><span class="p">(</span><span class="n">val</span><span class="p">)}</span>
<span class="k">def</span> <span class="nf">validate_bool</span><span class="p">(</span><span class="n">val</span><span class="p">):</span>
<span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">val</span><span class="p">,</span> <span class="nb">str</span><span class="p">):</span>
<span class="k">return</span> <span class="kc">True</span> <span class="k">if</span> <span class="n">val</span><span class="o">.</span><span class="n">lower</span><span class="p">()</span> <span class="ow">in</span> <span class="p">(</span><span class="s2">&quot;true&quot;</span><span class="p">,</span> <span class="s2">&quot;on&quot;</span><span class="p">,</span> <span class="s2">&quot;1&quot;</span><span class="p">)</span> <span class="k">else</span> <span class="kc">False</span>
<span class="k">return</span> <span class="nb">bool</span><span class="p">(</span><span class="n">val</span><span class="p">)</span>
<span class="n">flags</span> <span class="o">=</span> <span class="p">{}</span>
<span class="k">for</span> <span class="n">key</span><span class="p">,</span> <span class="n">value</span> <span class="ow">in</span> <span class="n">kwargs</span><span class="o">.</span><span class="n">items</span><span class="p">():</span>
<span class="n">key</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">if</span> <span class="n">key</span> <span class="o">==</span> <span class="s2">&quot;client&quot;</span><span class="p">:</span>
<span class="n">flags</span><span class="p">[</span><span class="s2">&quot;CLIENTNAME&quot;</span><span class="p">]</span> <span class="o">=</span> <span class="n">to_str</span><span class="p">(</span><span class="n">value</span><span class="p">)</span>
<span class="k">elif</span> <span class="n">key</span> <span class="o">==</span> <span class="s2">&quot;version&quot;</span><span class="p">:</span>
<span class="k">if</span> <span class="s2">&quot;CLIENTNAME&quot;</span> <span class="ow">in</span> <span class="n">flags</span><span class="p">:</span>
<span class="n">flags</span><span class="p">[</span><span class="s2">&quot;CLIENTNAME&quot;</span><span class="p">]</span> <span class="o">=</span> <span class="s2">&quot;</span><span class="si">%s</span><span class="s2"> </span><span class="si">%s</span><span class="s2">&quot;</span> <span class="o">%</span> <span class="p">(</span><span class="n">flags</span><span class="p">[</span><span class="s2">&quot;CLIENTNAME&quot;</span><span class="p">],</span> <span class="n">to_str</span><span class="p">(</span><span class="n">value</span><span class="p">))</span>
<span class="k">elif</span> <span class="n">key</span> <span class="o">==</span> <span class="s2">&quot;ENCODING&quot;</span><span class="p">:</span>
<span class="n">flags</span><span class="p">[</span><span class="s2">&quot;ENCODING&quot;</span><span class="p">]</span> <span class="o">=</span> <span class="n">validate_encoding</span><span class="p">(</span><span class="n">value</span><span class="p">)</span>
<span class="k">elif</span> <span class="n">key</span> <span class="o">==</span> <span class="s2">&quot;ansi&quot;</span><span class="p">:</span>
<span class="n">flags</span><span class="p">[</span><span class="s2">&quot;ANSI&quot;</span><span class="p">]</span> <span class="o">=</span> <span class="n">validate_bool</span><span class="p">(</span><span class="n">value</span><span class="p">)</span>
<span class="k">elif</span> <span class="n">key</span> <span class="o">==</span> <span class="s2">&quot;xterm256&quot;</span><span class="p">:</span>
<span class="n">flags</span><span class="p">[</span><span class="s2">&quot;XTERM256&quot;</span><span class="p">]</span> <span class="o">=</span> <span class="n">validate_bool</span><span class="p">(</span><span class="n">value</span><span class="p">)</span>
<span class="k">elif</span> <span class="n">key</span> <span class="o">==</span> <span class="s2">&quot;mxp&quot;</span><span class="p">:</span>
<span class="n">flags</span><span class="p">[</span><span class="s2">&quot;MXP&quot;</span><span class="p">]</span> <span class="o">=</span> <span class="n">validate_bool</span><span class="p">(</span><span class="n">value</span><span class="p">)</span>
<span class="k">elif</span> <span class="n">key</span> <span class="o">==</span> <span class="s2">&quot;utf-8&quot;</span><span class="p">:</span>
<span class="n">flags</span><span class="p">[</span><span class="s2">&quot;UTF-8&quot;</span><span class="p">]</span> <span class="o">=</span> <span class="n">validate_bool</span><span class="p">(</span><span class="n">value</span><span class="p">)</span>
<span class="k">elif</span> <span class="n">key</span> <span class="o">==</span> <span class="s2">&quot;screenreader&quot;</span><span class="p">:</span>
<span class="n">flags</span><span class="p">[</span><span class="s2">&quot;SCREENREADER&quot;</span><span class="p">]</span> <span class="o">=</span> <span class="n">validate_bool</span><span class="p">(</span><span class="n">value</span><span class="p">)</span>
<span class="k">elif</span> <span class="n">key</span> <span class="o">==</span> <span class="s2">&quot;mccp&quot;</span><span class="p">:</span>
<span class="n">flags</span><span class="p">[</span><span class="s2">&quot;MCCP&quot;</span><span class="p">]</span> <span class="o">=</span> <span class="n">validate_bool</span><span class="p">(</span><span class="n">value</span><span class="p">)</span>
<span class="k">elif</span> <span class="n">key</span> <span class="o">==</span> <span class="s2">&quot;screenheight&quot;</span><span class="p">:</span>
<span class="n">flags</span><span class="p">[</span><span class="s2">&quot;SCREENHEIGHT&quot;</span><span class="p">]</span> <span class="o">=</span> <span class="n">validate_size</span><span class="p">(</span><span class="n">value</span><span class="p">)</span>
<span class="k">elif</span> <span class="n">key</span> <span class="o">==</span> <span class="s2">&quot;screenwidth&quot;</span><span class="p">:</span>
<span class="n">flags</span><span class="p">[</span><span class="s2">&quot;SCREENWIDTH&quot;</span><span class="p">]</span> <span class="o">=</span> <span class="n">validate_size</span><span class="p">(</span><span class="n">value</span><span class="p">)</span>
<span class="k">elif</span> <span class="n">key</span> <span class="o">==</span> <span class="s2">&quot;inputdebug&quot;</span><span class="p">:</span>
<span class="n">flags</span><span class="p">[</span><span class="s2">&quot;INPUTDEBUG&quot;</span><span class="p">]</span> <span class="o">=</span> <span class="n">validate_bool</span><span class="p">(</span><span class="n">value</span><span class="p">)</span>
<span class="k">elif</span> <span class="n">key</span> <span class="o">==</span> <span class="s2">&quot;nocolor&quot;</span><span class="p">:</span>
<span class="n">flags</span><span class="p">[</span><span class="s2">&quot;NOCOLOR&quot;</span><span class="p">]</span> <span class="o">=</span> <span class="n">validate_bool</span><span class="p">(</span><span class="n">value</span><span class="p">)</span>
<span class="k">elif</span> <span class="n">key</span> <span class="o">==</span> <span class="s2">&quot;raw&quot;</span><span class="p">:</span>
<span class="n">flags</span><span class="p">[</span><span class="s2">&quot;RAW&quot;</span><span class="p">]</span> <span class="o">=</span> <span class="n">validate_bool</span><span class="p">(</span><span class="n">value</span><span class="p">)</span>
<span class="k">elif</span> <span class="n">key</span> <span class="o">==</span> <span class="s2">&quot;nogoahead&quot;</span><span class="p">:</span>
<span class="n">flags</span><span class="p">[</span><span class="s2">&quot;NOGOAHEAD&quot;</span><span class="p">]</span> <span class="o">=</span> <span class="n">validate_bool</span><span class="p">(</span><span class="n">value</span><span class="p">)</span>
<span class="k">elif</span> <span class="n">key</span> <span class="ow">in</span> <span class="p">(</span>
<span class="s2">&quot;Char 1&quot;</span><span class="p">,</span>
<span class="s2">&quot;Char.Skills 1&quot;</span><span class="p">,</span>
<span class="s2">&quot;Char.Items 1&quot;</span><span class="p">,</span>
<span class="s2">&quot;Room 1&quot;</span><span class="p">,</span>
<span class="s2">&quot;IRE.Rift 1&quot;</span><span class="p">,</span>
<span class="s2">&quot;IRE.Composer 1&quot;</span><span class="p">,</span>
<span class="p">):</span>
<span class="c1"># ignore mudlet&#39;s default send (aimed at IRE games)</span>
<span class="k">pass</span>
<span class="k">elif</span> <span class="n">key</span> <span class="ow">not</span> <span class="ow">in</span> <span class="p">(</span><span class="s2">&quot;options&quot;</span><span class="p">,</span> <span class="s2">&quot;cmdid&quot;</span><span class="p">):</span>
<span class="n">err</span> <span class="o">=</span> <span class="n">_ERROR_INPUT</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">name</span><span class="o">=</span><span class="s2">&quot;client_settings&quot;</span><span class="p">,</span> <span class="n">session</span><span class="o">=</span><span class="n">session</span><span class="p">,</span> <span class="n">inp</span><span class="o">=</span><span class="n">key</span><span class="p">)</span>
<span class="n">session</span><span class="o">.</span><span class="n">msg</span><span class="p">(</span><span class="n">text</span><span class="o">=</span><span class="n">err</span><span class="p">)</span>
<span class="n">session</span><span class="o">.</span><span class="n">protocol_flags</span><span class="o">.</span><span class="n">update</span><span class="p">(</span><span class="n">flags</span><span class="p">)</span>
<span class="c1"># we must update the protocol flags on the portal session copy as well</span>
<span class="n">session</span><span class="o">.</span><span class="n">sessionhandler</span><span class="o">.</span><span class="n">session_portal_partial_sync</span><span class="p">({</span><span class="n">session</span><span class="o">.</span><span class="n">sessid</span><span class="p">:</span> <span class="p">{</span><span class="s2">&quot;protocol_flags&quot;</span><span class="p">:</span> <span class="n">flags</span><span class="p">}})</span></div>
<div class="viewcode-block" id="get_client_options"><a class="viewcode-back" href="../../../api/evennia.server.inputfuncs.html#evennia.server.inputfuncs.get_client_options">[docs]</a><span class="k">def</span> <span class="nf">get_client_options</span><span class="p">(</span><span class="n">session</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"> Alias wrapper for getting options.</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="n">client_options</span><span class="p">(</span><span class="n">session</span><span class="p">,</span> <span class="n">get</span><span class="o">=</span><span class="kc">True</span><span class="p">)</span></div>
<div class="viewcode-block" id="get_inputfuncs"><a class="viewcode-back" href="../../../api/evennia.server.inputfuncs.html#evennia.server.inputfuncs.get_inputfuncs">[docs]</a><span class="k">def</span> <span class="nf">get_inputfuncs</span><span class="p">(</span><span class="n">session</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"> Get the keys of all available inputfuncs. Note that we don&#39;t get</span>
<span class="sd"> it from this module alone since multiple modules could be added.</span>
<span class="sd"> So we get it from the sessionhandler.</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="n">inputfuncsdict</span> <span class="o">=</span> <span class="nb">dict</span><span class="p">(</span>
<span class="p">(</span><span class="n">key</span><span class="p">,</span> <span class="n">func</span><span class="o">.</span><span class="vm">__doc__</span><span class="p">)</span> <span class="k">for</span> <span class="n">key</span><span class="p">,</span> <span class="n">func</span> <span class="ow">in</span> <span class="n">session</span><span class="o">.</span><span class="n">sessionhandler</span><span class="o">.</span><span class="n">get_inputfuncs</span><span class="p">()</span><span class="o">.</span><span class="n">items</span><span class="p">()</span>
<span class="p">)</span>
<span class="n">session</span><span class="o">.</span><span class="n">msg</span><span class="p">(</span><span class="n">get_inputfuncs</span><span class="o">=</span><span class="n">inputfuncsdict</span><span class="p">)</span></div>
<div class="viewcode-block" id="login"><a class="viewcode-back" href="../../../api/evennia.server.inputfuncs.html#evennia.server.inputfuncs.login">[docs]</a><span class="k">def</span> <span class="nf">login</span><span class="p">(</span><span class="n">session</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"> Peform a login. This only works if session is currently not logged</span>
<span class="sd"> in. This will also automatically throttle too quick attempts.</span>
<span class="sd"> Keyword Args:</span>
<span class="sd"> name (str): Account name</span>
<span class="sd"> password (str): Plain-text password</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="k">if</span> <span class="ow">not</span> <span class="n">session</span><span class="o">.</span><span class="n">logged_in</span> <span class="ow">and</span> <span class="s2">&quot;name&quot;</span> <span class="ow">in</span> <span class="n">kwargs</span> <span class="ow">and</span> <span class="s2">&quot;password&quot;</span> <span class="ow">in</span> <span class="n">kwargs</span><span class="p">:</span>
<span class="kn">from</span> <span class="nn">evennia.commands.default.unloggedin</span> <span class="k">import</span> <span class="n">create_normal_account</span>
<span class="n">account</span> <span class="o">=</span> <span class="n">create_normal_account</span><span class="p">(</span><span class="n">session</span><span class="p">,</span> <span class="n">kwargs</span><span class="p">[</span><span class="s2">&quot;name&quot;</span><span class="p">],</span> <span class="n">kwargs</span><span class="p">[</span><span class="s2">&quot;password&quot;</span><span class="p">])</span>
<span class="k">if</span> <span class="n">account</span><span class="p">:</span>
<span class="n">session</span><span class="o">.</span><span class="n">sessionhandler</span><span class="o">.</span><span class="n">login</span><span class="p">(</span><span class="n">session</span><span class="p">,</span> <span class="n">account</span><span class="p">)</span></div>
<span class="n">_gettable</span> <span class="o">=</span> <span class="p">{</span>
<span class="s2">&quot;name&quot;</span><span class="p">:</span> <span class="k">lambda</span> <span class="n">obj</span><span class="p">:</span> <span class="n">obj</span><span class="o">.</span><span class="n">key</span><span class="p">,</span>
<span class="s2">&quot;key&quot;</span><span class="p">:</span> <span class="k">lambda</span> <span class="n">obj</span><span class="p">:</span> <span class="n">obj</span><span class="o">.</span><span class="n">key</span><span class="p">,</span>
<span class="s2">&quot;location&quot;</span><span class="p">:</span> <span class="k">lambda</span> <span class="n">obj</span><span class="p">:</span> <span class="n">obj</span><span class="o">.</span><span class="n">location</span><span class="o">.</span><span class="n">key</span> <span class="k">if</span> <span class="n">obj</span><span class="o">.</span><span class="n">location</span> <span class="k">else</span> <span class="s2">&quot;None&quot;</span><span class="p">,</span>
<span class="s2">&quot;servername&quot;</span><span class="p">:</span> <span class="k">lambda</span> <span class="n">obj</span><span class="p">:</span> <span class="n">settings</span><span class="o">.</span><span class="n">SERVERNAME</span><span class="p">,</span>
<span class="p">}</span>
<div class="viewcode-block" id="get_value"><a class="viewcode-back" href="../../../api/evennia.server.inputfuncs.html#evennia.server.inputfuncs.get_value">[docs]</a><span class="k">def</span> <span class="nf">get_value</span><span class="p">(</span><span class="n">session</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"> Return the value of a given attribute or db_property on the</span>
<span class="sd"> session&#39;s current account or character.</span>
<span class="sd"> Keyword Args:</span>
<span class="sd"> name (str): Name of info value to return. Only names</span>
<span class="sd"> in the _gettable dictionary earlier in this module</span>
<span class="sd"> are accepted.</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="n">name</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;name&quot;</span><span class="p">,</span> <span class="s2">&quot;&quot;</span><span class="p">)</span>
<span class="n">obj</span> <span class="o">=</span> <span class="n">session</span><span class="o">.</span><span class="n">puppet</span> <span class="ow">or</span> <span class="n">session</span><span class="o">.</span><span class="n">account</span>
<span class="k">if</span> <span class="n">name</span> <span class="ow">in</span> <span class="n">_gettable</span><span class="p">:</span>
<span class="n">session</span><span class="o">.</span><span class="n">msg</span><span class="p">(</span><span class="n">get_value</span><span class="o">=</span><span class="p">{</span><span class="s2">&quot;name&quot;</span><span class="p">:</span> <span class="n">name</span><span class="p">,</span> <span class="s2">&quot;value&quot;</span><span class="p">:</span> <span class="n">_gettable</span><span class="p">[</span><span class="n">name</span><span class="p">](</span><span class="n">obj</span><span class="p">)})</span></div>
<span class="k">def</span> <span class="nf">_testrepeat</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 a test function for using with the repeat</span>
<span class="sd"> inputfunc.</span>
<span class="sd"> Keyword Args:</span>
<span class="sd"> session (Session): Session to return to.</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="kn">import</span> <span class="nn">time</span>
<span class="n">kwargs</span><span class="p">[</span><span class="s2">&quot;session&quot;</span><span class="p">]</span><span class="o">.</span><span class="n">msg</span><span class="p">(</span><span class="n">repeat</span><span class="o">=</span><span class="s2">&quot;Repeat called: </span><span class="si">%s</span><span class="s2">&quot;</span> <span class="o">%</span> <span class="n">time</span><span class="o">.</span><span class="n">time</span><span class="p">())</span>
<span class="n">_repeatable</span> <span class="o">=</span> <span class="p">{</span><span class="s2">&quot;test1&quot;</span><span class="p">:</span> <span class="n">_testrepeat</span><span class="p">,</span> <span class="s2">&quot;test2&quot;</span><span class="p">:</span> <span class="n">_testrepeat</span><span class="p">}</span> <span class="c1"># example only # &quot;</span>
<div class="viewcode-block" id="repeat"><a class="viewcode-back" href="../../../api/evennia.server.inputfuncs.html#evennia.server.inputfuncs.repeat">[docs]</a><span class="k">def</span> <span class="nf">repeat</span><span class="p">(</span><span class="n">session</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"> Call a named function repeatedly. Note that</span>
<span class="sd"> this is meant as an example of limiting the number of</span>
<span class="sd"> possible call functions.</span>
<span class="sd"> Keyword Args:</span>
<span class="sd"> callback (str): The function to call. Only functions</span>
<span class="sd"> from the _repeatable dictionary earlier in this</span>
<span class="sd"> module are available.</span>
<span class="sd"> interval (int): How often to call function (s).</span>
<span class="sd"> Defaults to once every 60 seconds with a minimum</span>
<span class="sd"> of 5 seconds.</span>
<span class="sd"> stop (bool): Stop a previously assigned ticker with</span>
<span class="sd"> the above settings.</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="kn">from</span> <span class="nn">evennia.scripts.tickerhandler</span> <span class="k">import</span> <span class="n">TICKER_HANDLER</span>
<span class="n">name</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;callback&quot;</span><span class="p">,</span> <span class="s2">&quot;&quot;</span><span class="p">)</span>
<span class="n">interval</span> <span class="o">=</span> <span class="nb">max</span><span class="p">(</span><span class="mi">5</span><span class="p">,</span> <span class="nb">int</span><span class="p">(</span><span class="n">kwargs</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s2">&quot;interval&quot;</span><span class="p">,</span> <span class="mi">60</span><span class="p">)))</span>
<span class="k">if</span> <span class="n">name</span> <span class="ow">in</span> <span class="n">_repeatable</span><span class="p">:</span>
<span class="k">if</span> <span class="n">kwargs</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s2">&quot;stop&quot;</span><span class="p">,</span> <span class="kc">False</span><span class="p">):</span>
<span class="n">TICKER_HANDLER</span><span class="o">.</span><span class="n">remove</span><span class="p">(</span>
<span class="n">interval</span><span class="p">,</span> <span class="n">_repeatable</span><span class="p">[</span><span class="n">name</span><span class="p">],</span> <span class="n">idstring</span><span class="o">=</span><span class="n">session</span><span class="o">.</span><span class="n">sessid</span><span class="p">,</span> <span class="n">persistent</span><span class="o">=</span><span class="kc">False</span>
<span class="p">)</span>
<span class="k">else</span><span class="p">:</span>
<span class="n">TICKER_HANDLER</span><span class="o">.</span><span class="n">add</span><span class="p">(</span>
<span class="n">interval</span><span class="p">,</span>
<span class="n">_repeatable</span><span class="p">[</span><span class="n">name</span><span class="p">],</span>
<span class="n">idstring</span><span class="o">=</span><span class="n">session</span><span class="o">.</span><span class="n">sessid</span><span class="p">,</span>
<span class="n">persistent</span><span class="o">=</span><span class="kc">False</span><span class="p">,</span>
<span class="n">session</span><span class="o">=</span><span class="n">session</span><span class="p">,</span>
<span class="p">)</span>
<span class="k">else</span><span class="p">:</span>
<span class="n">session</span><span class="o">.</span><span class="n">msg</span><span class="p">(</span><span class="s2">&quot;Allowed repeating functions are: </span><span class="si">%s</span><span class="s2">&quot;</span> <span class="o">%</span> <span class="p">(</span><span class="s2">&quot;, &quot;</span><span class="o">.</span><span class="n">join</span><span class="p">(</span><span class="n">_repeatable</span><span class="p">)))</span></div>
<div class="viewcode-block" id="unrepeat"><a class="viewcode-back" href="../../../api/evennia.server.inputfuncs.html#evennia.server.inputfuncs.unrepeat">[docs]</a><span class="k">def</span> <span class="nf">unrepeat</span><span class="p">(</span><span class="n">session</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="s2">&quot;Wrapper for OOB use&quot;</span>
<span class="n">kwargs</span><span class="p">[</span><span class="s2">&quot;stop&quot;</span><span class="p">]</span> <span class="o">=</span> <span class="kc">True</span>
<span class="n">repeat</span><span class="p">(</span><span class="n">session</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></div>
<span class="n">_monitorable</span> <span class="o">=</span> <span class="p">{</span><span class="s2">&quot;name&quot;</span><span class="p">:</span> <span class="s2">&quot;db_key&quot;</span><span class="p">,</span> <span class="s2">&quot;location&quot;</span><span class="p">:</span> <span class="s2">&quot;db_location&quot;</span><span class="p">,</span> <span class="s2">&quot;desc&quot;</span><span class="p">:</span> <span class="s2">&quot;desc&quot;</span><span class="p">}</span>
<span class="k">def</span> <span class="nf">_on_monitor_change</span><span class="p">(</span><span class="o">**</span><span class="n">kwargs</span><span class="p">):</span>
<span class="n">fieldname</span> <span class="o">=</span> <span class="n">kwargs</span><span class="p">[</span><span class="s2">&quot;fieldname&quot;</span><span class="p">]</span>
<span class="n">obj</span> <span class="o">=</span> <span class="n">kwargs</span><span class="p">[</span><span class="s2">&quot;obj&quot;</span><span class="p">]</span>
<span class="n">name</span> <span class="o">=</span> <span class="n">kwargs</span><span class="p">[</span><span class="s2">&quot;name&quot;</span><span class="p">]</span>
<span class="n">session</span> <span class="o">=</span> <span class="n">kwargs</span><span class="p">[</span><span class="s2">&quot;session&quot;</span><span class="p">]</span>
<span class="n">outputfunc_name</span> <span class="o">=</span> <span class="n">kwargs</span><span class="p">[</span><span class="s2">&quot;outputfunc_name&quot;</span><span class="p">]</span>
<span class="c1"># the session may be None if the char quits and someone</span>
<span class="c1"># else then edits the object</span>
<span class="k">if</span> <span class="n">session</span><span class="p">:</span>
<span class="n">callsign</span> <span class="o">=</span> <span class="p">{</span><span class="n">outputfunc_name</span><span class="p">:</span> <span class="p">{</span><span class="s2">&quot;name&quot;</span><span class="p">:</span> <span class="n">name</span><span class="p">,</span> <span class="s2">&quot;value&quot;</span><span class="p">:</span> <span class="n">_GA</span><span class="p">(</span><span class="n">obj</span><span class="p">,</span> <span class="n">fieldname</span><span class="p">)}}</span>
<span class="n">session</span><span class="o">.</span><span class="n">msg</span><span class="p">(</span><span class="o">**</span><span class="n">callsign</span><span class="p">)</span>
<div class="viewcode-block" id="monitor"><a class="viewcode-back" href="../../../api/evennia.server.inputfuncs.html#evennia.server.inputfuncs.monitor">[docs]</a><span class="k">def</span> <span class="nf">monitor</span><span class="p">(</span><span class="n">session</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"> Adds monitoring to a given property or Attribute.</span>
<span class="sd"> Keyword Args:</span>
<span class="sd"> name (str): The name of the property or Attribute</span>
<span class="sd"> to report. No db_* prefix is needed. Only names</span>
<span class="sd"> in the _monitorable dict earlier in this module</span>
<span class="sd"> are accepted.</span>
<span class="sd"> stop (bool): Stop monitoring the above name.</span>
<span class="sd"> outputfunc_name (str, optional): Change the name of</span>
<span class="sd"> the outputfunc name. This is used e.g. by MSDP which</span>
<span class="sd"> has its own specific output format.</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="kn">from</span> <span class="nn">evennia.scripts.monitorhandler</span> <span class="k">import</span> <span class="n">MONITOR_HANDLER</span>
<span class="n">name</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;name&quot;</span><span class="p">,</span> <span class="kc">None</span><span class="p">)</span>
<span class="n">outputfunc_name</span> <span class="o">=</span> <span class="n">kwargs</span><span class="p">(</span><span class="s2">&quot;outputfunc_name&quot;</span><span class="p">,</span> <span class="s2">&quot;monitor&quot;</span><span class="p">)</span>
<span class="k">if</span> <span class="n">name</span> <span class="ow">and</span> <span class="n">name</span> <span class="ow">in</span> <span class="n">_monitorable</span> <span class="ow">and</span> <span class="n">session</span><span class="o">.</span><span class="n">puppet</span><span class="p">:</span>
<span class="n">field_name</span> <span class="o">=</span> <span class="n">_monitorable</span><span class="p">[</span><span class="n">name</span><span class="p">]</span>
<span class="n">obj</span> <span class="o">=</span> <span class="n">session</span><span class="o">.</span><span class="n">puppet</span>
<span class="k">if</span> <span class="n">kwargs</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s2">&quot;stop&quot;</span><span class="p">,</span> <span class="kc">False</span><span class="p">):</span>
<span class="n">MONITOR_HANDLER</span><span class="o">.</span><span class="n">remove</span><span class="p">(</span><span class="n">obj</span><span class="p">,</span> <span class="n">field_name</span><span class="p">,</span> <span class="n">idstring</span><span class="o">=</span><span class="n">session</span><span class="o">.</span><span class="n">sessid</span><span class="p">)</span>
<span class="k">else</span><span class="p">:</span>
<span class="c1"># the handler will add fieldname and obj to the kwargs automatically</span>
<span class="n">MONITOR_HANDLER</span><span class="o">.</span><span class="n">add</span><span class="p">(</span>
<span class="n">obj</span><span class="p">,</span>
<span class="n">field_name</span><span class="p">,</span>
<span class="n">_on_monitor_change</span><span class="p">,</span>
<span class="n">idstring</span><span class="o">=</span><span class="n">session</span><span class="o">.</span><span class="n">sessid</span><span class="p">,</span>
<span class="n">persistent</span><span class="o">=</span><span class="kc">False</span><span class="p">,</span>
<span class="n">name</span><span class="o">=</span><span class="n">name</span><span class="p">,</span>
<span class="n">session</span><span class="o">=</span><span class="n">session</span><span class="p">,</span>
<span class="n">outputfunc_name</span><span class="o">=</span><span class="n">outputfunc_name</span><span class="p">,</span>
<span class="p">)</span></div>
<div class="viewcode-block" id="unmonitor"><a class="viewcode-back" href="../../../api/evennia.server.inputfuncs.html#evennia.server.inputfuncs.unmonitor">[docs]</a><span class="k">def</span> <span class="nf">unmonitor</span><span class="p">(</span><span class="n">session</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"> Wrapper for turning off monitoring</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="n">kwargs</span><span class="p">[</span><span class="s2">&quot;stop&quot;</span><span class="p">]</span> <span class="o">=</span> <span class="kc">True</span>
<span class="n">monitor</span><span class="p">(</span><span class="n">session</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></div>
<div class="viewcode-block" id="monitored"><a class="viewcode-back" href="../../../api/evennia.server.inputfuncs.html#evennia.server.inputfuncs.monitored">[docs]</a><span class="k">def</span> <span class="nf">monitored</span><span class="p">(</span><span class="n">session</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"> Report on what is being monitored</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="kn">from</span> <span class="nn">evennia.scripts.monitorhandler</span> <span class="k">import</span> <span class="n">MONITOR_HANDLER</span>
<span class="n">obj</span> <span class="o">=</span> <span class="n">session</span><span class="o">.</span><span class="n">puppet</span>
<span class="n">monitors</span> <span class="o">=</span> <span class="n">MONITOR_HANDLER</span><span class="o">.</span><span class="n">all</span><span class="p">(</span><span class="n">obj</span><span class="o">=</span><span class="n">obj</span><span class="p">)</span>
<span class="n">session</span><span class="o">.</span><span class="n">msg</span><span class="p">(</span><span class="n">monitored</span><span class="o">=</span><span class="p">(</span><span class="n">monitors</span><span class="p">,</span> <span class="p">{}))</span></div>
<span class="k">def</span> <span class="nf">_on_webclient_options_change</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 when the webclient options stored on the account changes.</span>
<span class="sd"> Inform the interested clients of this change.</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="n">session</span> <span class="o">=</span> <span class="n">kwargs</span><span class="p">[</span><span class="s2">&quot;session&quot;</span><span class="p">]</span>
<span class="n">obj</span> <span class="o">=</span> <span class="n">kwargs</span><span class="p">[</span><span class="s2">&quot;obj&quot;</span><span class="p">]</span>
<span class="n">fieldname</span> <span class="o">=</span> <span class="n">kwargs</span><span class="p">[</span><span class="s2">&quot;fieldname&quot;</span><span class="p">]</span>
<span class="n">clientoptions</span> <span class="o">=</span> <span class="n">_GA</span><span class="p">(</span><span class="n">obj</span><span class="p">,</span> <span class="n">fieldname</span><span class="p">)</span>
<span class="c1"># the session may be None if the char quits and someone</span>
<span class="c1"># else then edits the object</span>
<span class="k">if</span> <span class="n">session</span><span class="p">:</span>
<span class="n">session</span><span class="o">.</span><span class="n">msg</span><span class="p">(</span><span class="n">webclient_options</span><span class="o">=</span><span class="n">clientoptions</span><span class="p">)</span>
<div class="viewcode-block" id="webclient_options"><a class="viewcode-back" href="../../../api/evennia.server.inputfuncs.html#evennia.server.inputfuncs.webclient_options">[docs]</a><span class="k">def</span> <span class="nf">webclient_options</span><span class="p">(</span><span class="n">session</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"> Handles retrieving and changing of options related to the webclient.</span>
<span class="sd"> If kwargs is empty (or contains just a &quot;cmdid&quot;), the saved options will be</span>
<span class="sd"> sent back to the session.</span>
<span class="sd"> A monitor handler will be created to inform the client of any future options</span>
<span class="sd"> that changes.</span>
<span class="sd"> If kwargs is not empty, the key/values stored in there will be persisted</span>
<span class="sd"> to the account object.</span>
<span class="sd"> Keyword Args:</span>
<span class="sd"> &lt;option name&gt;: an option to save</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="n">account</span> <span class="o">=</span> <span class="n">session</span><span class="o">.</span><span class="n">account</span>
<span class="n">clientoptions</span> <span class="o">=</span> <span class="n">account</span><span class="o">.</span><span class="n">db</span><span class="o">.</span><span class="n">_saved_webclient_options</span>
<span class="k">if</span> <span class="ow">not</span> <span class="n">clientoptions</span><span class="p">:</span>
<span class="c1"># No saved options for this account, copy and save the default.</span>
<span class="n">account</span><span class="o">.</span><span class="n">db</span><span class="o">.</span><span class="n">_saved_webclient_options</span> <span class="o">=</span> <span class="n">settings</span><span class="o">.</span><span class="n">WEBCLIENT_OPTIONS</span><span class="o">.</span><span class="n">copy</span><span class="p">()</span>
<span class="c1"># Get the _SaverDict created by the database.</span>
<span class="n">clientoptions</span> <span class="o">=</span> <span class="n">account</span><span class="o">.</span><span class="n">db</span><span class="o">.</span><span class="n">_saved_webclient_options</span>
<span class="c1"># The webclient adds a cmdid to every kwargs, but we don&#39;t need it.</span>
<span class="k">try</span><span class="p">:</span>
<span class="k">del</span> <span class="n">kwargs</span><span class="p">[</span><span class="s2">&quot;cmdid&quot;</span><span class="p">]</span>
<span class="k">except</span> <span class="ne">KeyError</span><span class="p">:</span>
<span class="k">pass</span>
<span class="k">if</span> <span class="ow">not</span> <span class="n">kwargs</span><span class="p">:</span>
<span class="c1"># No kwargs: we are getting the stored options</span>
<span class="c1"># Convert clientoptions to regular dict for sending.</span>
<span class="n">session</span><span class="o">.</span><span class="n">msg</span><span class="p">(</span><span class="n">webclient_options</span><span class="o">=</span><span class="nb">dict</span><span class="p">(</span><span class="n">clientoptions</span><span class="p">))</span>
<span class="c1"># Create a monitor. If a monitor already exists then it will replace</span>
<span class="c1"># the previous one since it would use the same idstring</span>
<span class="kn">from</span> <span class="nn">evennia.scripts.monitorhandler</span> <span class="k">import</span> <span class="n">MONITOR_HANDLER</span>
<span class="n">MONITOR_HANDLER</span><span class="o">.</span><span class="n">add</span><span class="p">(</span>
<span class="n">account</span><span class="p">,</span>
<span class="s2">&quot;_saved_webclient_options&quot;</span><span class="p">,</span>
<span class="n">_on_webclient_options_change</span><span class="p">,</span>
<span class="n">idstring</span><span class="o">=</span><span class="n">session</span><span class="o">.</span><span class="n">sessid</span><span class="p">,</span>
<span class="n">persistent</span><span class="o">=</span><span class="kc">False</span><span class="p">,</span>
<span class="n">session</span><span class="o">=</span><span class="n">session</span><span class="p">,</span>
<span class="p">)</span>
<span class="k">else</span><span class="p">:</span>
<span class="c1"># kwargs provided: persist them to the account object</span>
<span class="k">for</span> <span class="n">key</span><span class="p">,</span> <span class="n">value</span> <span class="ow">in</span> <span class="n">kwargs</span><span class="o">.</span><span class="n">items</span><span class="p">():</span>
<span class="n">clientoptions</span><span class="p">[</span><span class="n">key</span><span class="p">]</span> <span class="o">=</span> <span class="n">value</span></div>
<span class="c1"># OOB protocol-specific aliases and wrappers</span>
<span class="c1"># GMCP aliases</span>
<span class="n">hello</span> <span class="o">=</span> <span class="n">client_options</span>
<span class="n">supports_set</span> <span class="o">=</span> <span class="n">client_options</span>
<span class="c1"># MSDP aliases (some of the the generic MSDP commands defined in the MSDP spec are prefixed</span>
<span class="c1"># by msdp_ at the protocol level)</span>
<span class="c1"># See https://tintin.sourceforge.io/protocols/msdp/</span>
<div class="viewcode-block" id="msdp_list"><a class="viewcode-back" href="../../../api/evennia.server.inputfuncs.html#evennia.server.inputfuncs.msdp_list">[docs]</a><span class="k">def</span> <span class="nf">msdp_list</span><span class="p">(</span><span class="n">session</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"> MSDP LIST command</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="kn">from</span> <span class="nn">evennia.scripts.monitorhandler</span> <span class="k">import</span> <span class="n">MONITOR_HANDLER</span>
<span class="n">args_lower</span> <span class="o">=</span> <span class="p">[</span><span class="n">arg</span><span class="o">.</span><span class="n">lower</span><span class="p">()</span> <span class="k">for</span> <span class="n">arg</span> <span class="ow">in</span> <span class="n">args</span><span class="p">]</span>
<span class="k">if</span> <span class="s2">&quot;commands&quot;</span> <span class="ow">in</span> <span class="n">args_lower</span><span class="p">:</span>
<span class="n">inputfuncs</span> <span class="o">=</span> <span class="p">[</span>
<span class="n">key</span><span class="p">[</span><span class="mi">5</span><span class="p">:]</span> <span class="k">if</span> <span class="n">key</span><span class="o">.</span><span class="n">startswith</span><span class="p">(</span><span class="s2">&quot;msdp_&quot;</span><span class="p">)</span> <span class="k">else</span> <span class="n">key</span>
<span class="k">for</span> <span class="n">key</span> <span class="ow">in</span> <span class="n">session</span><span class="o">.</span><span class="n">sessionhandler</span><span class="o">.</span><span class="n">get_inputfuncs</span><span class="p">()</span><span class="o">.</span><span class="n">keys</span><span class="p">()</span>
<span class="p">]</span>
<span class="n">session</span><span class="o">.</span><span class="n">msg</span><span class="p">(</span><span class="n">commands</span><span class="o">=</span><span class="p">(</span><span class="n">inputfuncs</span><span class="p">,</span> <span class="p">{}))</span>
<span class="k">if</span> <span class="s2">&quot;lists&quot;</span> <span class="ow">in</span> <span class="n">args_lower</span><span class="p">:</span>
<span class="n">session</span><span class="o">.</span><span class="n">msg</span><span class="p">(</span>
<span class="n">lists</span><span class="o">=</span><span class="p">(</span>
<span class="p">[</span>
<span class="s2">&quot;commands&quot;</span><span class="p">,</span>
<span class="s2">&quot;lists&quot;</span><span class="p">,</span>
<span class="s2">&quot;configurable_variables&quot;</span><span class="p">,</span>
<span class="s2">&quot;reportable_variables&quot;</span><span class="p">,</span>
<span class="s2">&quot;reported_variables&quot;</span><span class="p">,</span>
<span class="s2">&quot;sendable_variables&quot;</span><span class="p">,</span>
<span class="p">],</span>
<span class="p">{},</span>
<span class="p">)</span>
<span class="p">)</span>
<span class="k">if</span> <span class="s2">&quot;configurable_variables&quot;</span> <span class="ow">in</span> <span class="n">args_lower</span><span class="p">:</span>
<span class="n">session</span><span class="o">.</span><span class="n">msg</span><span class="p">(</span><span class="n">configurable_variables</span><span class="o">=</span><span class="p">(</span><span class="n">_CLIENT_OPTIONS</span><span class="p">,</span> <span class="p">{}))</span>
<span class="k">if</span> <span class="s2">&quot;reportable_variables&quot;</span> <span class="ow">in</span> <span class="n">args_lower</span><span class="p">:</span>
<span class="n">session</span><span class="o">.</span><span class="n">msg</span><span class="p">(</span><span class="n">reportable_variables</span><span class="o">=</span><span class="p">(</span><span class="n">_monitorable</span><span class="p">,</span> <span class="p">{}))</span>
<span class="k">if</span> <span class="s2">&quot;reported_variables&quot;</span> <span class="ow">in</span> <span class="n">args_lower</span><span class="p">:</span>
<span class="n">obj</span> <span class="o">=</span> <span class="n">session</span><span class="o">.</span><span class="n">puppet</span>
<span class="n">monitor_infos</span> <span class="o">=</span> <span class="n">MONITOR_HANDLER</span><span class="o">.</span><span class="n">all</span><span class="p">(</span><span class="n">obj</span><span class="o">=</span><span class="n">obj</span><span class="p">)</span>
<span class="n">fieldnames</span> <span class="o">=</span> <span class="p">[</span><span class="n">tup</span><span class="p">[</span><span class="mi">1</span><span class="p">]</span> <span class="k">for</span> <span class="n">tup</span> <span class="ow">in</span> <span class="n">monitor_infos</span><span class="p">]</span>
<span class="n">session</span><span class="o">.</span><span class="n">msg</span><span class="p">(</span><span class="n">reported_variables</span><span class="o">=</span><span class="p">(</span><span class="n">fieldnames</span><span class="p">,</span> <span class="p">{}))</span>
<span class="k">if</span> <span class="s2">&quot;sendable_variables&quot;</span> <span class="ow">in</span> <span class="n">args_lower</span><span class="p">:</span>
<span class="n">session</span><span class="o">.</span><span class="n">msg</span><span class="p">(</span><span class="n">sendable_variables</span><span class="o">=</span><span class="p">(</span><span class="n">_monitorable</span><span class="p">,</span> <span class="p">{}))</span></div>
<div class="viewcode-block" id="msdp_report"><a class="viewcode-back" href="../../../api/evennia.server.inputfuncs.html#evennia.server.inputfuncs.msdp_report">[docs]</a><span class="k">def</span> <span class="nf">msdp_report</span><span class="p">(</span><span class="n">session</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"> MSDP REPORT command</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="n">kwargs</span><span class="p">[</span><span class="s2">&quot;outputfunc_name&quot;</span><span class="p">:</span><span class="s2">&quot;report&quot;</span><span class="p">]</span>
<span class="n">monitor</span><span class="p">(</span><span class="n">session</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></div>
<div class="viewcode-block" id="msdp_unreport"><a class="viewcode-back" href="../../../api/evennia.server.inputfuncs.html#evennia.server.inputfuncs.msdp_unreport">[docs]</a><span class="k">def</span> <span class="nf">msdp_unreport</span><span class="p">(</span><span class="n">session</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"> MSDP UNREPORT command</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="n">unmonitor</span><span class="p">(</span><span class="n">session</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></div>
<div class="viewcode-block" id="msdp_send"><a class="viewcode-back" href="../../../api/evennia.server.inputfuncs.html#evennia.server.inputfuncs.msdp_send">[docs]</a><span class="k">def</span> <span class="nf">msdp_send</span><span class="p">(</span><span class="n">session</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"> MSDP SEND command</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="n">out</span> <span class="o">=</span> <span class="p">{}</span>
<span class="k">for</span> <span class="n">varname</span> <span class="ow">in</span> <span class="n">args</span><span class="p">:</span>
<span class="k">if</span> <span class="n">varname</span><span class="o">.</span><span class="n">lower</span><span class="p">()</span> <span class="ow">in</span> <span class="n">_monitorable</span><span class="p">:</span>
<span class="n">out</span><span class="p">[</span><span class="n">varname</span><span class="p">]</span> <span class="o">=</span> <span class="n">_monitorable</span><span class="p">[</span><span class="n">varname</span><span class="o">.</span><span class="n">lower</span><span class="p">()]</span>
<span class="n">session</span><span class="o">.</span><span class="n">msg</span><span class="p">(</span><span class="n">send</span><span class="o">=</span><span class="p">((),</span> <span class="n">out</span><span class="p">))</span></div>
<span class="c1"># client specific</span>
<div class="viewcode-block" id="external_discord_hello"><a class="viewcode-back" href="../../../api/evennia.server.inputfuncs.html#evennia.server.inputfuncs.external_discord_hello">[docs]</a><span class="k">def</span> <span class="nf">external_discord_hello</span><span class="p">(</span><span class="n">session</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"> Sent by Mudlet as a greeting; added here to avoid</span>
<span class="sd"> logging a missing inputfunc for it.</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="k">pass</span></div>
</pre></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="inputfuncs.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 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>
</ul>
</div>
<div class="footer" role="contentinfo">
&#169; Copyright 2020, The Evennia developer community.
Created using <a href="http://sphinx-doc.org/">Sphinx</a> 2.4.4.
</div>
</body>
</html>