mirror of
https://github.com/evennia/evennia.git
synced 2026-03-26 01:36:32 +01:00
985 lines
No EOL
107 KiB
HTML
985 lines
No EOL
107 KiB
HTML
|
|
<!DOCTYPE html>
|
|
|
|
<html>
|
|
<head>
|
|
<meta charset="utf-8" />
|
|
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
|
|
<title>evennia.server.sessionhandler — Evennia 1.0 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</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.server.sessionhandler</a></li>
|
|
</ul>
|
|
</div>
|
|
|
|
<div class="document">
|
|
|
|
<div class="documentwrapper">
|
|
<div class="sphinxsidebar" role="navigation" aria-label="main navigation">
|
|
<div class="sphinxsidebarwrapper">
|
|
<p class="logo"><a href="../../../index.html">
|
|
<img class="logo" src="../../../_static/evennia_logo.png" alt="Logo"/>
|
|
</a></p>
|
|
<div id="searchbox" style="display: none" role="search">
|
|
<h3 id="searchlabel">Quick search</h3>
|
|
<div class="searchformwrapper">
|
|
<form class="search" action="../../../search.html" method="get">
|
|
<input type="text" name="q" aria-labelledby="searchlabel" />
|
|
<input type="submit" value="Go" />
|
|
</form>
|
|
</div>
|
|
</div>
|
|
<script>$('#searchbox').show(0);</script><h3>Links</h3>
|
|
<ul>
|
|
<li><a href="https://www.evennia.com/docs/latest/index.html">Documentation Top</a> </li>
|
|
<li><a href="https://www.evennia.com">Evennia Home</a> </li>
|
|
<li><a href="https://github.com/evennia/evennia">Github</a> </li>
|
|
<li><a href="http://games.evennia.com">Game Index</a> </li>
|
|
<li>
|
|
<a href="https://discord.gg/AJJpcRUhtF">Discord</a> -
|
|
<a href="https://github.com/evennia/evennia/discussions">Discussions</a> -
|
|
<a href="https://evennia.blogspot.com/">Blog</a>
|
|
</li>
|
|
</ul>
|
|
<h3>Versions</h3>
|
|
<ul>
|
|
<li><a href="sessionhandler.html">1.0 (main branch)</a></li>
|
|
<ul>
|
|
<li><a href="../0.9.5/index.html">0.9.5 (v0.9.5 branch)</a></li>
|
|
|
|
</ul>
|
|
|
|
</div>
|
|
</div>
|
|
<div class="bodywrapper">
|
|
<div class="body" role="main">
|
|
|
|
<h1>Source code for evennia.server.sessionhandler</h1><div class="highlight"><pre>
|
|
<span></span><span class="sd">"""</span>
|
|
<span class="sd">This module defines handlers for storing sessions when handles</span>
|
|
<span class="sd">sessions of users connecting to the server.</span>
|
|
|
|
<span class="sd">There are two similar but separate stores of sessions:</span>
|
|
|
|
<span class="sd">- ServerSessionHandler - this stores generic game sessions</span>
|
|
<span class="sd"> for the game. These sessions has no knowledge about</span>
|
|
<span class="sd"> how they are connected to the world.</span>
|
|
<span class="sd">- PortalSessionHandler - this stores sessions created by</span>
|
|
<span class="sd"> twisted protocols. These are dumb connectors that</span>
|
|
<span class="sd"> handle network communication but holds no game info.</span>
|
|
|
|
<span class="sd">"""</span>
|
|
<span class="kn">import</span> <span class="nn">time</span>
|
|
<span class="kn">from</span> <span class="nn">codecs</span> <span class="kn">import</span> <span class="n">decode</span> <span class="k">as</span> <span class="n">codecs_decode</span>
|
|
|
|
<span class="kn">from</span> <span class="nn">django.conf</span> <span class="kn">import</span> <span class="n">settings</span>
|
|
<span class="kn">from</span> <span class="nn">django.utils.translation</span> <span class="kn">import</span> <span class="n">gettext</span> <span class="k">as</span> <span class="n">_</span>
|
|
|
|
<span class="kn">from</span> <span class="nn">evennia.commands.cmdhandler</span> <span class="kn">import</span> <span class="n">CMD_LOGINSTART</span>
|
|
<span class="kn">from</span> <span class="nn">evennia.server.portal</span> <span class="kn">import</span> <span class="n">amp</span>
|
|
<span class="kn">from</span> <span class="nn">evennia.server.signals</span> <span class="kn">import</span> <span class="p">(</span>
|
|
<span class="n">SIGNAL_ACCOUNT_POST_FIRST_LOGIN</span><span class="p">,</span>
|
|
<span class="n">SIGNAL_ACCOUNT_POST_LAST_LOGOUT</span><span class="p">,</span>
|
|
<span class="n">SIGNAL_ACCOUNT_POST_LOGIN</span><span class="p">,</span>
|
|
<span class="n">SIGNAL_ACCOUNT_POST_LOGOUT</span><span class="p">,</span>
|
|
<span class="p">)</span>
|
|
<span class="kn">from</span> <span class="nn">evennia.utils.logger</span> <span class="kn">import</span> <span class="n">log_trace</span>
|
|
<span class="kn">from</span> <span class="nn">evennia.utils.utils</span> <span class="kn">import</span> <span class="p">(</span>
|
|
<span class="n">callables_from_module</span><span class="p">,</span>
|
|
<span class="n">class_from_module</span><span class="p">,</span>
|
|
<span class="n">delay</span><span class="p">,</span>
|
|
<span class="n">is_iter</span><span class="p">,</span>
|
|
<span class="n">make_iter</span><span class="p">,</span>
|
|
<span class="p">)</span>
|
|
|
|
<span class="n">_FUNCPARSER_PARSE_OUTGOING_MESSAGES_ENABLED</span> <span class="o">=</span> <span class="n">settings</span><span class="o">.</span><span class="n">FUNCPARSER_PARSE_OUTGOING_MESSAGES_ENABLED</span>
|
|
<span class="n">_BROADCAST_SERVER_RESTART_MESSAGES</span> <span class="o">=</span> <span class="n">settings</span><span class="o">.</span><span class="n">BROADCAST_SERVER_RESTART_MESSAGES</span>
|
|
|
|
<span class="c1"># delayed imports</span>
|
|
<span class="n">_AccountDB</span> <span class="o">=</span> <span class="kc">None</span>
|
|
<span class="n">_ServerSession</span> <span class="o">=</span> <span class="kc">None</span>
|
|
<span class="n">_ServerConfig</span> <span class="o">=</span> <span class="kc">None</span>
|
|
<span class="n">_ScriptDB</span> <span class="o">=</span> <span class="kc">None</span>
|
|
<span class="n">_OOB_HANDLER</span> <span class="o">=</span> <span class="kc">None</span>
|
|
|
|
<span class="n">_ERR_BAD_UTF8</span> <span class="o">=</span> <span class="n">_</span><span class="p">(</span><span class="s2">"Your client sent an incorrect UTF-8 sequence."</span><span class="p">)</span>
|
|
|
|
|
|
<div class="viewcode-block" id="DummySession"><a class="viewcode-back" href="../../../api/evennia.server.sessionhandler.html#evennia.server.sessionhandler.DummySession">[docs]</a><span class="k">class</span> <span class="nc">DummySession</span><span class="p">(</span><span class="nb">object</span><span class="p">):</span>
|
|
<span class="n">sessid</span> <span class="o">=</span> <span class="mi">0</span></div>
|
|
|
|
|
|
<span class="n">DUMMYSESSION</span> <span class="o">=</span> <span class="n">DummySession</span><span class="p">()</span>
|
|
|
|
<span class="n">_SERVERNAME</span> <span class="o">=</span> <span class="n">settings</span><span class="o">.</span><span class="n">SERVERNAME</span>
|
|
<span class="n">_MULTISESSION_MODE</span> <span class="o">=</span> <span class="n">settings</span><span class="o">.</span><span class="n">MULTISESSION_MODE</span>
|
|
<span class="n">_IDLE_TIMEOUT</span> <span class="o">=</span> <span class="n">settings</span><span class="o">.</span><span class="n">IDLE_TIMEOUT</span>
|
|
<span class="n">_DELAY_CMD_LOGINSTART</span> <span class="o">=</span> <span class="n">settings</span><span class="o">.</span><span class="n">DELAY_CMD_LOGINSTART</span>
|
|
<span class="n">_MAX_SERVER_COMMANDS_PER_SECOND</span> <span class="o">=</span> <span class="mf">100.0</span>
|
|
<span class="n">_MAX_SESSION_COMMANDS_PER_SECOND</span> <span class="o">=</span> <span class="mf">5.0</span>
|
|
<span class="n">_MODEL_MAP</span> <span class="o">=</span> <span class="kc">None</span>
|
|
<span class="n">_FUNCPARSER</span> <span class="o">=</span> <span class="kc">None</span>
|
|
|
|
|
|
<span class="c1"># input handlers</span>
|
|
|
|
<span class="n">_INPUT_FUNCS</span> <span class="o">=</span> <span class="p">{}</span>
|
|
<span class="k">for</span> <span class="n">modname</span> <span class="ow">in</span> <span class="n">make_iter</span><span class="p">(</span><span class="n">settings</span><span class="o">.</span><span class="n">INPUT_FUNC_MODULES</span><span class="p">):</span>
|
|
<span class="n">_INPUT_FUNCS</span><span class="o">.</span><span class="n">update</span><span class="p">(</span><span class="n">callables_from_module</span><span class="p">(</span><span class="n">modname</span><span class="p">))</span>
|
|
|
|
|
|
<div class="viewcode-block" id="delayed_import"><a class="viewcode-back" href="../../../api/evennia.server.sessionhandler.html#evennia.server.sessionhandler.delayed_import">[docs]</a><span class="k">def</span> <span class="nf">delayed_import</span><span class="p">():</span>
|
|
<span class="w"> </span><span class="sd">"""</span>
|
|
<span class="sd"> Helper method for delayed import of all needed entities.</span>
|
|
|
|
<span class="sd"> """</span>
|
|
<span class="k">global</span> <span class="n">_ServerSession</span><span class="p">,</span> <span class="n">_AccountDB</span><span class="p">,</span> <span class="n">_ServerConfig</span><span class="p">,</span> <span class="n">_ScriptDB</span>
|
|
<span class="k">if</span> <span class="ow">not</span> <span class="n">_ServerSession</span><span class="p">:</span>
|
|
<span class="c1"># we allow optional arbitrary serversession class for overloading</span>
|
|
<span class="n">_ServerSession</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">SERVER_SESSION_CLASS</span><span class="p">)</span>
|
|
<span class="k">if</span> <span class="ow">not</span> <span class="n">_AccountDB</span><span class="p">:</span>
|
|
<span class="kn">from</span> <span class="nn">evennia.accounts.models</span> <span class="kn">import</span> <span class="n">AccountDB</span> <span class="k">as</span> <span class="n">_AccountDB</span>
|
|
<span class="k">if</span> <span class="ow">not</span> <span class="n">_ServerConfig</span><span class="p">:</span>
|
|
<span class="kn">from</span> <span class="nn">evennia.server.models</span> <span class="kn">import</span> <span class="n">ServerConfig</span> <span class="k">as</span> <span class="n">_ServerConfig</span>
|
|
<span class="k">if</span> <span class="ow">not</span> <span class="n">_ScriptDB</span><span class="p">:</span>
|
|
<span class="kn">from</span> <span class="nn">evennia.scripts.models</span> <span class="kn">import</span> <span class="n">ScriptDB</span> <span class="k">as</span> <span class="n">_ScriptDB</span>
|
|
<span class="c1"># including once to avoid warnings in Python syntax checkers</span>
|
|
<span class="k">assert</span> <span class="n">_ServerSession</span><span class="p">,</span> <span class="s2">"ServerSession class could not load"</span>
|
|
<span class="k">assert</span> <span class="n">_AccountDB</span><span class="p">,</span> <span class="s2">"AccountDB class could not load"</span>
|
|
<span class="k">assert</span> <span class="n">_ServerConfig</span><span class="p">,</span> <span class="s2">"ServerConfig class could not load"</span>
|
|
<span class="k">assert</span> <span class="n">_ScriptDB</span><span class="p">,</span> <span class="s2">"ScriptDB class c ould not load"</span></div>
|
|
|
|
|
|
<span class="c1"># -----------------------------------------------------------</span>
|
|
<span class="c1"># SessionHandler base class</span>
|
|
<span class="c1"># ------------------------------------------------------------</span>
|
|
|
|
|
|
<div class="viewcode-block" id="SessionHandler"><a class="viewcode-back" href="../../../api/evennia.server.sessionhandler.html#evennia.server.sessionhandler.SessionHandler">[docs]</a><span class="k">class</span> <span class="nc">SessionHandler</span><span class="p">(</span><span class="nb">dict</span><span class="p">):</span>
|
|
<span class="w"> </span><span class="sd">"""</span>
|
|
<span class="sd"> This handler holds a stack of sessions.</span>
|
|
|
|
<span class="sd"> """</span>
|
|
|
|
<span class="k">def</span> <span class="fm">__getitem__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">key</span><span class="p">):</span>
|
|
<span class="w"> </span><span class="sd">"""</span>
|
|
<span class="sd"> Clean out None-sessions automatically.</span>
|
|
|
|
<span class="sd"> """</span>
|
|
<span class="k">if</span> <span class="kc">None</span> <span class="ow">in</span> <span class="bp">self</span><span class="p">:</span>
|
|
<span class="k">del</span> <span class="bp">self</span><span class="p">[</span><span class="kc">None</span><span class="p">]</span>
|
|
<span class="k">return</span> <span class="nb">super</span><span class="p">()</span><span class="o">.</span><span class="fm">__getitem__</span><span class="p">(</span><span class="n">key</span><span class="p">)</span>
|
|
|
|
<div class="viewcode-block" id="SessionHandler.get"><a class="viewcode-back" href="../../../api/evennia.server.sessionhandler.html#evennia.server.sessionhandler.SessionHandler.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">key</span><span class="p">,</span> <span class="n">default</span><span class="o">=</span><span class="kc">None</span><span class="p">):</span>
|
|
<span class="w"> </span><span class="sd">"""</span>
|
|
<span class="sd"> Clean out None-sessions automatically.</span>
|
|
|
|
<span class="sd"> """</span>
|
|
<span class="k">if</span> <span class="kc">None</span> <span class="ow">in</span> <span class="bp">self</span><span class="p">:</span>
|
|
<span class="k">del</span> <span class="bp">self</span><span class="p">[</span><span class="kc">None</span><span class="p">]</span>
|
|
<span class="k">return</span> <span class="nb">super</span><span class="p">()</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="n">key</span><span class="p">,</span> <span class="n">default</span><span class="p">)</span></div>
|
|
|
|
<span class="k">def</span> <span class="fm">__setitem__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">key</span><span class="p">,</span> <span class="n">value</span><span class="p">):</span>
|
|
<span class="w"> </span><span class="sd">"""</span>
|
|
<span class="sd"> Don't assign None sessions"</span>
|
|
|
|
<span class="sd"> """</span>
|
|
<span class="k">if</span> <span class="n">key</span> <span class="ow">is</span> <span class="ow">not</span> <span class="kc">None</span><span class="p">:</span>
|
|
<span class="nb">super</span><span class="p">()</span><span class="o">.</span><span class="fm">__setitem__</span><span class="p">(</span><span class="n">key</span><span class="p">,</span> <span class="n">value</span><span class="p">)</span>
|
|
|
|
<span class="k">def</span> <span class="fm">__contains__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">key</span><span class="p">):</span>
|
|
<span class="w"> </span><span class="sd">"""</span>
|
|
<span class="sd"> None-keys are not accepted.</span>
|
|
|
|
<span class="sd"> """</span>
|
|
<span class="k">return</span> <span class="kc">False</span> <span class="k">if</span> <span class="n">key</span> <span class="ow">is</span> <span class="kc">None</span> <span class="k">else</span> <span class="nb">super</span><span class="p">()</span><span class="o">.</span><span class="fm">__contains__</span><span class="p">(</span><span class="n">key</span><span class="p">)</span>
|
|
|
|
<div class="viewcode-block" id="SessionHandler.get_sessions"><a class="viewcode-back" href="../../../api/evennia.server.sessionhandler.html#evennia.server.sessionhandler.SessionHandler.get_sessions">[docs]</a> <span class="k">def</span> <span class="nf">get_sessions</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">include_unloggedin</span><span class="o">=</span><span class="kc">False</span><span class="p">):</span>
|
|
<span class="w"> </span><span class="sd">"""</span>
|
|
<span class="sd"> Returns the connected session objects.</span>
|
|
|
|
<span class="sd"> Args:</span>
|
|
<span class="sd"> include_unloggedin (bool, optional): Also list Sessions</span>
|
|
<span class="sd"> that have not yet authenticated.</span>
|
|
|
|
<span class="sd"> Returns:</span>
|
|
<span class="sd"> sessions (list): A list of `Session` objects.</span>
|
|
|
|
<span class="sd"> """</span>
|
|
<span class="k">if</span> <span class="n">include_unloggedin</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">values</span><span class="p">())</span>
|
|
<span class="k">else</span><span class="p">:</span>
|
|
<span class="k">return</span> <span class="p">[</span><span class="n">session</span> <span class="k">for</span> <span class="n">session</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">values</span><span class="p">()</span> <span class="k">if</span> <span class="n">session</span><span class="o">.</span><span class="n">logged_in</span><span class="p">]</span></div>
|
|
|
|
<div class="viewcode-block" id="SessionHandler.get_all_sync_data"><a class="viewcode-back" href="../../../api/evennia.server.sessionhandler.html#evennia.server.sessionhandler.SessionHandler.get_all_sync_data">[docs]</a> <span class="k">def</span> <span class="nf">get_all_sync_data</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
|
|
<span class="w"> </span><span class="sd">"""</span>
|
|
<span class="sd"> Create a dictionary of sessdata dicts representing all</span>
|
|
<span class="sd"> sessions in store.</span>
|
|
|
|
<span class="sd"> Returns:</span>
|
|
<span class="sd"> syncdata (dict): A dict of sync data.</span>
|
|
|
|
<span class="sd"> """</span>
|
|
<span class="k">return</span> <span class="nb">dict</span><span class="p">((</span><span class="n">sessid</span><span class="p">,</span> <span class="n">sess</span><span class="o">.</span><span class="n">get_sync_data</span><span class="p">())</span> <span class="k">for</span> <span class="n">sessid</span><span class="p">,</span> <span class="n">sess</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">items</span><span class="p">())</span></div>
|
|
|
|
<div class="viewcode-block" id="SessionHandler.clean_senddata"><a class="viewcode-back" href="../../../api/evennia.server.sessionhandler.html#evennia.server.sessionhandler.SessionHandler.clean_senddata">[docs]</a> <span class="k">def</span> <span class="nf">clean_senddata</span><span class="p">(</span><span class="bp">self</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="w"> </span><span class="sd">"""</span>
|
|
<span class="sd"> Clean up data for sending across the AMP wire. Also apply the</span>
|
|
<span class="sd"> FuncParser using callables from `settings.FUNCPARSER_OUTGOING_MESSAGES_MODULES`.</span>
|
|
|
|
<span class="sd"> Args:</span>
|
|
<span class="sd"> session (Session): The relevant session instance.</span>
|
|
<span class="sd"> kwargs (dict) Each keyword represents a send-instruction, with the keyword itself being</span>
|
|
<span class="sd"> the name of the instruction (like "text"). Suitable values for each keyword are:</span>
|
|
<span class="sd"> - arg -> [[arg], {}]</span>
|
|
<span class="sd"> - [args] -> [[args], {}]</span>
|
|
<span class="sd"> - {kwargs} -> [[], {kwargs}]</span>
|
|
<span class="sd"> - [args, {kwargs}] -> [[arg], {kwargs}]</span>
|
|
<span class="sd"> - [[args], {kwargs}] -> [[args], {kwargs}]</span>
|
|
|
|
<span class="sd"> Returns:</span>
|
|
<span class="sd"> kwargs (dict): A cleaned dictionary of cmdname:[[args],{kwargs}] pairs,</span>
|
|
<span class="sd"> where the keys, args and kwargs have all been converted to</span>
|
|
<span class="sd"> send-safe entities (strings or numbers), and funcparser parsing has been</span>
|
|
<span class="sd"> applied.</span>
|
|
|
|
<span class="sd"> """</span>
|
|
<span class="k">global</span> <span class="n">_FUNCPARSER</span>
|
|
<span class="k">if</span> <span class="ow">not</span> <span class="n">_FUNCPARSER</span><span class="p">:</span>
|
|
<span class="kn">from</span> <span class="nn">evennia.utils.funcparser</span> <span class="kn">import</span> <span class="n">FuncParser</span>
|
|
|
|
<span class="n">_FUNCPARSER</span> <span class="o">=</span> <span class="n">FuncParser</span><span class="p">(</span>
|
|
<span class="n">settings</span><span class="o">.</span><span class="n">FUNCPARSER_OUTGOING_MESSAGES_MODULES</span><span class="p">,</span> <span class="n">raise_errors</span><span class="o">=</span><span class="kc">True</span>
|
|
<span class="p">)</span>
|
|
|
|
<span class="n">options</span> <span class="o">=</span> <span class="n">kwargs</span><span class="o">.</span><span class="n">pop</span><span class="p">(</span><span class="s2">"options"</span><span class="p">,</span> <span class="kc">None</span><span class="p">)</span> <span class="ow">or</span> <span class="p">{}</span>
|
|
<span class="n">raw</span> <span class="o">=</span> <span class="n">options</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s2">"raw"</span><span class="p">,</span> <span class="kc">False</span><span class="p">)</span>
|
|
<span class="n">strip_inlinefunc</span> <span class="o">=</span> <span class="n">options</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s2">"strip_inlinefunc"</span><span class="p">,</span> <span class="kc">False</span><span class="p">)</span>
|
|
|
|
<span class="k">def</span> <span class="nf">_utf8</span><span class="p">(</span><span class="n">data</span><span class="p">):</span>
|
|
<span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">data</span><span class="p">,</span> <span class="nb">bytes</span><span class="p">):</span>
|
|
<span class="k">try</span><span class="p">:</span>
|
|
<span class="n">data</span> <span class="o">=</span> <span class="n">codecs_decode</span><span class="p">(</span><span class="n">data</span><span class="p">,</span> <span class="n">session</span><span class="o">.</span><span class="n">protocol_flags</span><span class="p">[</span><span class="s2">"ENCODING"</span><span class="p">])</span>
|
|
<span class="k">except</span> <span class="ne">LookupError</span><span class="p">:</span>
|
|
<span class="c1"># wrong encoding set on the session. Set it to a safe one</span>
|
|
<span class="n">session</span><span class="o">.</span><span class="n">protocol_flags</span><span class="p">[</span><span class="s2">"ENCODING"</span><span class="p">]</span> <span class="o">=</span> <span class="s2">"utf-8"</span>
|
|
<span class="n">data</span> <span class="o">=</span> <span class="n">codecs_decode</span><span class="p">(</span><span class="n">data</span><span class="p">,</span> <span class="s2">"utf-8"</span><span class="p">)</span>
|
|
<span class="k">except</span> <span class="ne">UnicodeDecodeError</span><span class="p">:</span>
|
|
<span class="c1"># incorrect unicode sequence</span>
|
|
<span class="n">session</span><span class="o">.</span><span class="n">sendLine</span><span class="p">(</span><span class="n">_ERR_BAD_UTF8</span><span class="p">)</span>
|
|
<span class="n">data</span> <span class="o">=</span> <span class="s2">""</span>
|
|
|
|
<span class="k">return</span> <span class="n">data</span>
|
|
|
|
<span class="k">def</span> <span class="nf">_validate</span><span class="p">(</span><span class="n">data</span><span class="p">):</span>
|
|
<span class="w"> </span><span class="sd">"""</span>
|
|
<span class="sd"> Helper function to convert data to AMP-safe (picketable) values"</span>
|
|
|
|
<span class="sd"> """</span>
|
|
<span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">data</span><span class="p">,</span> <span class="nb">dict</span><span class="p">):</span>
|
|
<span class="n">newdict</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">part</span> <span class="ow">in</span> <span class="n">data</span><span class="o">.</span><span class="n">items</span><span class="p">():</span>
|
|
<span class="n">newdict</span><span class="p">[</span><span class="n">key</span><span class="p">]</span> <span class="o">=</span> <span class="n">_validate</span><span class="p">(</span><span class="n">part</span><span class="p">)</span>
|
|
<span class="k">return</span> <span class="n">newdict</span>
|
|
<span class="k">elif</span> <span class="n">is_iter</span><span class="p">(</span><span class="n">data</span><span class="p">):</span>
|
|
<span class="k">return</span> <span class="p">[</span><span class="n">_validate</span><span class="p">(</span><span class="n">part</span><span class="p">)</span> <span class="k">for</span> <span class="n">part</span> <span class="ow">in</span> <span class="n">data</span><span class="p">]</span>
|
|
<span class="k">elif</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">data</span><span class="p">,</span> <span class="p">(</span><span class="nb">str</span><span class="p">,</span> <span class="nb">bytes</span><span class="p">)):</span>
|
|
<span class="n">data</span> <span class="o">=</span> <span class="n">_utf8</span><span class="p">(</span><span class="n">data</span><span class="p">)</span>
|
|
|
|
<span class="k">if</span> <span class="p">(</span>
|
|
<span class="n">_FUNCPARSER_PARSE_OUTGOING_MESSAGES_ENABLED</span>
|
|
<span class="ow">and</span> <span class="ow">not</span> <span class="n">raw</span>
|
|
<span class="ow">and</span> <span class="nb">isinstance</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">ServerSessionHandler</span><span class="p">)</span>
|
|
<span class="p">):</span>
|
|
<span class="c1"># only apply funcparser on the outgoing path (sessionhandler->)</span>
|
|
<span class="c1"># data = parse_inlinefunc(data, strip=strip_inlinefunc, session=session)</span>
|
|
<span class="n">data</span> <span class="o">=</span> <span class="n">_FUNCPARSER</span><span class="o">.</span><span class="n">parse</span><span class="p">(</span><span class="n">data</span><span class="p">,</span> <span class="n">strip</span><span class="o">=</span><span class="n">strip_inlinefunc</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="k">return</span> <span class="nb">str</span><span class="p">(</span><span class="n">data</span><span class="p">)</span>
|
|
<span class="k">elif</span> <span class="p">(</span>
|
|
<span class="nb">hasattr</span><span class="p">(</span><span class="n">data</span><span class="p">,</span> <span class="s2">"id"</span><span class="p">)</span>
|
|
<span class="ow">and</span> <span class="nb">hasattr</span><span class="p">(</span><span class="n">data</span><span class="p">,</span> <span class="s2">"db_date_created"</span><span class="p">)</span>
|
|
<span class="ow">and</span> <span class="nb">hasattr</span><span class="p">(</span><span class="n">data</span><span class="p">,</span> <span class="s2">"__dbclass__"</span><span class="p">)</span>
|
|
<span class="p">):</span>
|
|
<span class="c1"># convert database-object to their string representation.</span>
|
|
<span class="k">return</span> <span class="n">_validate</span><span class="p">(</span><span class="nb">str</span><span class="p">(</span><span class="n">data</span><span class="p">))</span>
|
|
<span class="k">else</span><span class="p">:</span>
|
|
<span class="k">return</span> <span class="n">data</span>
|
|
|
|
<span class="n">rkwargs</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">data</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">_validate</span><span class="p">(</span><span class="n">key</span><span class="p">)</span>
|
|
<span class="k">if</span> <span class="ow">not</span> <span class="n">data</span><span class="p">:</span>
|
|
<span class="k">if</span> <span class="n">key</span> <span class="o">==</span> <span class="s2">"text"</span><span class="p">:</span>
|
|
<span class="c1"># we don't allow sending text = None, this must mean</span>
|
|
<span class="c1"># that the text command is not to be used.</span>
|
|
<span class="k">continue</span>
|
|
<span class="n">rkwargs</span><span class="p">[</span><span class="n">key</span><span class="p">]</span> <span class="o">=</span> <span class="p">[[],</span> <span class="p">{}]</span>
|
|
<span class="k">elif</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">data</span><span class="p">,</span> <span class="nb">dict</span><span class="p">):</span>
|
|
<span class="n">rkwargs</span><span class="p">[</span><span class="n">key</span><span class="p">]</span> <span class="o">=</span> <span class="p">[[],</span> <span class="n">_validate</span><span class="p">(</span><span class="n">data</span><span class="p">)]</span>
|
|
<span class="k">elif</span> <span class="n">is_iter</span><span class="p">(</span><span class="n">data</span><span class="p">):</span>
|
|
<span class="n">data</span> <span class="o">=</span> <span class="nb">tuple</span><span class="p">(</span><span class="n">data</span><span class="p">)</span>
|
|
<span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">data</span><span class="p">[</span><span class="o">-</span><span class="mi">1</span><span class="p">],</span> <span class="nb">dict</span><span class="p">):</span>
|
|
<span class="k">if</span> <span class="nb">len</span><span class="p">(</span><span class="n">data</span><span class="p">)</span> <span class="o">==</span> <span class="mi">2</span><span class="p">:</span>
|
|
<span class="k">if</span> <span class="n">is_iter</span><span class="p">(</span><span class="n">data</span><span class="p">[</span><span class="mi">0</span><span class="p">]):</span>
|
|
<span class="n">rkwargs</span><span class="p">[</span><span class="n">key</span><span class="p">]</span> <span class="o">=</span> <span class="p">[</span><span class="n">_validate</span><span class="p">(</span><span class="n">data</span><span class="p">[</span><span class="mi">0</span><span class="p">]),</span> <span class="n">_validate</span><span class="p">(</span><span class="n">data</span><span class="p">[</span><span class="mi">1</span><span class="p">])]</span>
|
|
<span class="k">else</span><span class="p">:</span>
|
|
<span class="n">rkwargs</span><span class="p">[</span><span class="n">key</span><span class="p">]</span> <span class="o">=</span> <span class="p">[[</span><span class="n">_validate</span><span class="p">(</span><span class="n">data</span><span class="p">[</span><span class="mi">0</span><span class="p">])],</span> <span class="n">_validate</span><span class="p">(</span><span class="n">data</span><span class="p">[</span><span class="mi">1</span><span class="p">])]</span>
|
|
<span class="k">else</span><span class="p">:</span>
|
|
<span class="n">rkwargs</span><span class="p">[</span><span class="n">key</span><span class="p">]</span> <span class="o">=</span> <span class="p">[</span><span class="n">_validate</span><span class="p">(</span><span class="n">data</span><span class="p">[:</span><span class="o">-</span><span class="mi">1</span><span class="p">]),</span> <span class="n">_validate</span><span class="p">(</span><span class="n">data</span><span class="p">[</span><span class="o">-</span><span class="mi">1</span><span class="p">])]</span>
|
|
<span class="k">else</span><span class="p">:</span>
|
|
<span class="n">rkwargs</span><span class="p">[</span><span class="n">key</span><span class="p">]</span> <span class="o">=</span> <span class="p">[</span><span class="n">_validate</span><span class="p">(</span><span class="n">data</span><span class="p">),</span> <span class="p">{}]</span>
|
|
<span class="k">else</span><span class="p">:</span>
|
|
<span class="n">rkwargs</span><span class="p">[</span><span class="n">key</span><span class="p">]</span> <span class="o">=</span> <span class="p">[[</span><span class="n">_validate</span><span class="p">(</span><span class="n">data</span><span class="p">)],</span> <span class="p">{}]</span>
|
|
<span class="n">rkwargs</span><span class="p">[</span><span class="n">key</span><span class="p">][</span><span class="mi">1</span><span class="p">][</span><span class="s2">"options"</span><span class="p">]</span> <span class="o">=</span> <span class="nb">dict</span><span class="p">(</span><span class="n">options</span><span class="p">)</span>
|
|
<span class="c1"># make sure that any "prompt" message will be processed last</span>
|
|
<span class="c1"># by moving it to the end</span>
|
|
<span class="k">if</span> <span class="s2">"prompt"</span> <span class="ow">in</span> <span class="n">rkwargs</span><span class="p">:</span>
|
|
<span class="n">prompt</span> <span class="o">=</span> <span class="n">rkwargs</span><span class="o">.</span><span class="n">pop</span><span class="p">(</span><span class="s2">"prompt"</span><span class="p">)</span>
|
|
<span class="n">rkwargs</span><span class="p">[</span><span class="s2">"prompt"</span><span class="p">]</span> <span class="o">=</span> <span class="n">prompt</span>
|
|
<span class="k">return</span> <span class="n">rkwargs</span></div></div>
|
|
|
|
|
|
<span class="c1"># ------------------------------------------------------------</span>
|
|
<span class="c1"># Server-SessionHandler class</span>
|
|
<span class="c1"># ------------------------------------------------------------</span>
|
|
|
|
|
|
<div class="viewcode-block" id="ServerSessionHandler"><a class="viewcode-back" href="../../../api/evennia.server.sessionhandler.html#evennia.server.sessionhandler.ServerSessionHandler">[docs]</a><span class="k">class</span> <span class="nc">ServerSessionHandler</span><span class="p">(</span><span class="n">SessionHandler</span><span class="p">):</span>
|
|
<span class="w"> </span><span class="sd">"""</span>
|
|
<span class="sd"> This object holds the stack of sessions active in the game at any time.</span>
|
|
|
|
<span class="sd"> A session register with the handler in two steps, first by registering itself with the connect()</span>
|
|
<span class="sd"> method. This indicates an non-authenticated session. Whenever the session is authenticated the</span>
|
|
<span class="sd"> session together with the related account is sent to the login() method.</span>
|
|
|
|
<span class="sd"> """</span>
|
|
|
|
<span class="c1"># AMP communication methods</span>
|
|
|
|
<div class="viewcode-block" id="ServerSessionHandler.__init__"><a class="viewcode-back" href="../../../api/evennia.server.sessionhandler.html#evennia.server.sessionhandler.ServerSessionHandler.__init__">[docs]</a> <span class="k">def</span> <span class="fm">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="o">*</span><span class="n">args</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">):</span>
|
|
<span class="w"> </span><span class="sd">"""</span>
|
|
<span class="sd"> Init the handler.</span>
|
|
|
|
<span class="sd"> """</span>
|
|
<span class="nb">super</span><span class="p">()</span><span class="o">.</span><span class="fm">__init__</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="bp">self</span><span class="o">.</span><span class="n">server</span> <span class="o">=</span> <span class="kc">None</span> <span class="c1"># set at server initialization</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">server_data</span> <span class="o">=</span> <span class="p">{</span><span class="s2">"servername"</span><span class="p">:</span> <span class="n">_SERVERNAME</span><span class="p">}</span>
|
|
<span class="c1"># will be set on psync</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">portal_start_time</span> <span class="o">=</span> <span class="mf">0.0</span></div>
|
|
|
|
<span class="k">def</span> <span class="nf">_run_cmd_login</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">session</span><span class="p">):</span>
|
|
<span class="w"> </span><span class="sd">"""</span>
|
|
<span class="sd"> Launch the CMD_LOGINSTART command. This is wrapped</span>
|
|
<span class="sd"> for delays.</span>
|
|
|
|
<span class="sd"> """</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="p">:</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">data_in</span><span class="p">(</span><span class="n">session</span><span class="p">,</span> <span class="n">text</span><span class="o">=</span><span class="p">[[</span><span class="n">CMD_LOGINSTART</span><span class="p">],</span> <span class="p">{}])</span>
|
|
|
|
<div class="viewcode-block" id="ServerSessionHandler.portal_connect"><a class="viewcode-back" href="../../../api/evennia.server.sessionhandler.html#evennia.server.sessionhandler.ServerSessionHandler.portal_connect">[docs]</a> <span class="k">def</span> <span class="nf">portal_connect</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">portalsessiondata</span><span class="p">):</span>
|
|
<span class="w"> </span><span class="sd">"""</span>
|
|
<span class="sd"> Called by Portal when a new session has connected.</span>
|
|
<span class="sd"> Creates a new, unlogged-in game session.</span>
|
|
|
|
<span class="sd"> Args:</span>
|
|
<span class="sd"> portalsessiondata (dict): a dictionary of all property:value</span>
|
|
<span class="sd"> keys defining the session and which is marked to be</span>
|
|
<span class="sd"> synced.</span>
|
|
|
|
<span class="sd"> """</span>
|
|
<span class="n">delayed_import</span><span class="p">()</span>
|
|
<span class="k">global</span> <span class="n">_ServerSession</span><span class="p">,</span> <span class="n">_AccountDB</span><span class="p">,</span> <span class="n">_ScriptDB</span>
|
|
|
|
<span class="n">sess</span> <span class="o">=</span> <span class="n">_ServerSession</span><span class="p">()</span>
|
|
<span class="n">sess</span><span class="o">.</span><span class="n">sessionhandler</span> <span class="o">=</span> <span class="bp">self</span>
|
|
<span class="n">sess</span><span class="o">.</span><span class="n">load_sync_data</span><span class="p">(</span><span class="n">portalsessiondata</span><span class="p">)</span>
|
|
<span class="n">sess</span><span class="o">.</span><span class="n">at_sync</span><span class="p">()</span>
|
|
<span class="c1"># validate all scripts</span>
|
|
<span class="c1"># _ScriptDB.objects.validate()</span>
|
|
<span class="bp">self</span><span class="p">[</span><span class="n">sess</span><span class="o">.</span><span class="n">sessid</span><span class="p">]</span> <span class="o">=</span> <span class="n">sess</span>
|
|
|
|
<span class="k">if</span> <span class="n">sess</span><span class="o">.</span><span class="n">logged_in</span> <span class="ow">and</span> <span class="n">sess</span><span class="o">.</span><span class="n">uid</span><span class="p">:</span>
|
|
<span class="c1"># Session is already logged in. This can happen in the</span>
|
|
<span class="c1"># case of auto-authenticating protocols like SSH or</span>
|
|
<span class="c1"># webclient's session sharing</span>
|
|
<span class="n">account</span> <span class="o">=</span> <span class="n">_AccountDB</span><span class="o">.</span><span class="n">objects</span><span class="o">.</span><span class="n">get_account_from_uid</span><span class="p">(</span><span class="n">sess</span><span class="o">.</span><span class="n">uid</span><span class="p">)</span>
|
|
<span class="k">if</span> <span class="n">account</span><span class="p">:</span>
|
|
<span class="c1"># this will set account.is_connected too</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">login</span><span class="p">(</span><span class="n">sess</span><span class="p">,</span> <span class="n">account</span><span class="p">,</span> <span class="n">force</span><span class="o">=</span><span class="kc">True</span><span class="p">)</span>
|
|
<span class="k">return</span>
|
|
<span class="k">else</span><span class="p">:</span>
|
|
<span class="n">sess</span><span class="o">.</span><span class="n">logged_in</span> <span class="o">=</span> <span class="kc">False</span>
|
|
<span class="n">sess</span><span class="o">.</span><span class="n">uid</span> <span class="o">=</span> <span class="kc">None</span>
|
|
|
|
<span class="c1"># show the first login command, may delay slightly to allow</span>
|
|
<span class="c1"># the handshakes to finish.</span>
|
|
<span class="n">delay</span><span class="p">(</span><span class="n">_DELAY_CMD_LOGINSTART</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">_run_cmd_login</span><span class="p">,</span> <span class="n">sess</span><span class="p">)</span></div>
|
|
|
|
<div class="viewcode-block" id="ServerSessionHandler.portal_session_sync"><a class="viewcode-back" href="../../../api/evennia.server.sessionhandler.html#evennia.server.sessionhandler.ServerSessionHandler.portal_session_sync">[docs]</a> <span class="k">def</span> <span class="nf">portal_session_sync</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">portalsessiondata</span><span class="p">):</span>
|
|
<span class="w"> </span><span class="sd">"""</span>
|
|
<span class="sd"> Called by Portal when it wants to update a single session (e.g.</span>
|
|
<span class="sd"> because of all negotiation protocols have finally replied)</span>
|
|
|
|
<span class="sd"> Args:</span>
|
|
<span class="sd"> portalsessiondata (dict): a dictionary of all property:value</span>
|
|
<span class="sd"> keys defining the session and which is marked to be</span>
|
|
<span class="sd"> synced.</span>
|
|
|
|
<span class="sd"> """</span>
|
|
<span class="n">sessid</span> <span class="o">=</span> <span class="n">portalsessiondata</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s2">"sessid"</span><span class="p">)</span>
|
|
<span class="n">session</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="n">sessid</span><span class="p">)</span>
|
|
<span class="k">if</span> <span class="n">session</span><span class="p">:</span>
|
|
<span class="c1"># since some of the session properties may have had</span>
|
|
<span class="c1"># a chance to change already before the portal gets here</span>
|
|
<span class="c1"># the portal doesn't send all sessiondata but only</span>
|
|
<span class="c1"># ones which should only be changed from portal (like</span>
|
|
<span class="c1"># protocol_flags etc)</span>
|
|
<span class="n">session</span><span class="o">.</span><span class="n">load_sync_data</span><span class="p">(</span><span class="n">portalsessiondata</span><span class="p">)</span></div>
|
|
|
|
<div class="viewcode-block" id="ServerSessionHandler.portal_sessions_sync"><a class="viewcode-back" href="../../../api/evennia.server.sessionhandler.html#evennia.server.sessionhandler.ServerSessionHandler.portal_sessions_sync">[docs]</a> <span class="k">def</span> <span class="nf">portal_sessions_sync</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">portalsessionsdata</span><span class="p">):</span>
|
|
<span class="w"> </span><span class="sd">"""</span>
|
|
<span class="sd"> Syncing all session ids of the portal with the ones of the</span>
|
|
<span class="sd"> server. This is instantiated by the portal when reconnecting.</span>
|
|
|
|
<span class="sd"> Args:</span>
|
|
<span class="sd"> portalsessionsdata (dict): A dictionary</span>
|
|
<span class="sd"> `{sessid: {property:value},...}` defining each session and</span>
|
|
<span class="sd"> the properties in it which should be synced.</span>
|
|
|
|
<span class="sd"> """</span>
|
|
<span class="n">delayed_import</span><span class="p">()</span>
|
|
<span class="k">global</span> <span class="n">_ServerSession</span><span class="p">,</span> <span class="n">_AccountDB</span><span class="p">,</span> <span class="n">_ServerConfig</span><span class="p">,</span> <span class="n">_ScriptDB</span>
|
|
|
|
<span class="k">for</span> <span class="n">sess</span> <span class="ow">in</span> <span class="nb">list</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">values</span><span class="p">()):</span>
|
|
<span class="c1"># we delete the old session to make sure to catch eventual</span>
|
|
<span class="c1"># lingering references.</span>
|
|
<span class="k">del</span> <span class="n">sess</span>
|
|
|
|
<span class="k">for</span> <span class="n">sessid</span><span class="p">,</span> <span class="n">sessdict</span> <span class="ow">in</span> <span class="n">portalsessionsdata</span><span class="o">.</span><span class="n">items</span><span class="p">():</span>
|
|
<span class="n">sess</span> <span class="o">=</span> <span class="n">_ServerSession</span><span class="p">()</span>
|
|
<span class="n">sess</span><span class="o">.</span><span class="n">sessionhandler</span> <span class="o">=</span> <span class="bp">self</span>
|
|
<span class="n">sess</span><span class="o">.</span><span class="n">load_sync_data</span><span class="p">(</span><span class="n">sessdict</span><span class="p">)</span>
|
|
<span class="k">if</span> <span class="n">sess</span><span class="o">.</span><span class="n">uid</span><span class="p">:</span>
|
|
<span class="n">sess</span><span class="o">.</span><span class="n">account</span> <span class="o">=</span> <span class="n">_AccountDB</span><span class="o">.</span><span class="n">objects</span><span class="o">.</span><span class="n">get_account_from_uid</span><span class="p">(</span><span class="n">sess</span><span class="o">.</span><span class="n">uid</span><span class="p">)</span>
|
|
<span class="bp">self</span><span class="p">[</span><span class="n">sessid</span><span class="p">]</span> <span class="o">=</span> <span class="n">sess</span>
|
|
<span class="n">sess</span><span class="o">.</span><span class="n">at_sync</span><span class="p">()</span>
|
|
|
|
<span class="n">mode</span> <span class="o">=</span> <span class="s2">"reload"</span>
|
|
|
|
<span class="c1"># tell the server hook we synced</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">server</span><span class="o">.</span><span class="n">at_post_portal_sync</span><span class="p">(</span><span class="n">mode</span><span class="p">)</span>
|
|
<span class="c1"># announce the reconnection</span>
|
|
<span class="k">if</span> <span class="n">_BROADCAST_SERVER_RESTART_MESSAGES</span><span class="p">:</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">announce_all</span><span class="p">(</span><span class="n">_</span><span class="p">(</span><span class="s2">" ... Server restarted."</span><span class="p">))</span></div>
|
|
|
|
<div class="viewcode-block" id="ServerSessionHandler.portal_disconnect"><a class="viewcode-back" href="../../../api/evennia.server.sessionhandler.html#evennia.server.sessionhandler.ServerSessionHandler.portal_disconnect">[docs]</a> <span class="k">def</span> <span class="nf">portal_disconnect</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">session</span><span class="p">):</span>
|
|
<span class="w"> </span><span class="sd">"""</span>
|
|
<span class="sd"> Called from Portal when Portal session closed from the portal</span>
|
|
<span class="sd"> side. There is no message to report in this case.</span>
|
|
|
|
<span class="sd"> Args:</span>
|
|
<span class="sd"> session (Session): The Session to disconnect</span>
|
|
|
|
<span class="sd"> """</span>
|
|
<span class="c1"># disconnect us without calling Portal since</span>
|
|
<span class="c1"># Portal already knows.</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">disconnect</span><span class="p">(</span><span class="n">session</span><span class="p">,</span> <span class="n">reason</span><span class="o">=</span><span class="s2">""</span><span class="p">,</span> <span class="n">sync_portal</span><span class="o">=</span><span class="kc">False</span><span class="p">)</span></div>
|
|
|
|
<div class="viewcode-block" id="ServerSessionHandler.portal_disconnect_all"><a class="viewcode-back" href="../../../api/evennia.server.sessionhandler.html#evennia.server.sessionhandler.ServerSessionHandler.portal_disconnect_all">[docs]</a> <span class="k">def</span> <span class="nf">portal_disconnect_all</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
|
|
<span class="w"> </span><span class="sd">"""</span>
|
|
<span class="sd"> Called from Portal when Portal is closing down. All</span>
|
|
<span class="sd"> Sessions should die. The Portal should not be informed.</span>
|
|
|
|
<span class="sd"> """</span>
|
|
<span class="c1"># set a watchdog to avoid self.disconnect from deleting</span>
|
|
<span class="c1"># the session while we are looping over them</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">_disconnect_all</span> <span class="o">=</span> <span class="kc">True</span>
|
|
<span class="k">for</span> <span class="n">session</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">values</span><span class="p">():</span>
|
|
<span class="n">session</span><span class="o">.</span><span class="n">disconnect</span><span class="p">()</span>
|
|
<span class="k">del</span> <span class="bp">self</span><span class="o">.</span><span class="n">_disconnect_all</span></div>
|
|
|
|
<span class="c1"># server-side access methods</span>
|
|
|
|
<div class="viewcode-block" id="ServerSessionHandler.start_bot_session"><a class="viewcode-back" href="../../../api/evennia.server.sessionhandler.html#evennia.server.sessionhandler.ServerSessionHandler.start_bot_session">[docs]</a> <span class="k">def</span> <span class="nf">start_bot_session</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">protocol_path</span><span class="p">,</span> <span class="n">configdict</span><span class="p">):</span>
|
|
<span class="w"> </span><span class="sd">"""</span>
|
|
<span class="sd"> This method allows the server-side to force the Portal to</span>
|
|
<span class="sd"> create a new bot session.</span>
|
|
|
|
<span class="sd"> Args:</span>
|
|
<span class="sd"> protocol_path (str): The full python path to the bot's</span>
|
|
<span class="sd"> class.</span>
|
|
<span class="sd"> configdict (dict): This dict will be used to configure</span>
|
|
<span class="sd"> the bot (this depends on the bot protocol).</span>
|
|
|
|
<span class="sd"> Examples:</span>
|
|
<span class="sd"> start_bot_session("evennia.server.portal.irc.IRCClient",</span>
|
|
<span class="sd"> {"uid":1, "botname":"evbot", "channel":"#evennia",</span>
|
|
<span class="sd"> "network:"irc.freenode.net", "port": 6667})</span>
|
|
|
|
<span class="sd"> Notes:</span>
|
|
<span class="sd"> The new session will use the supplied account-bot uid to</span>
|
|
<span class="sd"> initiate an already logged-in connection. The Portal will</span>
|
|
<span class="sd"> treat this as a normal connection and henceforth so will</span>
|
|
<span class="sd"> the Server.</span>
|
|
|
|
<span class="sd"> """</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">server</span><span class="o">.</span><span class="n">amp_protocol</span><span class="o">.</span><span class="n">send_AdminServer2Portal</span><span class="p">(</span>
|
|
<span class="n">DUMMYSESSION</span><span class="p">,</span> <span class="n">operation</span><span class="o">=</span><span class="n">amp</span><span class="o">.</span><span class="n">SCONN</span><span class="p">,</span> <span class="n">protocol_path</span><span class="o">=</span><span class="n">protocol_path</span><span class="p">,</span> <span class="n">config</span><span class="o">=</span><span class="n">configdict</span>
|
|
<span class="p">)</span></div>
|
|
|
|
<div class="viewcode-block" id="ServerSessionHandler.portal_restart_server"><a class="viewcode-back" href="../../../api/evennia.server.sessionhandler.html#evennia.server.sessionhandler.ServerSessionHandler.portal_restart_server">[docs]</a> <span class="k">def</span> <span class="nf">portal_restart_server</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
|
|
<span class="w"> </span><span class="sd">"""</span>
|
|
<span class="sd"> Called by server when reloading. We tell the portal to start a new server instance.</span>
|
|
|
|
<span class="sd"> """</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">server</span><span class="o">.</span><span class="n">amp_protocol</span><span class="o">.</span><span class="n">send_AdminServer2Portal</span><span class="p">(</span><span class="n">DUMMYSESSION</span><span class="p">,</span> <span class="n">operation</span><span class="o">=</span><span class="n">amp</span><span class="o">.</span><span class="n">SRELOAD</span><span class="p">)</span></div>
|
|
|
|
<div class="viewcode-block" id="ServerSessionHandler.portal_reset_server"><a class="viewcode-back" href="../../../api/evennia.server.sessionhandler.html#evennia.server.sessionhandler.ServerSessionHandler.portal_reset_server">[docs]</a> <span class="k">def</span> <span class="nf">portal_reset_server</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
|
|
<span class="w"> </span><span class="sd">"""</span>
|
|
<span class="sd"> Called by server when reloading. We tell the portal to start a new server instance.</span>
|
|
|
|
<span class="sd"> """</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">server</span><span class="o">.</span><span class="n">amp_protocol</span><span class="o">.</span><span class="n">send_AdminServer2Portal</span><span class="p">(</span><span class="n">DUMMYSESSION</span><span class="p">,</span> <span class="n">operation</span><span class="o">=</span><span class="n">amp</span><span class="o">.</span><span class="n">SRESET</span><span class="p">)</span></div>
|
|
|
|
<div class="viewcode-block" id="ServerSessionHandler.portal_shutdown"><a class="viewcode-back" href="../../../api/evennia.server.sessionhandler.html#evennia.server.sessionhandler.ServerSessionHandler.portal_shutdown">[docs]</a> <span class="k">def</span> <span class="nf">portal_shutdown</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
|
|
<span class="w"> </span><span class="sd">"""</span>
|
|
<span class="sd"> Called by server when it's time to shut down (the portal will shut us down and then shut</span>
|
|
<span class="sd"> itself down)</span>
|
|
|
|
<span class="sd"> """</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">server</span><span class="o">.</span><span class="n">amp_protocol</span><span class="o">.</span><span class="n">send_AdminServer2Portal</span><span class="p">(</span><span class="n">DUMMYSESSION</span><span class="p">,</span> <span class="n">operation</span><span class="o">=</span><span class="n">amp</span><span class="o">.</span><span class="n">PSHUTD</span><span class="p">)</span></div>
|
|
|
|
<div class="viewcode-block" id="ServerSessionHandler.login"><a class="viewcode-back" href="../../../api/evennia.server.sessionhandler.html#evennia.server.sessionhandler.ServerSessionHandler.login">[docs]</a> <span class="k">def</span> <span class="nf">login</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">session</span><span class="p">,</span> <span class="n">account</span><span class="p">,</span> <span class="n">force</span><span class="o">=</span><span class="kc">False</span><span class="p">,</span> <span class="n">testmode</span><span class="o">=</span><span class="kc">False</span><span class="p">):</span>
|
|
<span class="w"> </span><span class="sd">"""</span>
|
|
<span class="sd"> Log in the previously unloggedin session and the account we by now should know is connected</span>
|
|
<span class="sd"> to it. After this point we assume the session to be logged in one way or another.</span>
|
|
|
|
<span class="sd"> Args:</span>
|
|
<span class="sd"> session (Session): The Session to authenticate.</span>
|
|
<span class="sd"> account (Account): The Account identified as associated with this Session.</span>
|
|
<span class="sd"> force (bool): Login also if the session thinks it's already logged in</span>
|
|
<span class="sd"> (this can happen for auto-authenticating protocols)</span>
|
|
<span class="sd"> testmode (bool, optional): This is used by unittesting for</span>
|
|
<span class="sd"> faking login without any AMP being actually active.</span>
|
|
|
|
<span class="sd"> """</span>
|
|
<span class="k">if</span> <span class="n">session</span><span class="o">.</span><span class="n">logged_in</span> <span class="ow">and</span> <span class="ow">not</span> <span class="n">force</span><span class="p">:</span>
|
|
<span class="c1"># don't log in a session that is already logged in.</span>
|
|
<span class="k">return</span>
|
|
|
|
<span class="n">account</span><span class="o">.</span><span class="n">is_connected</span> <span class="o">=</span> <span class="kc">True</span>
|
|
|
|
<span class="c1"># sets up and assigns all properties on the session</span>
|
|
<span class="n">session</span><span class="o">.</span><span class="n">at_login</span><span class="p">(</span><span class="n">account</span><span class="p">)</span>
|
|
|
|
<span class="c1"># account init</span>
|
|
<span class="n">account</span><span class="o">.</span><span class="n">at_init</span><span class="p">()</span>
|
|
|
|
<span class="c1"># Check if this is the first time the *account* logs in</span>
|
|
<span class="k">if</span> <span class="n">account</span><span class="o">.</span><span class="n">db</span><span class="o">.</span><span class="n">FIRST_LOGIN</span><span class="p">:</span>
|
|
<span class="n">account</span><span class="o">.</span><span class="n">at_first_login</span><span class="p">()</span>
|
|
<span class="k">del</span> <span class="n">account</span><span class="o">.</span><span class="n">db</span><span class="o">.</span><span class="n">FIRST_LOGIN</span>
|
|
|
|
<span class="n">account</span><span class="o">.</span><span class="n">at_pre_login</span><span class="p">()</span>
|
|
|
|
<span class="k">if</span> <span class="n">_MULTISESSION_MODE</span> <span class="o">==</span> <span class="mi">0</span><span class="p">:</span>
|
|
<span class="c1"># disconnect all previous sessions.</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">disconnect_duplicate_sessions</span><span class="p">(</span><span class="n">session</span><span class="p">)</span>
|
|
|
|
<span class="n">nsess</span> <span class="o">=</span> <span class="nb">len</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">sessions_from_account</span><span class="p">(</span><span class="n">account</span><span class="p">))</span>
|
|
<span class="n">string</span> <span class="o">=</span> <span class="s2">"Logged in: </span><span class="si">{account}</span><span class="s2"> </span><span class="si">{address}</span><span class="s2"> (</span><span class="si">{nsessions}</span><span class="s2"> session(s) total)"</span>
|
|
<span class="n">string</span> <span class="o">=</span> <span class="n">string</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">account</span><span class="o">=</span><span class="n">account</span><span class="p">,</span> <span class="n">address</span><span class="o">=</span><span class="n">session</span><span class="o">.</span><span class="n">address</span><span class="p">,</span> <span class="n">nsessions</span><span class="o">=</span><span class="n">nsess</span><span class="p">)</span>
|
|
<span class="n">session</span><span class="o">.</span><span class="n">log</span><span class="p">(</span><span class="n">string</span><span class="p">)</span>
|
|
<span class="n">session</span><span class="o">.</span><span class="n">logged_in</span> <span class="o">=</span> <span class="kc">True</span>
|
|
<span class="c1"># sync the portal to the session</span>
|
|
<span class="k">if</span> <span class="ow">not</span> <span class="n">testmode</span><span class="p">:</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">server</span><span class="o">.</span><span class="n">amp_protocol</span><span class="o">.</span><span class="n">send_AdminServer2Portal</span><span class="p">(</span>
|
|
<span class="n">session</span><span class="p">,</span> <span class="n">operation</span><span class="o">=</span><span class="n">amp</span><span class="o">.</span><span class="n">SLOGIN</span><span class="p">,</span> <span class="n">sessiondata</span><span class="o">=</span><span class="p">{</span><span class="s2">"logged_in"</span><span class="p">:</span> <span class="kc">True</span><span class="p">,</span> <span class="s2">"uid"</span><span class="p">:</span> <span class="n">session</span><span class="o">.</span><span class="n">uid</span><span class="p">}</span>
|
|
<span class="p">)</span>
|
|
<span class="n">account</span><span class="o">.</span><span class="n">at_post_login</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="k">if</span> <span class="n">nsess</span> <span class="o"><</span> <span class="mi">2</span><span class="p">:</span>
|
|
<span class="n">SIGNAL_ACCOUNT_POST_FIRST_LOGIN</span><span class="o">.</span><span class="n">send</span><span class="p">(</span><span class="n">sender</span><span class="o">=</span><span class="n">account</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">SIGNAL_ACCOUNT_POST_LOGIN</span><span class="o">.</span><span class="n">send</span><span class="p">(</span><span class="n">sender</span><span class="o">=</span><span class="n">account</span><span class="p">,</span> <span class="n">session</span><span class="o">=</span><span class="n">session</span><span class="p">)</span></div>
|
|
|
|
<div class="viewcode-block" id="ServerSessionHandler.disconnect"><a class="viewcode-back" href="../../../api/evennia.server.sessionhandler.html#evennia.server.sessionhandler.ServerSessionHandler.disconnect">[docs]</a> <span class="k">def</span> <span class="nf">disconnect</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">session</span><span class="p">,</span> <span class="n">reason</span><span class="o">=</span><span class="s2">""</span><span class="p">,</span> <span class="n">sync_portal</span><span class="o">=</span><span class="kc">True</span><span class="p">):</span>
|
|
<span class="w"> </span><span class="sd">"""</span>
|
|
<span class="sd"> Called from server side to remove session and inform portal</span>
|
|
<span class="sd"> of this fact.</span>
|
|
|
|
<span class="sd"> Args:</span>
|
|
<span class="sd"> session (Session): The Session to disconnect.</span>
|
|
<span class="sd"> reason (str, optional): A motivation for the disconnect.</span>
|
|
<span class="sd"> sync_portal (bool, optional): Sync the disconnect to</span>
|
|
<span class="sd"> Portal side. This should be done unless this was</span>
|
|
<span class="sd"> called by self.portal_disconnect().</span>
|
|
|
|
<span class="sd"> """</span>
|
|
<span class="n">session</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">get</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="k">if</span> <span class="ow">not</span> <span class="n">session</span><span class="p">:</span>
|
|
<span class="k">return</span>
|
|
|
|
<span class="k">if</span> <span class="nb">hasattr</span><span class="p">(</span><span class="n">session</span><span class="p">,</span> <span class="s2">"account"</span><span class="p">)</span> <span class="ow">and</span> <span class="n">session</span><span class="o">.</span><span class="n">account</span><span class="p">:</span>
|
|
<span class="c1"># only log accounts logging off</span>
|
|
<span class="n">nsess</span> <span class="o">=</span> <span class="nb">len</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">sessions_from_account</span><span class="p">(</span><span class="n">session</span><span class="o">.</span><span class="n">account</span><span class="p">))</span> <span class="o">-</span> <span class="mi">1</span>
|
|
<span class="n">sreason</span> <span class="o">=</span> <span class="s2">" (</span><span class="si">{}</span><span class="s2">)"</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">reason</span><span class="p">)</span> <span class="k">if</span> <span class="n">reason</span> <span class="k">else</span> <span class="s2">""</span>
|
|
<span class="n">string</span> <span class="o">=</span> <span class="s2">"Logged out: </span><span class="si">{account}</span><span class="s2"> </span><span class="si">{address}</span><span class="s2"> (</span><span class="si">{nsessions}</span><span class="s2"> sessions(s) remaining)</span><span class="si">{reason}</span><span class="s2">"</span>
|
|
<span class="n">string</span> <span class="o">=</span> <span class="n">string</span><span class="o">.</span><span class="n">format</span><span class="p">(</span>
|
|
<span class="n">reason</span><span class="o">=</span><span class="n">sreason</span><span class="p">,</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="p">,</span> <span class="n">address</span><span class="o">=</span><span class="n">session</span><span class="o">.</span><span class="n">address</span><span class="p">,</span> <span class="n">nsessions</span><span class="o">=</span><span class="n">nsess</span>
|
|
<span class="p">)</span>
|
|
<span class="n">session</span><span class="o">.</span><span class="n">log</span><span class="p">(</span><span class="n">string</span><span class="p">)</span>
|
|
|
|
<span class="k">if</span> <span class="n">nsess</span> <span class="o">==</span> <span class="mi">0</span><span class="p">:</span>
|
|
<span class="n">SIGNAL_ACCOUNT_POST_LAST_LOGOUT</span><span class="o">.</span><span class="n">send</span><span class="p">(</span><span class="n">sender</span><span class="o">=</span><span class="n">session</span><span class="o">.</span><span class="n">account</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">session</span><span class="o">.</span><span class="n">at_disconnect</span><span class="p">(</span><span class="n">reason</span><span class="p">)</span>
|
|
<span class="n">SIGNAL_ACCOUNT_POST_LOGOUT</span><span class="o">.</span><span class="n">send</span><span class="p">(</span><span class="n">sender</span><span class="o">=</span><span class="n">session</span><span class="o">.</span><span class="n">account</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">sessid</span> <span class="o">=</span> <span class="n">session</span><span class="o">.</span><span class="n">sessid</span>
|
|
<span class="k">if</span> <span class="n">sessid</span> <span class="ow">in</span> <span class="bp">self</span> <span class="ow">and</span> <span class="ow">not</span> <span class="nb">hasattr</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="s2">"_disconnect_all"</span><span class="p">):</span>
|
|
<span class="k">del</span> <span class="bp">self</span><span class="p">[</span><span class="n">sessid</span><span class="p">]</span>
|
|
<span class="k">if</span> <span class="n">sync_portal</span><span class="p">:</span>
|
|
<span class="c1"># inform portal that session should be closed.</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">server</span><span class="o">.</span><span class="n">amp_protocol</span><span class="o">.</span><span class="n">send_AdminServer2Portal</span><span class="p">(</span>
|
|
<span class="n">session</span><span class="p">,</span> <span class="n">operation</span><span class="o">=</span><span class="n">amp</span><span class="o">.</span><span class="n">SDISCONN</span><span class="p">,</span> <span class="n">reason</span><span class="o">=</span><span class="n">reason</span>
|
|
<span class="p">)</span></div>
|
|
|
|
<div class="viewcode-block" id="ServerSessionHandler.all_sessions_portal_sync"><a class="viewcode-back" href="../../../api/evennia.server.sessionhandler.html#evennia.server.sessionhandler.ServerSessionHandler.all_sessions_portal_sync">[docs]</a> <span class="k">def</span> <span class="nf">all_sessions_portal_sync</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
|
|
<span class="w"> </span><span class="sd">"""</span>
|
|
<span class="sd"> This is called by the server when it reboots. It syncs all session data</span>
|
|
<span class="sd"> to the portal. Returns a deferred!</span>
|
|
|
|
<span class="sd"> """</span>
|
|
<span class="n">sessdata</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">get_all_sync_data</span><span class="p">()</span>
|
|
<span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">server</span><span class="o">.</span><span class="n">amp_protocol</span><span class="o">.</span><span class="n">send_AdminServer2Portal</span><span class="p">(</span>
|
|
<span class="n">DUMMYSESSION</span><span class="p">,</span> <span class="n">operation</span><span class="o">=</span><span class="n">amp</span><span class="o">.</span><span class="n">SSYNC</span><span class="p">,</span> <span class="n">sessiondata</span><span class="o">=</span><span class="n">sessdata</span>
|
|
<span class="p">)</span></div>
|
|
|
|
<div class="viewcode-block" id="ServerSessionHandler.session_portal_sync"><a class="viewcode-back" href="../../../api/evennia.server.sessionhandler.html#evennia.server.sessionhandler.ServerSessionHandler.session_portal_sync">[docs]</a> <span class="k">def</span> <span class="nf">session_portal_sync</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">session</span><span class="p">):</span>
|
|
<span class="w"> </span><span class="sd">"""</span>
|
|
<span class="sd"> This is called by the server when it wants to sync a single session</span>
|
|
<span class="sd"> with the Portal for whatever reason. Returns a deferred!</span>
|
|
|
|
<span class="sd"> """</span>
|
|
<span class="n">sessdata</span> <span class="o">=</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="n">session</span><span class="o">.</span><span class="n">get_sync_data</span><span class="p">()}</span>
|
|
<span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">server</span><span class="o">.</span><span class="n">amp_protocol</span><span class="o">.</span><span class="n">send_AdminServer2Portal</span><span class="p">(</span>
|
|
<span class="n">DUMMYSESSION</span><span class="p">,</span> <span class="n">operation</span><span class="o">=</span><span class="n">amp</span><span class="o">.</span><span class="n">SSYNC</span><span class="p">,</span> <span class="n">sessiondata</span><span class="o">=</span><span class="n">sessdata</span><span class="p">,</span> <span class="n">clean</span><span class="o">=</span><span class="kc">False</span>
|
|
<span class="p">)</span></div>
|
|
|
|
<div class="viewcode-block" id="ServerSessionHandler.session_portal_partial_sync"><a class="viewcode-back" href="../../../api/evennia.server.sessionhandler.html#evennia.server.sessionhandler.ServerSessionHandler.session_portal_partial_sync">[docs]</a> <span class="k">def</span> <span class="nf">session_portal_partial_sync</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">session_data</span><span class="p">):</span>
|
|
<span class="w"> </span><span class="sd">"""</span>
|
|
<span class="sd"> Call to make a partial update of the session, such as only a particular property.</span>
|
|
|
|
<span class="sd"> Args:</span>
|
|
<span class="sd"> session_data (dict): Store `{sessid: {property:value}, ...}` defining one or</span>
|
|
<span class="sd"> more sessions in detail.</span>
|
|
|
|
<span class="sd"> """</span>
|
|
<span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">server</span><span class="o">.</span><span class="n">amp_protocol</span><span class="o">.</span><span class="n">send_AdminServer2Portal</span><span class="p">(</span>
|
|
<span class="n">DUMMYSESSION</span><span class="p">,</span> <span class="n">operation</span><span class="o">=</span><span class="n">amp</span><span class="o">.</span><span class="n">SSYNC</span><span class="p">,</span> <span class="n">sessiondata</span><span class="o">=</span><span class="n">session_data</span><span class="p">,</span> <span class="n">clean</span><span class="o">=</span><span class="kc">False</span>
|
|
<span class="p">)</span></div>
|
|
|
|
<div class="viewcode-block" id="ServerSessionHandler.disconnect_all_sessions"><a class="viewcode-back" href="../../../api/evennia.server.sessionhandler.html#evennia.server.sessionhandler.ServerSessionHandler.disconnect_all_sessions">[docs]</a> <span class="k">def</span> <span class="nf">disconnect_all_sessions</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">reason</span><span class="o">=</span><span class="s2">"You have been disconnected."</span><span class="p">):</span>
|
|
<span class="w"> </span><span class="sd">"""</span>
|
|
<span class="sd"> Cleanly disconnect all of the connected sessions.</span>
|
|
|
|
<span class="sd"> Args:</span>
|
|
<span class="sd"> reason (str, optional): The reason for the disconnection.</span>
|
|
|
|
<span class="sd"> """</span>
|
|
|
|
<span class="k">for</span> <span class="n">session</span> <span class="ow">in</span> <span class="bp">self</span><span class="p">:</span>
|
|
<span class="k">del</span> <span class="n">session</span>
|
|
<span class="c1"># tell portal to disconnect all sessions</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">server</span><span class="o">.</span><span class="n">amp_protocol</span><span class="o">.</span><span class="n">send_AdminServer2Portal</span><span class="p">(</span>
|
|
<span class="n">DUMMYSESSION</span><span class="p">,</span> <span class="n">operation</span><span class="o">=</span><span class="n">amp</span><span class="o">.</span><span class="n">SDISCONNALL</span><span class="p">,</span> <span class="n">reason</span><span class="o">=</span><span class="n">reason</span>
|
|
<span class="p">)</span></div>
|
|
|
|
<div class="viewcode-block" id="ServerSessionHandler.disconnect_duplicate_sessions"><a class="viewcode-back" href="../../../api/evennia.server.sessionhandler.html#evennia.server.sessionhandler.ServerSessionHandler.disconnect_duplicate_sessions">[docs]</a> <span class="k">def</span> <span class="nf">disconnect_duplicate_sessions</span><span class="p">(</span>
|
|
<span class="bp">self</span><span class="p">,</span> <span class="n">curr_session</span><span class="p">,</span> <span class="n">reason</span><span class="o">=</span><span class="n">_</span><span class="p">(</span><span class="s2">"Logged in from elsewhere. Disconnecting."</span><span class="p">)</span>
|
|
<span class="p">):</span>
|
|
<span class="w"> </span><span class="sd">"""</span>
|
|
<span class="sd"> Disconnects any existing sessions with the same user.</span>
|
|
|
|
<span class="sd"> args:</span>
|
|
<span class="sd"> curr_session (Session): Disconnect all Sessions matching this one.</span>
|
|
<span class="sd"> reason (str, optional): A motivation for disconnecting.</span>
|
|
|
|
<span class="sd"> """</span>
|
|
<span class="n">uid</span> <span class="o">=</span> <span class="n">curr_session</span><span class="o">.</span><span class="n">uid</span>
|
|
<span class="c1"># we can't compare sessions directly since this will compare addresses and</span>
|
|
<span class="c1"># mean connecting from the same host would not catch duplicates</span>
|
|
<span class="n">sid</span> <span class="o">=</span> <span class="nb">id</span><span class="p">(</span><span class="n">curr_session</span><span class="p">)</span>
|
|
<span class="n">doublet_sessions</span> <span class="o">=</span> <span class="p">[</span>
|
|
<span class="n">sess</span> <span class="k">for</span> <span class="n">sess</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">values</span><span class="p">()</span> <span class="k">if</span> <span class="n">sess</span><span class="o">.</span><span class="n">logged_in</span> <span class="ow">and</span> <span class="n">sess</span><span class="o">.</span><span class="n">uid</span> <span class="o">==</span> <span class="n">uid</span> <span class="ow">and</span> <span class="nb">id</span><span class="p">(</span><span class="n">sess</span><span class="p">)</span> <span class="o">!=</span> <span class="n">sid</span>
|
|
<span class="p">]</span>
|
|
|
|
<span class="k">for</span> <span class="n">session</span> <span class="ow">in</span> <span class="n">doublet_sessions</span><span class="p">:</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">disconnect</span><span class="p">(</span><span class="n">session</span><span class="p">,</span> <span class="n">reason</span><span class="p">)</span></div>
|
|
|
|
<div class="viewcode-block" id="ServerSessionHandler.validate_sessions"><a class="viewcode-back" href="../../../api/evennia.server.sessionhandler.html#evennia.server.sessionhandler.ServerSessionHandler.validate_sessions">[docs]</a> <span class="k">def</span> <span class="nf">validate_sessions</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
|
|
<span class="w"> </span><span class="sd">"""</span>
|
|
<span class="sd"> Check all currently connected sessions (logged in and not) and</span>
|
|
<span class="sd"> see if any are dead or idle.</span>
|
|
|
|
<span class="sd"> """</span>
|
|
<span class="n">tcurr</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">reason</span> <span class="o">=</span> <span class="n">_</span><span class="p">(</span><span class="s2">"Idle timeout exceeded, disconnecting."</span><span class="p">)</span>
|
|
<span class="k">for</span> <span class="n">session</span> <span class="ow">in</span> <span class="p">(</span>
|
|
<span class="n">session</span>
|
|
<span class="k">for</span> <span class="n">session</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">values</span><span class="p">()</span>
|
|
<span class="k">if</span> <span class="n">session</span><span class="o">.</span><span class="n">logged_in</span>
|
|
<span class="ow">and</span> <span class="n">_IDLE_TIMEOUT</span> <span class="o">></span> <span class="mi">0</span>
|
|
<span class="ow">and</span> <span class="p">(</span><span class="n">tcurr</span> <span class="o">-</span> <span class="n">session</span><span class="o">.</span><span class="n">cmd_last</span><span class="p">)</span> <span class="o">></span> <span class="n">_IDLE_TIMEOUT</span>
|
|
<span class="p">):</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">disconnect</span><span class="p">(</span><span class="n">session</span><span class="p">,</span> <span class="n">reason</span><span class="o">=</span><span class="n">reason</span><span class="p">)</span></div>
|
|
|
|
<div class="viewcode-block" id="ServerSessionHandler.account_count"><a class="viewcode-back" href="../../../api/evennia.server.sessionhandler.html#evennia.server.sessionhandler.ServerSessionHandler.account_count">[docs]</a> <span class="k">def</span> <span class="nf">account_count</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
|
|
<span class="w"> </span><span class="sd">"""</span>
|
|
<span class="sd"> Get the number of connected accounts (not sessions since a</span>
|
|
<span class="sd"> account may have more than one session depending on settings).</span>
|
|
<span class="sd"> Only logged-in accounts are counted here.</span>
|
|
|
|
<span class="sd"> Returns:</span>
|
|
<span class="sd"> naccount (int): Number of connected accounts</span>
|
|
|
|
<span class="sd"> """</span>
|
|
<span class="k">return</span> <span class="nb">len</span><span class="p">(</span><span class="nb">set</span><span class="p">(</span><span class="n">session</span><span class="o">.</span><span class="n">uid</span> <span class="k">for</span> <span class="n">session</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">values</span><span class="p">()</span> <span class="k">if</span> <span class="n">session</span><span class="o">.</span><span class="n">logged_in</span><span class="p">))</span></div>
|
|
|
|
<div class="viewcode-block" id="ServerSessionHandler.all_connected_accounts"><a class="viewcode-back" href="../../../api/evennia.server.sessionhandler.html#evennia.server.sessionhandler.ServerSessionHandler.all_connected_accounts">[docs]</a> <span class="k">def</span> <span class="nf">all_connected_accounts</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
|
|
<span class="w"> </span><span class="sd">"""</span>
|
|
<span class="sd"> Get a unique list of connected and logged-in Accounts.</span>
|
|
|
|
<span class="sd"> Returns:</span>
|
|
<span class="sd"> accounts (list): All connected Accounts (which may be fewer than the</span>
|
|
<span class="sd"> amount of Sessions due to multi-playing).</span>
|
|
|
|
<span class="sd"> """</span>
|
|
<span class="k">return</span> <span class="nb">list</span><span class="p">(</span>
|
|
<span class="nb">set</span><span class="p">(</span>
|
|
<span class="n">session</span><span class="o">.</span><span class="n">account</span>
|
|
<span class="k">for</span> <span class="n">session</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">values</span><span class="p">()</span>
|
|
<span class="k">if</span> <span class="n">session</span><span class="o">.</span><span class="n">logged_in</span> <span class="ow">and</span> <span class="n">session</span><span class="o">.</span><span class="n">account</span>
|
|
<span class="p">)</span>
|
|
<span class="p">)</span></div>
|
|
|
|
<div class="viewcode-block" id="ServerSessionHandler.session_from_sessid"><a class="viewcode-back" href="../../../api/evennia.server.sessionhandler.html#evennia.server.sessionhandler.ServerSessionHandler.session_from_sessid">[docs]</a> <span class="k">def</span> <span class="nf">session_from_sessid</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">sessid</span><span class="p">):</span>
|
|
<span class="w"> </span><span class="sd">"""</span>
|
|
<span class="sd"> Get session based on sessid, or None if not found</span>
|
|
|
|
<span class="sd"> Args:</span>
|
|
<span class="sd"> sessid (int or list): Session id(s).</span>
|
|
|
|
<span class="sd"> Return:</span>
|
|
<span class="sd"> sessions (Session or list): Session(s) found. This</span>
|
|
<span class="sd"> is a list if input was a list.</span>
|
|
|
|
<span class="sd"> """</span>
|
|
<span class="k">if</span> <span class="n">is_iter</span><span class="p">(</span><span class="n">sessid</span><span class="p">):</span>
|
|
<span class="k">return</span> <span class="p">[</span><span class="bp">self</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="n">sid</span><span class="p">)</span> <span class="k">for</span> <span class="n">sid</span> <span class="ow">in</span> <span class="n">sessid</span> <span class="k">if</span> <span class="n">sid</span> <span class="ow">in</span> <span class="bp">self</span><span class="p">]</span>
|
|
<span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="n">sessid</span><span class="p">)</span></div>
|
|
|
|
<div class="viewcode-block" id="ServerSessionHandler.session_from_account"><a class="viewcode-back" href="../../../api/evennia.server.sessionhandler.html#evennia.server.sessionhandler.ServerSessionHandler.session_from_account">[docs]</a> <span class="k">def</span> <span class="nf">session_from_account</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">account</span><span class="p">,</span> <span class="n">sessid</span><span class="p">):</span>
|
|
<span class="w"> </span><span class="sd">"""</span>
|
|
<span class="sd"> Given an account and a session id, return the actual session</span>
|
|
<span class="sd"> object.</span>
|
|
|
|
<span class="sd"> Args:</span>
|
|
<span class="sd"> account (Account): The Account to get the Session from.</span>
|
|
<span class="sd"> sessid (int or list): Session id(s).</span>
|
|
|
|
<span class="sd"> Returns:</span>
|
|
<span class="sd"> sessions (Session or list): Session(s) found.</span>
|
|
|
|
<span class="sd"> """</span>
|
|
<span class="n">sessions</span> <span class="o">=</span> <span class="p">[</span>
|
|
<span class="bp">self</span><span class="p">[</span><span class="n">sid</span><span class="p">]</span>
|
|
<span class="k">for</span> <span class="n">sid</span> <span class="ow">in</span> <span class="n">make_iter</span><span class="p">(</span><span class="n">sessid</span><span class="p">)</span>
|
|
<span class="k">if</span> <span class="n">sid</span> <span class="ow">in</span> <span class="bp">self</span> <span class="ow">and</span> <span class="bp">self</span><span class="p">[</span><span class="n">sid</span><span class="p">]</span><span class="o">.</span><span class="n">logged_in</span> <span class="ow">and</span> <span class="n">account</span><span class="o">.</span><span class="n">uid</span> <span class="o">==</span> <span class="bp">self</span><span class="p">[</span><span class="n">sid</span><span class="p">]</span><span class="o">.</span><span class="n">uid</span>
|
|
<span class="p">]</span>
|
|
<span class="k">return</span> <span class="n">sessions</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span> <span class="k">if</span> <span class="nb">len</span><span class="p">(</span><span class="n">sessions</span><span class="p">)</span> <span class="o">==</span> <span class="mi">1</span> <span class="k">else</span> <span class="n">sessions</span></div>
|
|
|
|
<div class="viewcode-block" id="ServerSessionHandler.sessions_from_account"><a class="viewcode-back" href="../../../api/evennia.server.sessionhandler.html#evennia.server.sessionhandler.ServerSessionHandler.sessions_from_account">[docs]</a> <span class="k">def</span> <span class="nf">sessions_from_account</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">account</span><span class="p">):</span>
|
|
<span class="w"> </span><span class="sd">"""</span>
|
|
<span class="sd"> Given an account, return all matching sessions.</span>
|
|
|
|
<span class="sd"> Args:</span>
|
|
<span class="sd"> account (Account): Account to get sessions from.</span>
|
|
|
|
<span class="sd"> Returns:</span>
|
|
<span class="sd"> sessions (list): All Sessions associated with this account.</span>
|
|
|
|
<span class="sd"> """</span>
|
|
<span class="n">uid</span> <span class="o">=</span> <span class="n">account</span><span class="o">.</span><span class="n">uid</span>
|
|
<span class="k">return</span> <span class="p">[</span><span class="n">session</span> <span class="k">for</span> <span class="n">session</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">values</span><span class="p">()</span> <span class="k">if</span> <span class="n">session</span><span class="o">.</span><span class="n">logged_in</span> <span class="ow">and</span> <span class="n">session</span><span class="o">.</span><span class="n">uid</span> <span class="o">==</span> <span class="n">uid</span><span class="p">]</span></div>
|
|
|
|
<div class="viewcode-block" id="ServerSessionHandler.sessions_from_puppet"><a class="viewcode-back" href="../../../api/evennia.server.sessionhandler.html#evennia.server.sessionhandler.ServerSessionHandler.sessions_from_puppet">[docs]</a> <span class="k">def</span> <span class="nf">sessions_from_puppet</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">puppet</span><span class="p">):</span>
|
|
<span class="w"> </span><span class="sd">"""</span>
|
|
<span class="sd"> Given a puppeted object, return all controlling sessions.</span>
|
|
|
|
<span class="sd"> Args:</span>
|
|
<span class="sd"> puppet (Object): Object puppeted</span>
|
|
|
|
<span class="sd"> Returns.</span>
|
|
<span class="sd"> sessions (Session or list): Can be more than one of Object is controlled by more than</span>
|
|
<span class="sd"> one Session (MULTISESSION_MODE > 1).</span>
|
|
|
|
<span class="sd"> """</span>
|
|
<span class="n">sessions</span> <span class="o">=</span> <span class="n">puppet</span><span class="o">.</span><span class="n">sessid</span><span class="o">.</span><span class="n">get</span><span class="p">()</span>
|
|
<span class="k">return</span> <span class="n">sessions</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span> <span class="k">if</span> <span class="nb">len</span><span class="p">(</span><span class="n">sessions</span><span class="p">)</span> <span class="o">==</span> <span class="mi">1</span> <span class="k">else</span> <span class="n">sessions</span></div>
|
|
|
|
<span class="n">sessions_from_character</span> <span class="o">=</span> <span class="n">sessions_from_puppet</span>
|
|
|
|
<div class="viewcode-block" id="ServerSessionHandler.sessions_from_csessid"><a class="viewcode-back" href="../../../api/evennia.server.sessionhandler.html#evennia.server.sessionhandler.ServerSessionHandler.sessions_from_csessid">[docs]</a> <span class="k">def</span> <span class="nf">sessions_from_csessid</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">csessid</span><span class="p">):</span>
|
|
<span class="w"> </span><span class="sd">"""</span>
|
|
<span class="sd"> Given a client identification hash (for session types that offer them)</span>
|
|
<span class="sd"> return all sessions with a matching hash.</span>
|
|
|
|
<span class="sd"> Args</span>
|
|
<span class="sd"> csessid (str): The session hash.</span>
|
|
|
|
<span class="sd"> Returns:</span>
|
|
<span class="sd"> sessions (list): The sessions with matching .csessid, if any.</span>
|
|
|
|
<span class="sd"> """</span>
|
|
<span class="k">if</span> <span class="n">csessid</span><span class="p">:</span>
|
|
<span class="k">return</span> <span class="p">[]</span>
|
|
<span class="k">return</span> <span class="p">[</span>
|
|
<span class="n">session</span> <span class="k">for</span> <span class="n">session</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">values</span><span class="p">()</span> <span class="k">if</span> <span class="n">session</span><span class="o">.</span><span class="n">csessid</span> <span class="ow">and</span> <span class="n">session</span><span class="o">.</span><span class="n">csessid</span> <span class="o">==</span> <span class="n">csessid</span>
|
|
<span class="p">]</span></div>
|
|
|
|
<div class="viewcode-block" id="ServerSessionHandler.announce_all"><a class="viewcode-back" href="../../../api/evennia.server.sessionhandler.html#evennia.server.sessionhandler.ServerSessionHandler.announce_all">[docs]</a> <span class="k">def</span> <span class="nf">announce_all</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">message</span><span class="p">):</span>
|
|
<span class="w"> </span><span class="sd">"""</span>
|
|
<span class="sd"> Send message to all connected sessions</span>
|
|
|
|
<span class="sd"> Args:</span>
|
|
<span class="sd"> message (str): Message to send.</span>
|
|
|
|
<span class="sd"> """</span>
|
|
<span class="k">for</span> <span class="n">session</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">values</span><span class="p">():</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">data_out</span><span class="p">(</span><span class="n">session</span><span class="p">,</span> <span class="n">text</span><span class="o">=</span><span class="n">message</span><span class="p">)</span></div>
|
|
|
|
<div class="viewcode-block" id="ServerSessionHandler.data_out"><a class="viewcode-back" href="../../../api/evennia.server.sessionhandler.html#evennia.server.sessionhandler.ServerSessionHandler.data_out">[docs]</a> <span class="k">def</span> <span class="nf">data_out</span><span class="p">(</span><span class="bp">self</span><span class="p">,</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="w"> </span><span class="sd">"""</span>
|
|
<span class="sd"> Sending data Server -> Portal</span>
|
|
|
|
<span class="sd"> Args:</span>
|
|
<span class="sd"> session (Session): Session to relay to.</span>
|
|
<span class="sd"> text (str, optional): text data to return</span>
|
|
|
|
<span class="sd"> Notes:</span>
|
|
<span class="sd"> The outdata will be scrubbed for sending across</span>
|
|
<span class="sd"> the wire here.</span>
|
|
<span class="sd"> """</span>
|
|
<span class="c1"># clean output for sending</span>
|
|
<span class="n">kwargs</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">clean_senddata</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="c1"># send across AMP</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">server</span><span class="o">.</span><span class="n">amp_protocol</span><span class="o">.</span><span class="n">send_MsgServer2Portal</span><span class="p">(</span><span class="n">session</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">)</span></div>
|
|
|
|
<div class="viewcode-block" id="ServerSessionHandler.get_inputfuncs"><a class="viewcode-back" href="../../../api/evennia.server.sessionhandler.html#evennia.server.sessionhandler.ServerSessionHandler.get_inputfuncs">[docs]</a> <span class="k">def</span> <span class="nf">get_inputfuncs</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
|
|
<span class="w"> </span><span class="sd">"""</span>
|
|
<span class="sd"> Get all registered inputfuncs (access function)</span>
|
|
|
|
<span class="sd"> Returns:</span>
|
|
<span class="sd"> inputfuncs (dict): A dict of {key:inputfunc,...}</span>
|
|
<span class="sd"> """</span>
|
|
<span class="k">return</span> <span class="n">_INPUT_FUNCS</span></div>
|
|
|
|
<div class="viewcode-block" id="ServerSessionHandler.data_in"><a class="viewcode-back" href="../../../api/evennia.server.sessionhandler.html#evennia.server.sessionhandler.ServerSessionHandler.data_in">[docs]</a> <span class="k">def</span> <span class="nf">data_in</span><span class="p">(</span><span class="bp">self</span><span class="p">,</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="w"> </span><span class="sd">"""</span>
|
|
<span class="sd"> We let the data take a "detour" to session.data_in</span>
|
|
<span class="sd"> so the user can override and see it all in one place.</span>
|
|
<span class="sd"> That method is responsible to in turn always call</span>
|
|
<span class="sd"> this class' `sessionhandler.call_inputfunc` with the</span>
|
|
<span class="sd"> (possibly processed) data.</span>
|
|
|
|
<span class="sd"> """</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">data_in</span><span class="p">(</span><span class="o">**</span><span class="n">kwargs</span><span class="p">)</span></div>
|
|
|
|
<div class="viewcode-block" id="ServerSessionHandler.call_inputfuncs"><a class="viewcode-back" href="../../../api/evennia.server.sessionhandler.html#evennia.server.sessionhandler.ServerSessionHandler.call_inputfuncs">[docs]</a> <span class="k">def</span> <span class="nf">call_inputfuncs</span><span class="p">(</span><span class="bp">self</span><span class="p">,</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="w"> </span><span class="sd">"""</span>
|
|
<span class="sd"> Split incoming data into its inputfunc counterparts. This should be</span>
|
|
<span class="sd"> called by the `serversession.data_in` as</span>
|
|
<span class="sd"> `sessionhandler.call_inputfunc(self, **kwargs)`.</span>
|
|
|
|
<span class="sd"> We also intercept OOB communication here.</span>
|
|
|
|
<span class="sd"> Args:</span>
|
|
<span class="sd"> sessions (Session): Session.</span>
|
|
|
|
<span class="sd"> Keyword Args:</span>
|
|
<span class="sd"> any (tuple): Incoming data from protocol, each</span>
|
|
<span class="sd"> on the form `commandname=((args), {kwargs})`.</span>
|
|
|
|
<span class="sd"> """</span>
|
|
|
|
<span class="c1"># distribute incoming data to the correct receiving methods.</span>
|
|
<span class="k">if</span> <span class="n">session</span><span class="p">:</span>
|
|
<span class="n">input_debug</span> <span class="o">=</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">"INPUTDEBUG"</span><span class="p">,</span> <span class="kc">False</span><span class="p">)</span>
|
|
<span class="k">for</span> <span class="n">cmdname</span><span class="p">,</span> <span class="p">(</span><span class="n">cmdargs</span><span class="p">,</span> <span class="n">cmdkwargs</span><span class="p">)</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">cname</span> <span class="o">=</span> <span class="n">cmdname</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="k">try</span><span class="p">:</span>
|
|
<span class="n">cmdkwargs</span><span class="o">.</span><span class="n">pop</span><span class="p">(</span><span class="s2">"options"</span><span class="p">,</span> <span class="kc">None</span><span class="p">)</span>
|
|
<span class="k">if</span> <span class="n">cname</span> <span class="ow">in</span> <span class="n">_INPUT_FUNCS</span><span class="p">:</span>
|
|
<span class="n">_INPUT_FUNCS</span><span class="p">[</span><span class="n">cname</span><span class="p">](</span><span class="n">session</span><span class="p">,</span> <span class="o">*</span><span class="n">cmdargs</span><span class="p">,</span> <span class="o">**</span><span class="n">cmdkwargs</span><span class="p">)</span>
|
|
<span class="k">else</span><span class="p">:</span>
|
|
<span class="n">_INPUT_FUNCS</span><span class="p">[</span><span class="s2">"default"</span><span class="p">](</span><span class="n">session</span><span class="p">,</span> <span class="n">cname</span><span class="p">,</span> <span class="o">*</span><span class="n">cmdargs</span><span class="p">,</span> <span class="o">**</span><span class="n">cmdkwargs</span><span class="p">)</span>
|
|
<span class="k">except</span> <span class="ne">Exception</span> <span class="k">as</span> <span class="n">err</span><span class="p">:</span>
|
|
<span class="k">if</span> <span class="n">input_debug</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_trace</span><span class="p">()</span></div></div>
|
|
|
|
|
|
<span class="c1"># These are filled in during server boot.</span>
|
|
<span class="n">SESSION_HANDLER</span> <span class="o">=</span> <span class="kc">None</span>
|
|
<span class="n">SESSIONS</span> <span class="o">=</span> <span class="kc">None</span> <span class="c1"># legacy</span>
|
|
</pre></div>
|
|
|
|
</div>
|
|
</div>
|
|
</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</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.server.sessionhandler</a></li>
|
|
</ul>
|
|
</div>
|
|
<div class="footer" role="contentinfo">
|
|
© Copyright 2023, The Evennia developer community.
|
|
Created using <a href="https://www.sphinx-doc.org/">Sphinx</a> 3.2.1.
|
|
</div>
|
|
</body>
|
|
</html> |