Updated HTML docs.

This commit is contained in:
Evennia docbuilder action 2023-11-23 18:12:57 +00:00
parent 6db213a843
commit b4fe068f44
705 changed files with 2337 additions and 140 deletions

View file

@ -268,9 +268,10 @@
<span class="c1"># Parent typeclasses</span>
<span class="c1"># utilities</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">import</span> <span class="nn">os</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">.</span> <span class="kn">import</span> <span class="n">contrib</span>
<span class="kn">from</span> <span class="nn">.accounts.accounts</span> <span class="kn">import</span> <span class="n">DefaultAccount</span><span class="p">,</span> <span class="n">DefaultGuest</span>
<span class="kn">from</span> <span class="nn">.accounts.models</span> <span class="kn">import</span> <span class="n">AccountDB</span>
@ -296,7 +297,7 @@
<span class="kn">from</span> <span class="nn">.server.models</span> <span class="kn">import</span> <span class="n">ServerConfig</span>
<span class="kn">from</span> <span class="nn">.typeclasses.attributes</span> <span class="kn">import</span> <span class="n">AttributeProperty</span>
<span class="kn">from</span> <span class="nn">.typeclasses.tags</span> <span class="kn">import</span> <span class="n">TagCategoryProperty</span><span class="p">,</span> <span class="n">TagProperty</span>
<span class="kn">from</span> <span class="nn">.utils</span> <span class="kn">import</span> <span class="n">ansi</span><span class="p">,</span> <span class="n">gametime</span><span class="p">,</span> <span class="n">logger</span><span class="p">,</span> <span class="n">class_from_module</span>
<span class="kn">from</span> <span class="nn">.utils</span> <span class="kn">import</span> <span class="n">ansi</span><span class="p">,</span> <span class="n">class_from_module</span><span class="p">,</span> <span class="n">gametime</span><span class="p">,</span> <span class="n">logger</span>
<span class="kn">from</span> <span class="nn">.utils.ansi</span> <span class="kn">import</span> <span class="n">ANSIString</span>
<span class="k">if</span> <span class="ow">not</span> <span class="n">PORTAL_MODE</span><span class="p">:</span>

View file

@ -101,13 +101,14 @@
<span class="kn">import</span> <span class="nn">typing</span>
<span class="kn">from</span> <span class="nn">random</span> <span class="kn">import</span> <span class="n">getrandbits</span>
<span class="kn">import</span> <span class="nn">evennia</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.contrib.auth</span> <span class="kn">import</span> <span class="n">authenticate</span><span class="p">,</span> <span class="n">password_validation</span>
<span class="kn">from</span> <span class="nn">django.core.exceptions</span> <span class="kn">import</span> <span class="n">ImproperlyConfigured</span><span class="p">,</span> <span class="n">ValidationError</span>
<span class="kn">from</span> <span class="nn">django.utils</span> <span class="kn">import</span> <span class="n">timezone</span>
<span class="kn">from</span> <span class="nn">django.utils.module_loading</span> <span class="kn">import</span> <span class="n">import_string</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">import</span> <span class="nn">evennia</span>
<span class="kn">from</span> <span class="nn">evennia.accounts.manager</span> <span class="kn">import</span> <span class="n">AccountManager</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="kn">from</span> <span class="nn">evennia.commands.cmdsethandler</span> <span class="kn">import</span> <span class="n">CmdSetHandler</span>
@ -117,9 +118,9 @@
<span class="kn">from</span> <span class="nn">evennia.server.models</span> <span class="kn">import</span> <span class="n">ServerConfig</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_CREATE</span><span class="p">,</span>
<span class="n">SIGNAL_ACCOUNT_POST_LOGIN_FAIL</span><span class="p">,</span>
<span class="n">SIGNAL_OBJECT_POST_PUPPET</span><span class="p">,</span>
<span class="n">SIGNAL_OBJECT_POST_UNPUPPET</span><span class="p">,</span>
<span class="n">SIGNAL_ACCOUNT_POST_LOGIN_FAIL</span><span class="p">,</span>
<span class="p">)</span>
<span class="kn">from</span> <span class="nn">evennia.server.throttle</span> <span class="kn">import</span> <span class="n">Throttle</span>
<span class="kn">from</span> <span class="nn">evennia.typeclasses.attributes</span> <span class="kn">import</span> <span class="n">ModelAttributeBackend</span><span class="p">,</span> <span class="n">NickHandler</span>
@ -941,7 +942,7 @@
<span class="sd"> &quot;&quot;&quot;</span>
<span class="c1"># check character slot usage.</span>
<span class="k">if</span> <span class="p">(</span><span class="n">slot_check</span> <span class="o">:=</span> <span class="bp">self</span><span class="o">.</span><span class="n">check_available_slots</span><span class="p">()):</span>
<span class="k">if</span> <span class="n">slot_check</span> <span class="o">:=</span> <span class="bp">self</span><span class="o">.</span><span class="n">check_available_slots</span><span class="p">():</span>
<span class="k">return</span> <span class="kc">None</span><span class="p">,</span> <span class="p">[</span><span class="n">slot_check</span><span class="p">]</span>
<span class="c1"># parse inputs</span>

View file

@ -234,7 +234,9 @@
<span class="n">key</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">lhs</span>
<span class="n">description</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">rhs</span> <span class="ow">or</span> <span class="s2">&quot;This is a character.&quot;</span>
<span class="n">new_character</span><span class="p">,</span> <span class="n">errors</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">account</span><span class="o">.</span><span class="n">create_character</span><span class="p">(</span><span class="n">key</span><span class="o">=</span><span class="n">key</span><span class="p">,</span> <span class="n">description</span><span class="o">=</span><span class="n">description</span><span class="p">,</span> <span class="n">ip</span><span class="o">=</span><span class="bp">self</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">new_character</span><span class="p">,</span> <span class="n">errors</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">account</span><span class="o">.</span><span class="n">create_character</span><span class="p">(</span>
<span class="n">key</span><span class="o">=</span><span class="n">key</span><span class="p">,</span> <span class="n">description</span><span class="o">=</span><span class="n">description</span><span class="p">,</span> <span class="n">ip</span><span class="o">=</span><span class="bp">self</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="k">if</span> <span class="n">errors</span><span class="p">:</span>
<span class="bp">self</span><span class="o">.</span><span class="n">msg</span><span class="p">(</span><span class="n">errors</span><span class="p">)</span>
@ -247,7 +249,6 @@
<span class="p">)</span></div></div>
<div class="viewcode-block" id="CmdCharDelete"><a class="viewcode-back" href="../../../../api/evennia.commands.default.account.html#evennia.commands.default.account.CmdCharDelete">[docs]</a><span class="k">class</span> <span class="nc">CmdCharDelete</span><span class="p">(</span><span class="n">COMMAND_DEFAULT_CLASS</span><span class="p">):</span>
<span class="w"> </span><span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> delete a character - this cannot be undone!</span>

View file

@ -96,7 +96,6 @@
<span class="kn">import</span> <span class="nn">time</span>
<span class="kn">import</span> <span class="nn">typing</span>
<span class="kn">from</span> <span class="nn">collections</span> <span class="kn">import</span> <span class="n">defaultdict</span>
<span class="kn">import</span> <span class="nn">typing</span>
<span class="kn">import</span> <span class="nn">inflect</span>
<span class="kn">from</span> <span class="nn">django.conf</span> <span class="kn">import</span> <span class="n">settings</span>
@ -2626,7 +2625,7 @@
<span class="c1"># Normalize to latin characters and validate, if necessary, the supplied key</span>
<span class="n">key</span> <span class="o">=</span> <span class="bp">cls</span><span class="o">.</span><span class="n">normalize_name</span><span class="p">(</span><span class="n">key</span><span class="p">)</span>
<span class="k">if</span> <span class="p">(</span><span class="n">val_err</span> <span class="o">:=</span> <span class="bp">cls</span><span class="o">.</span><span class="n">validate_name</span><span class="p">(</span><span class="n">key</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="k">if</span> <span class="n">val_err</span> <span class="o">:=</span> <span class="bp">cls</span><span class="o">.</span><span class="n">validate_name</span><span class="p">(</span><span class="n">key</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">errors</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">val_err</span><span class="p">)</span>
<span class="k">return</span> <span class="n">obj</span><span class="p">,</span> <span class="n">errors</span>
@ -3119,8 +3118,8 @@
<span class="sd"> location (Room): The room to create this exit in.</span>
<span class="sd"> Keyword Args:</span>
<span class="sd"> account (obj): Account to associate this Exit with.</span>
<span class="sd"> caller (ObjectDB): the Object creating this Object.</span>
<span class="sd"> account (AccountDB): Account to associate this Exit with.</span>
<span class="sd"> caller (ObjectDB): The Object creating this Object.</span>
<span class="sd"> description (str): Brief description for this object.</span>
<span class="sd"> ip (str): IP address of creator (for object auditing).</span>
<span class="sd"> destination (Room): The room to which this exit should go.</span>

View file

@ -0,0 +1,481 @@
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>evennia.server.portal.service &#8212; Evennia 2.x 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 2.x</a> &#187;</li>
<li class="nav-item nav-item-1"><a href="../../../index.html" >Module code</a> &#187;</li>
<li class="nav-item nav-item-2"><a href="../../../evennia.html" accesskey="U">evennia</a> &#187;</li>
<li class="nav-item nav-item-this"><a href="">evennia.server.portal.service</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>Doc Versions</h3>
<ul>
<li><a href="service.html">2.x (main branch)</a></li>
<ul>
<li><a href="../1.3.0/index.html">1.3.0 (v1.3.0 branch)</a></li>
<li><a href="../0.9.5/index.html">0.9.5 (v0.9.5 branch)</a></li>
</ul>
</div>
</div>
<div class="bodywrapper">
<div class="body" role="main">
<h1>Source code for evennia.server.portal.service</h1><div class="highlight"><pre>
<span></span><span class="kn">import</span> <span class="nn">os</span>
<span class="kn">import</span> <span class="nn">sys</span>
<span class="kn">import</span> <span class="nn">time</span>
<span class="kn">from</span> <span class="nn">os.path</span> <span class="kn">import</span> <span class="n">abspath</span><span class="p">,</span> <span class="n">dirname</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.db</span> <span class="kn">import</span> <span class="n">connection</span>
<span class="kn">from</span> <span class="nn">twisted.application</span> <span class="kn">import</span> <span class="n">internet</span><span class="p">,</span> <span class="n">service</span>
<span class="kn">from</span> <span class="nn">twisted.application.service</span> <span class="kn">import</span> <span class="n">MultiService</span>
<span class="kn">from</span> <span class="nn">twisted.internet</span> <span class="kn">import</span> <span class="n">protocol</span><span class="p">,</span> <span class="n">reactor</span>
<span class="kn">from</span> <span class="nn">twisted.internet.task</span> <span class="kn">import</span> <span class="n">LoopingCall</span>
<span class="kn">import</span> <span class="nn">evennia</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">class_from_module</span><span class="p">,</span>
<span class="n">get_evennia_version</span><span class="p">,</span>
<span class="n">make_iter</span><span class="p">,</span>
<span class="n">mod_import</span><span class="p">,</span>
<span class="p">)</span>
<div class="viewcode-block" id="EvenniaPortalService"><a class="viewcode-back" href="../../../../api/evennia.server.portal.service.html#evennia.server.portal.service.EvenniaPortalService">[docs]</a><span class="k">class</span> <span class="nc">EvenniaPortalService</span><span class="p">(</span><span class="n">MultiService</span><span class="p">):</span>
<div class="viewcode-block" id="EvenniaPortalService.__init__"><a class="viewcode-back" href="../../../../api/evennia.server.portal.service.html#evennia.server.portal.service.EvenniaPortalService.__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="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">amp_protocol</span> <span class="o">=</span> <span class="kc">None</span>
<span class="bp">self</span><span class="o">.</span><span class="n">server_process_id</span> <span class="o">=</span> <span class="kc">None</span>
<span class="bp">self</span><span class="o">.</span><span class="n">server_restart_mode</span> <span class="o">=</span> <span class="s2">&quot;shutdown&quot;</span>
<span class="bp">self</span><span class="o">.</span><span class="n">server_info_dict</span> <span class="o">=</span> <span class="nb">dict</span><span class="p">()</span>
<span class="bp">self</span><span class="o">.</span><span class="n">start_time</span> <span class="o">=</span> <span class="mi">0</span>
<span class="bp">self</span><span class="o">.</span><span class="n">_maintenance_count</span> <span class="o">=</span> <span class="mi">0</span>
<span class="bp">self</span><span class="o">.</span><span class="n">maintenance_task</span> <span class="o">=</span> <span class="kc">None</span>
<span class="bp">self</span><span class="o">.</span><span class="n">info_dict</span> <span class="o">=</span> <span class="p">{</span>
<span class="s2">&quot;servername&quot;</span><span class="p">:</span> <span class="n">settings</span><span class="o">.</span><span class="n">SERVERNAME</span><span class="p">,</span>
<span class="s2">&quot;version&quot;</span><span class="p">:</span> <span class="n">get_evennia_version</span><span class="p">(),</span>
<span class="s2">&quot;errors&quot;</span><span class="p">:</span> <span class="s2">&quot;&quot;</span><span class="p">,</span>
<span class="s2">&quot;info&quot;</span><span class="p">:</span> <span class="s2">&quot;&quot;</span><span class="p">,</span>
<span class="s2">&quot;lockdown_mode&quot;</span><span class="p">:</span> <span class="s2">&quot;&quot;</span><span class="p">,</span>
<span class="s2">&quot;amp&quot;</span><span class="p">:</span> <span class="s2">&quot;&quot;</span><span class="p">,</span>
<span class="s2">&quot;telnet&quot;</span><span class="p">:</span> <span class="p">[],</span>
<span class="s2">&quot;telnet_ssl&quot;</span><span class="p">:</span> <span class="p">[],</span>
<span class="s2">&quot;ssh&quot;</span><span class="p">:</span> <span class="p">[],</span>
<span class="s2">&quot;webclient&quot;</span><span class="p">:</span> <span class="p">[],</span>
<span class="s2">&quot;webserver_proxy&quot;</span><span class="p">:</span> <span class="p">[],</span>
<span class="s2">&quot;webserver_internal&quot;</span><span class="p">:</span> <span class="p">[],</span>
<span class="p">}</span>
<span class="c1"># in non-interactive portal mode, this gets overwritten by</span>
<span class="c1"># cmdline sent by the evennia launcher</span>
<span class="bp">self</span><span class="o">.</span><span class="n">server_twistd_cmd</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_get_backup_server_twistd_cmd</span><span class="p">()</span></div>
<div class="viewcode-block" id="EvenniaPortalService.portal_maintenance"><a class="viewcode-back" href="../../../../api/evennia.server.portal.service.html#evennia.server.portal.service.EvenniaPortalService.portal_maintenance">[docs]</a> <span class="k">def</span> <span class="nf">portal_maintenance</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="w"> </span><span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> Repeated maintenance tasks for the portal.</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="bp">self</span><span class="o">.</span><span class="n">_maintenance_count</span> <span class="o">+=</span> <span class="mi">1</span>
<span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">_maintenance_count</span> <span class="o">%</span> <span class="p">(</span><span class="mi">60</span> <span class="o">*</span> <span class="mi">7</span><span class="p">)</span> <span class="o">==</span> <span class="mi">0</span><span class="p">:</span>
<span class="c1"># drop database connection every 7 hrs to avoid default timeouts on MySQL</span>
<span class="c1"># (see https://github.com/evennia/evennia/issues/1376)</span>
<span class="n">connection</span><span class="o">.</span><span class="n">close</span><span class="p">()</span></div>
<div class="viewcode-block" id="EvenniaPortalService.privilegedStartService"><a class="viewcode-back" href="../../../../api/evennia.server.portal.service.html#evennia.server.portal.service.EvenniaPortalService.privilegedStartService">[docs]</a> <span class="k">def</span> <span class="nf">privilegedStartService</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="bp">self</span><span class="o">.</span><span class="n">start_time</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="bp">self</span><span class="o">.</span><span class="n">maintenance_task</span> <span class="o">=</span> <span class="n">LoopingCall</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">portal_maintenance</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">maintenance_task</span><span class="o">.</span><span class="n">start</span><span class="p">(</span><span class="mi">60</span><span class="p">,</span> <span class="n">now</span><span class="o">=</span><span class="kc">True</span><span class="p">)</span> <span class="c1"># call every minute</span>
<span class="c1"># set a callback if the server is killed abruptly,</span>
<span class="c1"># by Ctrl-C, reboot etc.</span>
<span class="n">reactor</span><span class="o">.</span><span class="n">addSystemEventTrigger</span><span class="p">(</span>
<span class="s2">&quot;before&quot;</span><span class="p">,</span> <span class="s2">&quot;shutdown&quot;</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">shutdown</span><span class="p">,</span> <span class="n">_reactor_stopping</span><span class="o">=</span><span class="kc">True</span><span class="p">,</span> <span class="n">_stop_server</span><span class="o">=</span><span class="kc">True</span>
<span class="p">)</span>
<span class="k">if</span> <span class="n">settings</span><span class="o">.</span><span class="n">AMP_HOST</span> <span class="ow">and</span> <span class="n">settings</span><span class="o">.</span><span class="n">AMP_PORT</span> <span class="ow">and</span> <span class="n">settings</span><span class="o">.</span><span class="n">AMP_INTERFACE</span><span class="p">:</span>
<span class="bp">self</span><span class="o">.</span><span class="n">register_amp</span><span class="p">()</span>
<span class="k">if</span> <span class="n">settings</span><span class="o">.</span><span class="n">TELNET_ENABLED</span> <span class="ow">and</span> <span class="n">settings</span><span class="o">.</span><span class="n">TELNET_PORTS</span> <span class="ow">and</span> <span class="n">settings</span><span class="o">.</span><span class="n">TELNET_INTERFACES</span><span class="p">:</span>
<span class="bp">self</span><span class="o">.</span><span class="n">register_telnet</span><span class="p">()</span>
<span class="k">if</span> <span class="n">settings</span><span class="o">.</span><span class="n">SSL_ENABLED</span> <span class="ow">and</span> <span class="n">settings</span><span class="o">.</span><span class="n">SSL_PORTS</span> <span class="ow">and</span> <span class="n">settings</span><span class="o">.</span><span class="n">SSL_INTERFACES</span><span class="p">:</span>
<span class="bp">self</span><span class="o">.</span><span class="n">register_ssl</span><span class="p">()</span>
<span class="k">if</span> <span class="n">settings</span><span class="o">.</span><span class="n">SSH_ENABLED</span> <span class="ow">and</span> <span class="n">settings</span><span class="o">.</span><span class="n">SSH_PORTS</span> <span class="ow">and</span> <span class="n">settings</span><span class="o">.</span><span class="n">SSH_INTERFACES</span><span class="p">:</span>
<span class="bp">self</span><span class="o">.</span><span class="n">register_ssh</span><span class="p">()</span>
<span class="k">if</span> <span class="n">settings</span><span class="o">.</span><span class="n">WEBSERVER_ENABLED</span><span class="p">:</span>
<span class="bp">self</span><span class="o">.</span><span class="n">register_webserver</span><span class="p">()</span>
<span class="k">if</span> <span class="n">settings</span><span class="o">.</span><span class="n">LOCKDOWN_MODE</span><span class="p">:</span>
<span class="bp">self</span><span class="o">.</span><span class="n">info_dict</span><span class="p">[</span><span class="s2">&quot;lockdown_mode&quot;</span><span class="p">]</span> <span class="o">=</span> <span class="s2">&quot; LOCKDOWN_MODE active: Only local connections.&quot;</span>
<span class="nb">super</span><span class="p">()</span><span class="o">.</span><span class="n">privilegedStartService</span><span class="p">()</span></div>
<div class="viewcode-block" id="EvenniaPortalService.register_plugins"><a class="viewcode-back" href="../../../../api/evennia.server.portal.service.html#evennia.server.portal.service.EvenniaPortalService.register_plugins">[docs]</a> <span class="k">def</span> <span class="nf">register_plugins</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="n">PORTAL_SERVICES_PLUGIN_MODULES</span> <span class="o">=</span> <span class="p">[</span>
<span class="n">mod_import</span><span class="p">(</span><span class="n">module</span><span class="p">)</span> <span class="k">for</span> <span class="n">module</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">PORTAL_SERVICES_PLUGIN_MODULES</span><span class="p">)</span>
<span class="p">]</span>
<span class="k">for</span> <span class="n">plugin_module</span> <span class="ow">in</span> <span class="n">PORTAL_SERVICES_PLUGIN_MODULES</span><span class="p">:</span>
<span class="c1"># external plugin services to start</span>
<span class="k">if</span> <span class="n">plugin_module</span><span class="p">:</span>
<span class="n">plugin_module</span><span class="o">.</span><span class="n">start_plugin_services</span><span class="p">(</span><span class="bp">self</span><span class="p">)</span></div>
<div class="viewcode-block" id="EvenniaPortalService.check_lockdown"><a class="viewcode-back" href="../../../../api/evennia.server.portal.service.html#evennia.server.portal.service.EvenniaPortalService.check_lockdown">[docs]</a> <span class="k">def</span> <span class="nf">check_lockdown</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">interfaces</span><span class="p">:</span> <span class="nb">list</span><span class="p">[</span><span class="nb">str</span><span class="p">]):</span>
<span class="k">if</span> <span class="n">settings</span><span class="o">.</span><span class="n">LOCKDOWN_MODE</span><span class="p">:</span>
<span class="k">return</span> <span class="p">[</span><span class="s2">&quot;127.0.0.1&quot;</span><span class="p">]</span>
<span class="k">return</span> <span class="n">interfaces</span></div>
<div class="viewcode-block" id="EvenniaPortalService.register_ssl"><a class="viewcode-back" href="../../../../api/evennia.server.portal.service.html#evennia.server.portal.service.EvenniaPortalService.register_ssl">[docs]</a> <span class="k">def</span> <span class="nf">register_ssl</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="c1"># Start Telnet+SSL game connection (requires PyOpenSSL).</span>
<span class="kn">from</span> <span class="nn">evennia.server.portal</span> <span class="kn">import</span> <span class="n">telnet_ssl</span>
<span class="n">_ssl_protocol</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">SSL_PROTOCOL_CLASS</span><span class="p">)</span>
<span class="n">interfaces</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">check_lockdown</span><span class="p">(</span><span class="n">settings</span><span class="o">.</span><span class="n">SSL_INTERFACES</span><span class="p">)</span>
<span class="k">for</span> <span class="n">interface</span> <span class="ow">in</span> <span class="n">interfaces</span><span class="p">:</span>
<span class="n">ifacestr</span> <span class="o">=</span> <span class="s2">&quot;&quot;</span>
<span class="k">if</span> <span class="n">interface</span> <span class="ow">not</span> <span class="ow">in</span> <span class="p">(</span><span class="s2">&quot;0.0.0.0&quot;</span><span class="p">,</span> <span class="s2">&quot;::&quot;</span><span class="p">)</span> <span class="ow">or</span> <span class="nb">len</span><span class="p">(</span><span class="n">interfaces</span><span class="p">)</span> <span class="o">&gt;</span> <span class="mi">1</span><span class="p">:</span>
<span class="n">ifacestr</span> <span class="o">=</span> <span class="s2">&quot;-</span><span class="si">%s</span><span class="s2">&quot;</span> <span class="o">%</span> <span class="n">interface</span>
<span class="k">for</span> <span class="n">port</span> <span class="ow">in</span> <span class="n">settings</span><span class="o">.</span><span class="n">SSL_PORTS</span><span class="p">:</span>
<span class="n">pstring</span> <span class="o">=</span> <span class="s2">&quot;</span><span class="si">%s</span><span class="s2">:</span><span class="si">%s</span><span class="s2">&quot;</span> <span class="o">%</span> <span class="p">(</span><span class="n">ifacestr</span><span class="p">,</span> <span class="n">port</span><span class="p">)</span>
<span class="n">factory</span> <span class="o">=</span> <span class="n">protocol</span><span class="o">.</span><span class="n">ServerFactory</span><span class="p">()</span>
<span class="n">factory</span><span class="o">.</span><span class="n">noisy</span> <span class="o">=</span> <span class="kc">False</span>
<span class="n">factory</span><span class="o">.</span><span class="n">sessionhandler</span> <span class="o">=</span> <span class="n">evennia</span><span class="o">.</span><span class="n">PORTAL_SESSION_HANDLER</span>
<span class="n">factory</span><span class="o">.</span><span class="n">protocol</span> <span class="o">=</span> <span class="n">_ssl_protocol</span>
<span class="n">ssl_context</span> <span class="o">=</span> <span class="n">telnet_ssl</span><span class="o">.</span><span class="n">getSSLContext</span><span class="p">()</span>
<span class="k">if</span> <span class="n">ssl_context</span><span class="p">:</span>
<span class="n">ssl_service</span> <span class="o">=</span> <span class="n">internet</span><span class="o">.</span><span class="n">SSLServer</span><span class="p">(</span>
<span class="n">port</span><span class="p">,</span> <span class="n">factory</span><span class="p">,</span> <span class="n">telnet_ssl</span><span class="o">.</span><span class="n">getSSLContext</span><span class="p">(),</span> <span class="n">interface</span><span class="o">=</span><span class="n">interface</span>
<span class="p">)</span>
<span class="n">ssl_service</span><span class="o">.</span><span class="n">setName</span><span class="p">(</span><span class="s2">&quot;EvenniaSSL</span><span class="si">%s</span><span class="s2">&quot;</span> <span class="o">%</span> <span class="n">pstring</span><span class="p">)</span>
<span class="n">ssl_service</span><span class="o">.</span><span class="n">setServiceParent</span><span class="p">(</span><span class="bp">self</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">info_dict</span><span class="p">[</span><span class="s2">&quot;telnet_ssl&quot;</span><span class="p">]</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="s2">&quot;telnet+ssl</span><span class="si">%s</span><span class="s2">: </span><span class="si">%s</span><span class="s2">&quot;</span> <span class="o">%</span> <span class="p">(</span><span class="n">ifacestr</span><span class="p">,</span> <span class="n">port</span><span class="p">))</span>
<span class="k">else</span><span class="p">:</span>
<span class="bp">self</span><span class="o">.</span><span class="n">info_dict</span><span class="p">[</span><span class="s2">&quot;telnet_ssl&quot;</span><span class="p">]</span><span class="o">.</span><span class="n">append</span><span class="p">(</span>
<span class="s2">&quot;telnet+ssl</span><span class="si">%s</span><span class="s2">: </span><span class="si">%s</span><span class="s2"> (deactivated - keys/cert unset)&quot;</span> <span class="o">%</span> <span class="p">(</span><span class="n">ifacestr</span><span class="p">,</span> <span class="n">port</span><span class="p">)</span>
<span class="p">)</span></div>
<div class="viewcode-block" id="EvenniaPortalService.register_ssh"><a class="viewcode-back" href="../../../../api/evennia.server.portal.service.html#evennia.server.portal.service.EvenniaPortalService.register_ssh">[docs]</a> <span class="k">def</span> <span class="nf">register_ssh</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="c1"># Start SSH game connections. Will create a keypair in</span>
<span class="c1"># evennia/game if necessary.</span>
<span class="kn">from</span> <span class="nn">evennia.server.portal</span> <span class="kn">import</span> <span class="n">ssh</span>
<span class="n">_ssh_protocol</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">SSH_PROTOCOL_CLASS</span><span class="p">)</span>
<span class="n">interfaces</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">check_lockdown</span><span class="p">(</span><span class="n">settings</span><span class="o">.</span><span class="n">SSH_INTERFACES</span><span class="p">)</span>
<span class="k">for</span> <span class="n">interface</span> <span class="ow">in</span> <span class="n">interfaces</span><span class="p">:</span>
<span class="n">ifacestr</span> <span class="o">=</span> <span class="s2">&quot;&quot;</span>
<span class="k">if</span> <span class="n">interface</span> <span class="ow">not</span> <span class="ow">in</span> <span class="p">(</span><span class="s2">&quot;0.0.0.0&quot;</span><span class="p">,</span> <span class="s2">&quot;::&quot;</span><span class="p">)</span> <span class="ow">or</span> <span class="nb">len</span><span class="p">(</span><span class="n">interfaces</span><span class="p">)</span> <span class="o">&gt;</span> <span class="mi">1</span><span class="p">:</span>
<span class="n">ifacestr</span> <span class="o">=</span> <span class="s2">&quot;-</span><span class="si">%s</span><span class="s2">&quot;</span> <span class="o">%</span> <span class="n">interface</span>
<span class="k">for</span> <span class="n">port</span> <span class="ow">in</span> <span class="n">settings</span><span class="o">.</span><span class="n">SSH_PORTS</span><span class="p">:</span>
<span class="n">pstring</span> <span class="o">=</span> <span class="s2">&quot;</span><span class="si">%s</span><span class="s2">:</span><span class="si">%s</span><span class="s2">&quot;</span> <span class="o">%</span> <span class="p">(</span><span class="n">ifacestr</span><span class="p">,</span> <span class="n">port</span><span class="p">)</span>
<span class="n">factory</span> <span class="o">=</span> <span class="n">ssh</span><span class="o">.</span><span class="n">makeFactory</span><span class="p">(</span>
<span class="p">{</span>
<span class="s2">&quot;protocolFactory&quot;</span><span class="p">:</span> <span class="n">_ssh_protocol</span><span class="p">,</span>
<span class="s2">&quot;protocolArgs&quot;</span><span class="p">:</span> <span class="p">(),</span>
<span class="s2">&quot;sessions&quot;</span><span class="p">:</span> <span class="n">evennia</span><span class="o">.</span><span class="n">PORTAL_SESSION_HANDLER</span><span class="p">,</span>
<span class="p">}</span>
<span class="p">)</span>
<span class="n">factory</span><span class="o">.</span><span class="n">noisy</span> <span class="o">=</span> <span class="kc">False</span>
<span class="n">ssh_service</span> <span class="o">=</span> <span class="n">internet</span><span class="o">.</span><span class="n">TCPServer</span><span class="p">(</span><span class="n">port</span><span class="p">,</span> <span class="n">factory</span><span class="p">,</span> <span class="n">interface</span><span class="o">=</span><span class="n">interface</span><span class="p">)</span>
<span class="n">ssh_service</span><span class="o">.</span><span class="n">setName</span><span class="p">(</span><span class="s2">&quot;EvenniaSSH</span><span class="si">%s</span><span class="s2">&quot;</span> <span class="o">%</span> <span class="n">pstring</span><span class="p">)</span>
<span class="n">ssh_service</span><span class="o">.</span><span class="n">setServiceParent</span><span class="p">(</span><span class="bp">self</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">info_dict</span><span class="p">[</span><span class="s2">&quot;ssh&quot;</span><span class="p">]</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="s2">&quot;ssh</span><span class="si">%s</span><span class="s2">: </span><span class="si">%s</span><span class="s2">&quot;</span> <span class="o">%</span> <span class="p">(</span><span class="n">ifacestr</span><span class="p">,</span> <span class="n">port</span><span class="p">))</span></div>
<div class="viewcode-block" id="EvenniaPortalService.register_webserver"><a class="viewcode-back" href="../../../../api/evennia.server.portal.service.html#evennia.server.portal.service.EvenniaPortalService.register_webserver">[docs]</a> <span class="k">def</span> <span class="nf">register_webserver</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="kn">from</span> <span class="nn">evennia.server.webserver</span> <span class="kn">import</span> <span class="n">EvenniaReverseProxyResource</span><span class="p">,</span> <span class="n">Website</span>
<span class="c1"># Start a reverse proxy to relay data to the Server-side webserver</span>
<span class="n">interfaces</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">check_lockdown</span><span class="p">(</span><span class="n">settings</span><span class="o">.</span><span class="n">WEBSERVER_INTERFACES</span><span class="p">)</span>
<span class="n">websocket_started</span> <span class="o">=</span> <span class="kc">False</span>
<span class="n">_websocket_protocol</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">WEBSOCKET_PROTOCOL_CLASS</span><span class="p">)</span>
<span class="k">for</span> <span class="n">interface</span> <span class="ow">in</span> <span class="n">interfaces</span><span class="p">:</span>
<span class="n">ifacestr</span> <span class="o">=</span> <span class="s2">&quot;&quot;</span>
<span class="k">if</span> <span class="n">interface</span> <span class="ow">not</span> <span class="ow">in</span> <span class="p">(</span><span class="s2">&quot;0.0.0.0&quot;</span><span class="p">,</span> <span class="s2">&quot;::&quot;</span><span class="p">)</span> <span class="ow">or</span> <span class="nb">len</span><span class="p">(</span><span class="n">interfaces</span><span class="p">)</span> <span class="o">&gt;</span> <span class="mi">1</span><span class="p">:</span>
<span class="n">ifacestr</span> <span class="o">=</span> <span class="s2">&quot;-</span><span class="si">%s</span><span class="s2">&quot;</span> <span class="o">%</span> <span class="n">interface</span>
<span class="k">for</span> <span class="n">proxyport</span><span class="p">,</span> <span class="n">serverport</span> <span class="ow">in</span> <span class="n">settings</span><span class="o">.</span><span class="n">WEBSERVER_PORTS</span><span class="p">:</span>
<span class="n">web_root</span> <span class="o">=</span> <span class="n">EvenniaReverseProxyResource</span><span class="p">(</span><span class="s2">&quot;127.0.0.1&quot;</span><span class="p">,</span> <span class="n">serverport</span><span class="p">,</span> <span class="s2">&quot;&quot;</span><span class="p">)</span>
<span class="n">webclientstr</span> <span class="o">=</span> <span class="s2">&quot;&quot;</span>
<span class="k">if</span> <span class="n">settings</span><span class="o">.</span><span class="n">WEBCLIENT_ENABLED</span><span class="p">:</span>
<span class="c1"># create ajax client processes at /webclientdata</span>
<span class="kn">from</span> <span class="nn">evennia.server.portal</span> <span class="kn">import</span> <span class="n">webclient_ajax</span>
<span class="n">ajax_webclient</span> <span class="o">=</span> <span class="n">webclient_ajax</span><span class="o">.</span><span class="n">AjaxWebClient</span><span class="p">()</span>
<span class="n">ajax_webclient</span><span class="o">.</span><span class="n">sessionhandler</span> <span class="o">=</span> <span class="n">evennia</span><span class="o">.</span><span class="n">PORTAL_SESSION_HANDLER</span>
<span class="n">web_root</span><span class="o">.</span><span class="n">putChild</span><span class="p">(</span><span class="sa">b</span><span class="s2">&quot;webclientdata&quot;</span><span class="p">,</span> <span class="n">ajax_webclient</span><span class="p">)</span>
<span class="n">webclientstr</span> <span class="o">=</span> <span class="s2">&quot;webclient (ajax only)&quot;</span>
<span class="k">if</span> <span class="p">(</span>
<span class="n">settings</span><span class="o">.</span><span class="n">WEBSOCKET_CLIENT_ENABLED</span>
<span class="ow">and</span> <span class="n">settings</span><span class="o">.</span><span class="n">WEBSOCKET_CLIENT_PORT</span>
<span class="ow">and</span> <span class="n">settings</span><span class="o">.</span><span class="n">WEBSOCKET_CLIENT_INTERFACE</span>
<span class="p">)</span> <span class="ow">and</span> <span class="ow">not</span> <span class="n">websocket_started</span><span class="p">:</span>
<span class="c1"># start websocket client port for the webclient</span>
<span class="c1"># we only support one websocket client</span>
<span class="kn">from</span> <span class="nn">autobahn.twisted.websocket</span> <span class="kn">import</span> <span class="n">WebSocketServerFactory</span>
<span class="kn">from</span> <span class="nn">evennia.server.portal</span> <span class="kn">import</span> <span class="n">webclient</span> <span class="c1"># noqa</span>
<span class="n">w_interface</span> <span class="o">=</span> <span class="p">(</span>
<span class="s2">&quot;127.0.0.1&quot;</span>
<span class="k">if</span> <span class="n">settings</span><span class="o">.</span><span class="n">LOCKDOWN_MODE</span>
<span class="k">else</span> <span class="n">settings</span><span class="o">.</span><span class="n">WEBSOCKET_CLIENT_INTERFACE</span>
<span class="p">)</span>
<span class="n">w_ifacestr</span> <span class="o">=</span> <span class="s2">&quot;&quot;</span>
<span class="k">if</span> <span class="p">(</span>
<span class="n">w_interface</span> <span class="ow">not</span> <span class="ow">in</span> <span class="p">(</span><span class="s2">&quot;0.0.0.0&quot;</span><span class="p">,</span> <span class="s2">&quot;::&quot;</span><span class="p">)</span>
<span class="ow">or</span> <span class="nb">len</span><span class="p">(</span><span class="n">settings</span><span class="o">.</span><span class="n">WEBSERVER_INTERFACES</span><span class="p">)</span> <span class="o">&gt;</span> <span class="mi">1</span>
<span class="p">):</span>
<span class="n">w_ifacestr</span> <span class="o">=</span> <span class="s2">&quot;-</span><span class="si">%s</span><span class="s2">&quot;</span> <span class="o">%</span> <span class="n">w_interface</span>
<span class="n">port</span> <span class="o">=</span> <span class="n">settings</span><span class="o">.</span><span class="n">WEBSOCKET_CLIENT_PORT</span>
<span class="k">class</span> <span class="nc">Websocket</span><span class="p">(</span><span class="n">WebSocketServerFactory</span><span class="p">):</span>
<span class="s2">&quot;Only here for better naming in logs&quot;</span>
<span class="k">pass</span>
<span class="n">factory</span> <span class="o">=</span> <span class="n">Websocket</span><span class="p">()</span>
<span class="n">factory</span><span class="o">.</span><span class="n">noisy</span> <span class="o">=</span> <span class="kc">False</span>
<span class="n">factory</span><span class="o">.</span><span class="n">protocol</span> <span class="o">=</span> <span class="n">_websocket_protocol</span>
<span class="n">factory</span><span class="o">.</span><span class="n">sessionhandler</span> <span class="o">=</span> <span class="n">evennia</span><span class="o">.</span><span class="n">PORTAL_SESSION_HANDLER</span>
<span class="n">websocket_service</span> <span class="o">=</span> <span class="n">internet</span><span class="o">.</span><span class="n">TCPServer</span><span class="p">(</span><span class="n">port</span><span class="p">,</span> <span class="n">factory</span><span class="p">,</span> <span class="n">interface</span><span class="o">=</span><span class="n">w_interface</span><span class="p">)</span>
<span class="n">websocket_service</span><span class="o">.</span><span class="n">setName</span><span class="p">(</span><span class="s2">&quot;EvenniaWebSocket</span><span class="si">%s</span><span class="s2">:</span><span class="si">%s</span><span class="s2">&quot;</span> <span class="o">%</span> <span class="p">(</span><span class="n">w_ifacestr</span><span class="p">,</span> <span class="n">port</span><span class="p">))</span>
<span class="n">websocket_service</span><span class="o">.</span><span class="n">setServiceParent</span><span class="p">(</span><span class="bp">self</span><span class="p">)</span>
<span class="n">websocket_started</span> <span class="o">=</span> <span class="kc">True</span>
<span class="n">webclientstr</span> <span class="o">=</span> <span class="s2">&quot;webclient-websocket</span><span class="si">%s</span><span class="s2">: </span><span class="si">%s</span><span class="s2">&quot;</span> <span class="o">%</span> <span class="p">(</span><span class="n">w_ifacestr</span><span class="p">,</span> <span class="n">port</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">info_dict</span><span class="p">[</span><span class="s2">&quot;webclient&quot;</span><span class="p">]</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">webclientstr</span><span class="p">)</span>
<span class="k">try</span><span class="p">:</span>
<span class="n">WEB_PLUGINS_MODULE</span> <span class="o">=</span> <span class="n">mod_import</span><span class="p">(</span><span class="n">settings</span><span class="o">.</span><span class="n">WEB_PLUGINS_MODULE</span><span class="p">)</span>
<span class="k">except</span> <span class="ne">ImportError</span><span class="p">:</span>
<span class="n">WEB_PLUGINS_MODULE</span> <span class="o">=</span> <span class="kc">None</span>
<span class="bp">self</span><span class="o">.</span><span class="n">info_dict</span><span class="p">[</span><span class="s2">&quot;errors&quot;</span><span class="p">]</span> <span class="o">=</span> <span class="p">(</span>
<span class="s2">&quot;WARNING: settings.WEB_PLUGINS_MODULE not found - &quot;</span>
<span class="s2">&quot;copy &#39;evennia/game_template/server/conf/web_plugins.py to &quot;</span>
<span class="s2">&quot;mygame/server/conf.&quot;</span>
<span class="p">)</span>
<span class="k">if</span> <span class="n">WEB_PLUGINS_MODULE</span><span class="p">:</span>
<span class="k">try</span><span class="p">:</span>
<span class="n">web_root</span> <span class="o">=</span> <span class="n">WEB_PLUGINS_MODULE</span><span class="o">.</span><span class="n">at_webproxy_root_creation</span><span class="p">(</span><span class="n">web_root</span><span class="p">)</span>
<span class="k">except</span> <span class="ne">Exception</span><span class="p">:</span>
<span class="c1"># Legacy user has not added an at_webproxy_root_creation function in existing</span>
<span class="c1"># web plugins file</span>
<span class="bp">self</span><span class="o">.</span><span class="n">info_dict</span><span class="p">[</span><span class="s2">&quot;errors&quot;</span><span class="p">]</span> <span class="o">=</span> <span class="p">(</span>
<span class="s2">&quot;WARNING: WEB_PLUGINS_MODULE is enabled but at_webproxy_root_creation() &quot;</span>
<span class="s2">&quot;not found copy &#39;evennia/game_template/server/conf/web_plugins.py to &quot;</span>
<span class="s2">&quot;mygame/server/conf.&quot;</span>
<span class="p">)</span>
<span class="n">web_root</span> <span class="o">=</span> <span class="n">Website</span><span class="p">(</span><span class="n">web_root</span><span class="p">,</span> <span class="n">logPath</span><span class="o">=</span><span class="n">settings</span><span class="o">.</span><span class="n">HTTP_LOG_FILE</span><span class="p">)</span>
<span class="n">web_root</span><span class="o">.</span><span class="n">is_portal</span> <span class="o">=</span> <span class="kc">True</span>
<span class="n">proxy_service</span> <span class="o">=</span> <span class="n">internet</span><span class="o">.</span><span class="n">TCPServer</span><span class="p">(</span><span class="n">proxyport</span><span class="p">,</span> <span class="n">web_root</span><span class="p">,</span> <span class="n">interface</span><span class="o">=</span><span class="n">interface</span><span class="p">)</span>
<span class="n">proxy_service</span><span class="o">.</span><span class="n">setName</span><span class="p">(</span><span class="s2">&quot;EvenniaWebProxy</span><span class="si">%s</span><span class="s2">:</span><span class="si">%s</span><span class="s2">&quot;</span> <span class="o">%</span> <span class="p">(</span><span class="n">ifacestr</span><span class="p">,</span> <span class="n">proxyport</span><span class="p">))</span>
<span class="n">proxy_service</span><span class="o">.</span><span class="n">setServiceParent</span><span class="p">(</span><span class="bp">self</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">info_dict</span><span class="p">[</span><span class="s2">&quot;webserver_proxy&quot;</span><span class="p">]</span><span class="o">.</span><span class="n">append</span><span class="p">(</span>
<span class="s2">&quot;webserver-proxy</span><span class="si">%s</span><span class="s2">: </span><span class="si">%s</span><span class="s2">&quot;</span> <span class="o">%</span> <span class="p">(</span><span class="n">ifacestr</span><span class="p">,</span> <span class="n">proxyport</span><span class="p">)</span>
<span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">info_dict</span><span class="p">[</span><span class="s2">&quot;webserver_internal&quot;</span><span class="p">]</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="s2">&quot;webserver: </span><span class="si">%s</span><span class="s2">&quot;</span> <span class="o">%</span> <span class="n">serverport</span><span class="p">)</span></div>
<div class="viewcode-block" id="EvenniaPortalService.register_telnet"><a class="viewcode-back" href="../../../../api/evennia.server.portal.service.html#evennia.server.portal.service.EvenniaPortalService.register_telnet">[docs]</a> <span class="k">def</span> <span class="nf">register_telnet</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="c1"># Start telnet game connections</span>
<span class="kn">from</span> <span class="nn">evennia.server.portal</span> <span class="kn">import</span> <span class="n">telnet</span>
<span class="n">_telnet_protocol</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">TELNET_PROTOCOL_CLASS</span><span class="p">)</span>
<span class="n">interfaces</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">check_lockdown</span><span class="p">(</span><span class="n">settings</span><span class="o">.</span><span class="n">TELNET_INTERFACES</span><span class="p">)</span>
<span class="k">for</span> <span class="n">interface</span> <span class="ow">in</span> <span class="n">interfaces</span><span class="p">:</span>
<span class="n">ifacestr</span> <span class="o">=</span> <span class="s2">&quot;&quot;</span>
<span class="k">if</span> <span class="n">interface</span> <span class="ow">not</span> <span class="ow">in</span> <span class="p">(</span><span class="s2">&quot;0.0.0.0&quot;</span><span class="p">,</span> <span class="s2">&quot;::&quot;</span><span class="p">)</span> <span class="ow">or</span> <span class="nb">len</span><span class="p">(</span><span class="n">interfaces</span><span class="p">)</span> <span class="o">&gt;</span> <span class="mi">1</span><span class="p">:</span>
<span class="n">ifacestr</span> <span class="o">=</span> <span class="s2">&quot;-</span><span class="si">%s</span><span class="s2">&quot;</span> <span class="o">%</span> <span class="n">interface</span>
<span class="k">for</span> <span class="n">port</span> <span class="ow">in</span> <span class="n">settings</span><span class="o">.</span><span class="n">TELNET_PORTS</span><span class="p">:</span>
<span class="n">pstring</span> <span class="o">=</span> <span class="s2">&quot;</span><span class="si">%s</span><span class="s2">:</span><span class="si">%s</span><span class="s2">&quot;</span> <span class="o">%</span> <span class="p">(</span><span class="n">ifacestr</span><span class="p">,</span> <span class="n">port</span><span class="p">)</span>
<span class="n">factory</span> <span class="o">=</span> <span class="n">telnet</span><span class="o">.</span><span class="n">TelnetServerFactory</span><span class="p">()</span>
<span class="n">factory</span><span class="o">.</span><span class="n">noisy</span> <span class="o">=</span> <span class="kc">False</span>
<span class="n">factory</span><span class="o">.</span><span class="n">protocol</span> <span class="o">=</span> <span class="n">_telnet_protocol</span>
<span class="n">factory</span><span class="o">.</span><span class="n">sessionhandler</span> <span class="o">=</span> <span class="n">evennia</span><span class="o">.</span><span class="n">PORTAL_SESSION_HANDLER</span>
<span class="n">telnet_service</span> <span class="o">=</span> <span class="n">internet</span><span class="o">.</span><span class="n">TCPServer</span><span class="p">(</span><span class="n">port</span><span class="p">,</span> <span class="n">factory</span><span class="p">,</span> <span class="n">interface</span><span class="o">=</span><span class="n">interface</span><span class="p">)</span>
<span class="n">telnet_service</span><span class="o">.</span><span class="n">setName</span><span class="p">(</span><span class="s2">&quot;EvenniaTelnet</span><span class="si">%s</span><span class="s2">&quot;</span> <span class="o">%</span> <span class="n">pstring</span><span class="p">)</span>
<span class="n">telnet_service</span><span class="o">.</span><span class="n">setServiceParent</span><span class="p">(</span><span class="bp">self</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">info_dict</span><span class="p">[</span><span class="s2">&quot;telnet&quot;</span><span class="p">]</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="s2">&quot;telnet</span><span class="si">%s</span><span class="s2">: </span><span class="si">%s</span><span class="s2">&quot;</span> <span class="o">%</span> <span class="p">(</span><span class="n">ifacestr</span><span class="p">,</span> <span class="n">port</span><span class="p">))</span></div>
<div class="viewcode-block" id="EvenniaPortalService.register_amp"><a class="viewcode-back" href="../../../../api/evennia.server.portal.service.html#evennia.server.portal.service.EvenniaPortalService.register_amp">[docs]</a> <span class="k">def</span> <span class="nf">register_amp</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="c1"># The AMP protocol handles the communication between</span>
<span class="c1"># the portal and the mud server. Only reason to ever deactivate</span>
<span class="c1"># it would be during testing and debugging.</span>
<span class="kn">from</span> <span class="nn">evennia.server.portal</span> <span class="kn">import</span> <span class="n">amp_server</span>
<span class="bp">self</span><span class="o">.</span><span class="n">info_dict</span><span class="p">[</span><span class="s2">&quot;amp&quot;</span><span class="p">]</span> <span class="o">=</span> <span class="s2">&quot;amp: </span><span class="si">%s</span><span class="s2">&quot;</span> <span class="o">%</span> <span class="n">settings</span><span class="o">.</span><span class="n">AMP_PORT</span>
<span class="n">factory</span> <span class="o">=</span> <span class="n">amp_server</span><span class="o">.</span><span class="n">AMPServerFactory</span><span class="p">(</span><span class="bp">self</span><span class="p">)</span>
<span class="n">amp_service</span> <span class="o">=</span> <span class="n">internet</span><span class="o">.</span><span class="n">TCPServer</span><span class="p">(</span>
<span class="n">settings</span><span class="o">.</span><span class="n">AMP_PORT</span><span class="p">,</span> <span class="n">factory</span><span class="p">,</span> <span class="n">interface</span><span class="o">=</span><span class="n">settings</span><span class="o">.</span><span class="n">AMP_INTERFACE</span>
<span class="p">)</span>
<span class="n">amp_service</span><span class="o">.</span><span class="n">setName</span><span class="p">(</span><span class="s2">&quot;PortalAMPServer&quot;</span><span class="p">)</span>
<span class="n">amp_service</span><span class="o">.</span><span class="n">setServiceParent</span><span class="p">(</span><span class="bp">self</span><span class="p">)</span></div>
<span class="k">def</span> <span class="nf">_get_backup_server_twistd_cmd</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="w"> </span><span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> For interactive Portal mode there is no way to get the server cmdline from the launcher, so</span>
<span class="sd"> we need to guess it here (it&#39;s very likely to not change)</span>
<span class="sd"> Returns:</span>
<span class="sd"> server_twistd_cmd (list): An instruction for starting the server, to pass to Popen.</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="n">server_twistd_cmd</span> <span class="o">=</span> <span class="p">[</span>
<span class="s2">&quot;twistd&quot;</span><span class="p">,</span>
<span class="s2">&quot;--python=</span><span class="si">{}</span><span class="s2">&quot;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">os</span><span class="o">.</span><span class="n">path</span><span class="o">.</span><span class="n">join</span><span class="p">(</span><span class="n">dirname</span><span class="p">(</span><span class="n">dirname</span><span class="p">(</span><span class="n">abspath</span><span class="p">(</span><span class="vm">__file__</span><span class="p">))),</span> <span class="s2">&quot;server.py&quot;</span><span class="p">)),</span>
<span class="p">]</span>
<span class="k">if</span> <span class="n">os</span><span class="o">.</span><span class="n">name</span> <span class="o">!=</span> <span class="s2">&quot;nt&quot;</span><span class="p">:</span>
<span class="n">gamedir</span> <span class="o">=</span> <span class="n">os</span><span class="o">.</span><span class="n">getcwd</span><span class="p">()</span>
<span class="n">server_twistd_cmd</span><span class="o">.</span><span class="n">append</span><span class="p">(</span>
<span class="s2">&quot;--pidfile=</span><span class="si">{}</span><span class="s2">&quot;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">os</span><span class="o">.</span><span class="n">path</span><span class="o">.</span><span class="n">join</span><span class="p">(</span><span class="n">gamedir</span><span class="p">,</span> <span class="s2">&quot;server&quot;</span><span class="p">,</span> <span class="s2">&quot;server.pid&quot;</span><span class="p">))</span>
<span class="p">)</span>
<span class="k">return</span> <span class="n">server_twistd_cmd</span>
<div class="viewcode-block" id="EvenniaPortalService.get_info_dict"><a class="viewcode-back" href="../../../../api/evennia.server.portal.service.html#evennia.server.portal.service.EvenniaPortalService.get_info_dict">[docs]</a> <span class="k">def</span> <span class="nf">get_info_dict</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="w"> </span><span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> Return the Portal info, for display.</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">info_dict</span></div>
<div class="viewcode-block" id="EvenniaPortalService.shutdown"><a class="viewcode-back" href="../../../../api/evennia.server.portal.service.html#evennia.server.portal.service.EvenniaPortalService.shutdown">[docs]</a> <span class="k">def</span> <span class="nf">shutdown</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">_reactor_stopping</span><span class="o">=</span><span class="kc">False</span><span class="p">,</span> <span class="n">_stop_server</span><span class="o">=</span><span class="kc">False</span><span class="p">):</span>
<span class="w"> </span><span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> Shuts down the server from inside it.</span>
<span class="sd"> Args:</span>
<span class="sd"> _reactor_stopping (bool, optional): This is set if server</span>
<span class="sd"> is already in the process of shutting down; in this case</span>
<span class="sd"> we don&#39;t need to stop it again.</span>
<span class="sd"> _stop_server (bool, optional): Only used in portal-interactive mode;</span>
<span class="sd"> makes sure to stop the Server cleanly.</span>
<span class="sd"> Note that restarting (regardless of the setting) will not work</span>
<span class="sd"> if the Portal is currently running in daemon mode. In that</span>
<span class="sd"> case it always needs to be restarted manually.</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="k">if</span> <span class="n">_reactor_stopping</span> <span class="ow">and</span> <span class="nb">hasattr</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="s2">&quot;shutdown_complete&quot;</span><span class="p">):</span>
<span class="c1"># we get here due to us calling reactor.stop below. No need</span>
<span class="c1"># to do the shutdown procedure again.</span>
<span class="k">return</span>
<span class="n">evennia</span><span class="o">.</span><span class="n">PORTAL_SESSION_HANDLER</span><span class="o">.</span><span class="n">disconnect_all</span><span class="p">()</span>
<span class="k">if</span> <span class="n">_stop_server</span><span class="p">:</span>
<span class="bp">self</span><span class="o">.</span><span class="n">amp_protocol</span><span class="o">.</span><span class="n">stop_server</span><span class="p">(</span><span class="n">mode</span><span class="o">=</span><span class="s2">&quot;shutdown&quot;</span><span class="p">)</span>
<span class="k">if</span> <span class="ow">not</span> <span class="n">_reactor_stopping</span><span class="p">:</span>
<span class="c1"># shutting down the reactor will trigger another signal. We set</span>
<span class="c1"># a flag to avoid loops.</span>
<span class="bp">self</span><span class="o">.</span><span class="n">shutdown_complete</span> <span class="o">=</span> <span class="kc">True</span>
<span class="n">reactor</span><span class="o">.</span><span class="n">callLater</span><span class="p">(</span><span class="mi">0</span><span class="p">,</span> <span class="n">reactor</span><span class="o">.</span><span class="n">stop</span><span class="p">)</span></div></div>
</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 2.x</a> &#187;</li>
<li class="nav-item nav-item-1"><a href="../../../index.html" >Module code</a> &#187;</li>
<li class="nav-item nav-item-2"><a href="../../../evennia.html" >evennia</a> &#187;</li>
<li class="nav-item nav-item-this"><a href="">evennia.server.portal.service</a></li>
</ul>
</div>
<div class="footer" role="contentinfo">
&#169; Copyright 2023, The Evennia developer community.
Created using <a href="https://www.sphinx-doc.org/">Sphinx</a> 3.2.1.
</div>
</body>
</html>

View file

@ -109,9 +109,9 @@
<span class="kn">import</span> <span class="nn">evennia</span>
<span class="kn">from</span> <span class="nn">evennia.server.portal</span> <span class="kn">import</span> <span class="n">irc</span>
<span class="kn">from</span> <span class="nn">evennia.utils.test_resources</span> <span class="kn">import</span> <span class="n">BaseEvenniaTest</span>
<span class="kn">from</span> <span class="nn">evennia.server.portal.service</span> <span class="kn">import</span> <span class="n">EvenniaPortalService</span>
<span class="kn">from</span> <span class="nn">evennia.server.portal.portalsessionhandler</span> <span class="kn">import</span> <span class="n">PortalSessionHandler</span>
<span class="kn">from</span> <span class="nn">evennia.server.portal.service</span> <span class="kn">import</span> <span class="n">EvenniaPortalService</span>
<span class="kn">from</span> <span class="nn">evennia.utils.test_resources</span> <span class="kn">import</span> <span class="n">BaseEvenniaTest</span>
<span class="kn">from</span> <span class="nn">.amp</span> <span class="kn">import</span> <span class="p">(</span>
<span class="n">AMP_MAXLEN</span><span class="p">,</span>

View file

@ -0,0 +1,808 @@
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>evennia.server.service &#8212; Evennia 2.x 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 2.x</a> &#187;</li>
<li class="nav-item nav-item-1"><a href="../../index.html" >Module code</a> &#187;</li>
<li class="nav-item nav-item-2"><a href="../../evennia.html" accesskey="U">evennia</a> &#187;</li>
<li class="nav-item nav-item-this"><a href="">evennia.server.service</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>Doc Versions</h3>
<ul>
<li><a href="service.html">2.x (main branch)</a></li>
<ul>
<li><a href="../1.3.0/index.html">1.3.0 (v1.3.0 branch)</a></li>
<li><a href="../0.9.5/index.html">0.9.5 (v0.9.5 branch)</a></li>
</ul>
</div>
</div>
<div class="bodywrapper">
<div class="body" role="main">
<h1>Source code for evennia.server.service</h1><div class="highlight"><pre>
<span></span><span class="sd">&quot;&quot;&quot;</span>
<span class="sd">This module contains the main EvenniaService class, which is the very core of the</span>
<span class="sd">Evennia server. It is instantiated by the evennia/server/server.py module.</span>
<span class="sd">&quot;&quot;&quot;</span>
<span class="kn">import</span> <span class="nn">importlib</span>
<span class="kn">import</span> <span class="nn">time</span>
<span class="kn">import</span> <span class="nn">traceback</span>
<span class="kn">import</span> <span class="nn">django</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.db</span> <span class="kn">import</span> <span class="n">connection</span>
<span class="kn">from</span> <span class="nn">django.db.utils</span> <span class="kn">import</span> <span class="n">OperationalError</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">twisted.application</span> <span class="kn">import</span> <span class="n">internet</span>
<span class="kn">from</span> <span class="nn">twisted.application.service</span> <span class="kn">import</span> <span class="n">MultiService</span>
<span class="kn">from</span> <span class="nn">twisted.internet</span> <span class="kn">import</span> <span class="n">defer</span><span class="p">,</span> <span class="n">reactor</span>
<span class="kn">from</span> <span class="nn">twisted.internet.defer</span> <span class="kn">import</span> <span class="n">Deferred</span>
<span class="kn">from</span> <span class="nn">twisted.internet.task</span> <span class="kn">import</span> <span class="n">LoopingCall</span>
<span class="kn">import</span> <span class="nn">evennia</span>
<span class="kn">from</span> <span class="nn">evennia.utils</span> <span class="kn">import</span> <span class="n">logger</span>
<span class="kn">from</span> <span class="nn">evennia.utils.utils</span> <span class="kn">import</span> <span class="n">get_evennia_version</span><span class="p">,</span> <span class="n">make_iter</span><span class="p">,</span> <span class="n">mod_import</span>
<span class="n">_SA</span> <span class="o">=</span> <span class="nb">object</span><span class="o">.</span><span class="fm">__setattr__</span>
<div class="viewcode-block" id="EvenniaServerService"><a class="viewcode-back" href="../../../api/evennia.server.service.html#evennia.server.service.EvenniaServerService">[docs]</a><span class="k">class</span> <span class="nc">EvenniaServerService</span><span class="p">(</span><span class="n">MultiService</span><span class="p">):</span>
<span class="k">def</span> <span class="nf">_wrap_sigint_handler</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="k">if</span> <span class="nb">hasattr</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="s2">&quot;web_root&quot;</span><span class="p">):</span>
<span class="n">d</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">web_root</span><span class="o">.</span><span class="n">empty_threadpool</span><span class="p">()</span>
<span class="n">d</span><span class="o">.</span><span class="n">addCallback</span><span class="p">(</span><span class="k">lambda</span> <span class="n">_</span><span class="p">:</span> <span class="bp">self</span><span class="o">.</span><span class="n">shutdown</span><span class="p">(</span><span class="s2">&quot;reload&quot;</span><span class="p">,</span> <span class="n">_reactor_stopping</span><span class="o">=</span><span class="kc">True</span><span class="p">))</span>
<span class="k">else</span><span class="p">:</span>
<span class="n">d</span> <span class="o">=</span> <span class="n">Deferred</span><span class="p">(</span><span class="k">lambda</span> <span class="n">_</span><span class="p">:</span> <span class="bp">self</span><span class="o">.</span><span class="n">shutdown</span><span class="p">(</span><span class="s2">&quot;reload&quot;</span><span class="p">,</span> <span class="n">_reactor_stopping</span><span class="o">=</span><span class="kc">True</span><span class="p">))</span>
<span class="n">d</span><span class="o">.</span><span class="n">addCallback</span><span class="p">(</span><span class="k">lambda</span> <span class="n">_</span><span class="p">:</span> <span class="n">reactor</span><span class="o">.</span><span class="n">stop</span><span class="p">())</span>
<span class="n">reactor</span><span class="o">.</span><span class="n">callLater</span><span class="p">(</span><span class="mi">1</span><span class="p">,</span> <span class="n">d</span><span class="o">.</span><span class="n">callback</span><span class="p">,</span> <span class="kc">None</span><span class="p">)</span>
<div class="viewcode-block" id="EvenniaServerService.__init__"><a class="viewcode-back" href="../../../api/evennia.server.service.html#evennia.server.service.EvenniaServerService.__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="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">maintenance_count</span> <span class="o">=</span> <span class="mi">0</span>
<span class="bp">self</span><span class="o">.</span><span class="n">amp_protocol</span> <span class="o">=</span> <span class="kc">None</span> <span class="c1"># set by amp factory</span>
<span class="bp">self</span><span class="o">.</span><span class="n">amp_service</span> <span class="o">=</span> <span class="kc">None</span>
<span class="bp">self</span><span class="o">.</span><span class="n">info_dict</span> <span class="o">=</span> <span class="p">{</span>
<span class="s2">&quot;servername&quot;</span><span class="p">:</span> <span class="n">settings</span><span class="o">.</span><span class="n">SERVERNAME</span><span class="p">,</span>
<span class="s2">&quot;version&quot;</span><span class="p">:</span> <span class="n">get_evennia_version</span><span class="p">(),</span>
<span class="s2">&quot;amp&quot;</span><span class="p">:</span> <span class="s2">&quot;&quot;</span><span class="p">,</span>
<span class="s2">&quot;errors&quot;</span><span class="p">:</span> <span class="s2">&quot;&quot;</span><span class="p">,</span>
<span class="s2">&quot;info&quot;</span><span class="p">:</span> <span class="s2">&quot;&quot;</span><span class="p">,</span>
<span class="s2">&quot;webserver&quot;</span><span class="p">:</span> <span class="s2">&quot;&quot;</span><span class="p">,</span>
<span class="s2">&quot;irc_rss&quot;</span><span class="p">:</span> <span class="s2">&quot;&quot;</span><span class="p">,</span>
<span class="p">}</span>
<span class="bp">self</span><span class="o">.</span><span class="n">_flush_cache</span> <span class="o">=</span> <span class="kc">None</span>
<span class="bp">self</span><span class="o">.</span><span class="n">_last_server_time_snapshot</span> <span class="o">=</span> <span class="mi">0</span>
<span class="bp">self</span><span class="o">.</span><span class="n">maintenance_task</span> <span class="o">=</span> <span class="kc">None</span>
<span class="c1"># Database-specific startup optimizations.</span>
<span class="bp">self</span><span class="o">.</span><span class="n">sqlite3_prep</span><span class="p">()</span>
<span class="bp">self</span><span class="o">.</span><span class="n">start_time</span> <span class="o">=</span> <span class="mi">0</span>
<span class="c1"># wrap the SIGINT handler to make sure we empty the threadpool</span>
<span class="c1"># even when we reload and we have long-running requests in queue.</span>
<span class="c1"># this is necessary over using Twisted&#39;s signal handler.</span>
<span class="c1"># (see https://github.com/evennia/evennia/issues/1128)</span>
<span class="n">reactor</span><span class="o">.</span><span class="n">sigInt</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_wrap_sigint_handler</span>
<span class="bp">self</span><span class="o">.</span><span class="n">start_stop_modules</span> <span class="o">=</span> <span class="p">[</span>
<span class="n">mod_import</span><span class="p">(</span><span class="n">mod</span><span class="p">)</span>
<span class="k">for</span> <span class="n">mod</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">AT_SERVER_STARTSTOP_MODULE</span><span class="p">)</span>
<span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">mod</span><span class="p">,</span> <span class="nb">str</span><span class="p">)</span>
<span class="p">]</span></div>
<div class="viewcode-block" id="EvenniaServerService.server_maintenance"><a class="viewcode-back" href="../../../api/evennia.server.service.html#evennia.server.service.EvenniaServerService.server_maintenance">[docs]</a> <span class="k">def</span> <span class="nf">server_maintenance</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="w"> </span><span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> This maintenance function handles repeated checks and updates that</span>
<span class="sd"> the server needs to do. It is called every minute.</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="k">if</span> <span class="ow">not</span> <span class="bp">self</span><span class="o">.</span><span class="n">_flush_cache</span><span class="p">:</span>
<span class="kn">from</span> <span class="nn">evennia.utils.idmapper.models</span> <span class="kn">import</span> <span class="n">conditional_flush</span> <span class="k">as</span> <span class="n">_FLUSH_CACHE</span>
<span class="bp">self</span><span class="o">.</span><span class="n">_flush_cache</span> <span class="o">=</span> <span class="n">_FLUSH_CACHE</span>
<span class="bp">self</span><span class="o">.</span><span class="n">maintenance_count</span> <span class="o">+=</span> <span class="mi">1</span>
<span class="n">now</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="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">maintenance_count</span> <span class="o">==</span> <span class="mi">1</span><span class="p">:</span>
<span class="c1"># first call after a reload</span>
<span class="n">evennia</span><span class="o">.</span><span class="n">gametime</span><span class="o">.</span><span class="n">SERVER_START_TIME</span> <span class="o">=</span> <span class="n">now</span>
<span class="n">evennia</span><span class="o">.</span><span class="n">gametime</span><span class="o">.</span><span class="n">SERVER_RUNTIME</span> <span class="o">=</span> <span class="n">evennia</span><span class="o">.</span><span class="n">ServerConfig</span><span class="o">.</span><span class="n">objects</span><span class="o">.</span><span class="n">conf</span><span class="p">(</span>
<span class="s2">&quot;runtime&quot;</span><span class="p">,</span> <span class="n">default</span><span class="o">=</span><span class="mf">0.0</span>
<span class="p">)</span>
<span class="n">_LAST_SERVER_TIME_SNAPSHOT</span> <span class="o">=</span> <span class="n">now</span>
<span class="k">else</span><span class="p">:</span>
<span class="c1"># adjust the runtime not with 60s but with the actual elapsed time</span>
<span class="c1"># in case this may varies slightly from 60s.</span>
<span class="n">evennia</span><span class="o">.</span><span class="n">gametime</span><span class="o">.</span><span class="n">SERVER_RUNTIME</span> <span class="o">+=</span> <span class="n">now</span> <span class="o">-</span> <span class="bp">self</span><span class="o">.</span><span class="n">_last_server_time_snapshot</span>
<span class="bp">self</span><span class="o">.</span><span class="n">_last_server_time_snapshot</span> <span class="o">=</span> <span class="n">now</span>
<span class="c1"># update game time and save it across reloads</span>
<span class="n">evennia</span><span class="o">.</span><span class="n">gametime</span><span class="o">.</span><span class="n">SERVER_RUNTIME_LAST_UPDATED</span> <span class="o">=</span> <span class="n">now</span>
<span class="n">evennia</span><span class="o">.</span><span class="n">ServerConfig</span><span class="o">.</span><span class="n">objects</span><span class="o">.</span><span class="n">conf</span><span class="p">(</span><span class="s2">&quot;runtime&quot;</span><span class="p">,</span> <span class="n">evennia</span><span class="o">.</span><span class="n">gametime</span><span class="o">.</span><span class="n">SERVER_RUNTIME</span><span class="p">)</span>
<span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">maintenance_count</span> <span class="o">%</span> <span class="mi">5</span> <span class="o">==</span> <span class="mi">0</span><span class="p">:</span>
<span class="c1"># check cache size every 5 minutes</span>
<span class="bp">self</span><span class="o">.</span><span class="n">_flush_cache</span><span class="p">(</span><span class="n">settings</span><span class="o">.</span><span class="n">IDMAPPER_CACHE_MAXSIZE</span><span class="p">)</span>
<span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">maintenance_count</span> <span class="o">%</span> <span class="p">(</span><span class="mi">60</span> <span class="o">*</span> <span class="mi">7</span><span class="p">)</span> <span class="o">==</span> <span class="mi">0</span><span class="p">:</span>
<span class="c1"># drop database connection every 7 hrs to avoid default timeouts on MySQL</span>
<span class="c1"># (see https://github.com/evennia/evennia/issues/1376)</span>
<span class="n">connection</span><span class="o">.</span><span class="n">close</span><span class="p">()</span>
<span class="bp">self</span><span class="o">.</span><span class="n">process_idle_timeouts</span><span class="p">()</span>
<span class="c1"># run unpuppet hooks for objects that are marked as being puppeted,</span>
<span class="c1"># but which lacks an account (indicates a broken unpuppet operation</span>
<span class="c1"># such as a server crash)</span>
<span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">maintenance_count</span> <span class="o">&gt;</span> <span class="mi">1</span><span class="p">:</span>
<span class="n">unpuppet_count</span> <span class="o">=</span> <span class="mi">0</span>
<span class="k">for</span> <span class="n">obj</span> <span class="ow">in</span> <span class="n">evennia</span><span class="o">.</span><span class="n">ObjectDB</span><span class="o">.</span><span class="n">objects</span><span class="o">.</span><span class="n">get_by_tag</span><span class="p">(</span><span class="n">key</span><span class="o">=</span><span class="s2">&quot;puppeted&quot;</span><span class="p">,</span> <span class="n">category</span><span class="o">=</span><span class="s2">&quot;account&quot;</span><span class="p">):</span>
<span class="k">if</span> <span class="ow">not</span> <span class="n">obj</span><span class="o">.</span><span class="n">has_account</span><span class="p">:</span>
<span class="n">obj</span><span class="o">.</span><span class="n">at_pre_unpuppet</span><span class="p">()</span>
<span class="n">obj</span><span class="o">.</span><span class="n">at_post_unpuppet</span><span class="p">(</span><span class="kc">None</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">&quot; (connection lost)&quot;</span><span class="p">))</span>
<span class="n">obj</span><span class="o">.</span><span class="n">tags</span><span class="o">.</span><span class="n">remove</span><span class="p">(</span><span class="s2">&quot;puppeted&quot;</span><span class="p">,</span> <span class="n">category</span><span class="o">=</span><span class="s2">&quot;account&quot;</span><span class="p">)</span>
<span class="n">unpuppet_count</span> <span class="o">+=</span> <span class="mi">1</span>
<span class="k">if</span> <span class="n">unpuppet_count</span><span class="p">:</span>
<span class="n">logger</span><span class="o">.</span><span class="n">log_msg</span><span class="p">(</span><span class="sa">f</span><span class="s2">&quot;Ran unpuppet-hooks for </span><span class="si">{</span><span class="n">unpuppet_count</span><span class="si">}</span><span class="s2"> link-dead puppets.&quot;</span><span class="p">)</span></div>
<div class="viewcode-block" id="EvenniaServerService.process_idle_timeouts"><a class="viewcode-back" href="../../../api/evennia.server.service.html#evennia.server.service.EvenniaServerService.process_idle_timeouts">[docs]</a> <span class="k">def</span> <span class="nf">process_idle_timeouts</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="c1"># handle idle timeouts</span>
<span class="k">if</span> <span class="n">settings</span><span class="o">.</span><span class="n">IDLE_TIMEOUT</span> <span class="o">&gt;</span> <span class="mi">0</span><span class="p">:</span>
<span class="n">now</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">&quot;idle timeout exceeded&quot;</span><span class="p">)</span>
<span class="n">to_disconnect</span> <span class="o">=</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">sess</span>
<span class="k">for</span> <span class="n">sess</span> <span class="ow">in</span> <span class="n">evennia</span><span class="o">.</span><span class="n">SESSION_HANDLER</span><span class="o">.</span><span class="n">values</span><span class="p">()</span>
<span class="k">if</span> <span class="p">(</span><span class="n">now</span> <span class="o">-</span> <span class="n">sess</span><span class="o">.</span><span class="n">cmd_last</span><span class="p">)</span> <span class="o">&gt;</span> <span class="n">settings</span><span class="o">.</span><span class="n">IDLE_TIMEOUT</span>
<span class="p">):</span>
<span class="k">if</span> <span class="ow">not</span> <span class="n">session</span><span class="o">.</span><span class="n">account</span> <span class="ow">or</span> <span class="ow">not</span> <span class="n">session</span><span class="o">.</span><span class="n">account</span><span class="o">.</span><span class="n">access</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="s2">&quot;noidletimeout&quot;</span><span class="p">,</span> <span class="n">default</span><span class="o">=</span><span class="kc">False</span>
<span class="p">):</span>
<span class="n">to_disconnect</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">session</span><span class="p">)</span>
<span class="k">for</span> <span class="n">session</span> <span class="ow">in</span> <span class="n">to_disconnect</span><span class="p">:</span>
<span class="n">evennia</span><span class="o">.</span><span class="n">SESSION_HANDLER</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>
<span class="c1"># Server startup methods</span>
<div class="viewcode-block" id="EvenniaServerService.privilegedStartService"><a class="viewcode-back" href="../../../api/evennia.server.service.html#evennia.server.service.EvenniaServerService.privilegedStartService">[docs]</a> <span class="k">def</span> <span class="nf">privilegedStartService</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="bp">self</span><span class="o">.</span><span class="n">start_time</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="c1"># Tell the system the server is starting up; some things are not available yet</span>
<span class="k">try</span><span class="p">:</span>
<span class="n">evennia</span><span class="o">.</span><span class="n">ServerConfig</span><span class="o">.</span><span class="n">objects</span><span class="o">.</span><span class="n">conf</span><span class="p">(</span><span class="s2">&quot;server_starting_mode&quot;</span><span class="p">,</span> <span class="kc">True</span><span class="p">)</span>
<span class="k">except</span> <span class="n">OperationalError</span><span class="p">:</span>
<span class="nb">print</span><span class="p">(</span><span class="s2">&quot;Server server_starting_mode couldn&#39;t be set - database not set up.&quot;</span><span class="p">)</span>
<span class="k">if</span> <span class="n">settings</span><span class="o">.</span><span class="n">AMP_ENABLED</span><span class="p">:</span>
<span class="bp">self</span><span class="o">.</span><span class="n">register_amp</span><span class="p">()</span>
<span class="k">if</span> <span class="n">settings</span><span class="o">.</span><span class="n">WEBSERVER_ENABLED</span><span class="p">:</span>
<span class="bp">self</span><span class="o">.</span><span class="n">register_webserver</span><span class="p">()</span>
<span class="n">ENABLED</span> <span class="o">=</span> <span class="p">[]</span>
<span class="k">if</span> <span class="n">settings</span><span class="o">.</span><span class="n">IRC_ENABLED</span><span class="p">:</span>
<span class="c1"># IRC channel connections</span>
<span class="n">ENABLED</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="s2">&quot;irc&quot;</span><span class="p">)</span>
<span class="k">if</span> <span class="n">settings</span><span class="o">.</span><span class="n">RSS_ENABLED</span><span class="p">:</span>
<span class="c1"># RSS feed channel connections</span>
<span class="n">ENABLED</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="s2">&quot;rss&quot;</span><span class="p">)</span>
<span class="k">if</span> <span class="n">settings</span><span class="o">.</span><span class="n">GRAPEVINE_ENABLED</span><span class="p">:</span>
<span class="c1"># Grapevine channel connections</span>
<span class="n">ENABLED</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="s2">&quot;grapevine&quot;</span><span class="p">)</span>
<span class="k">if</span> <span class="n">settings</span><span class="o">.</span><span class="n">GAME_INDEX_ENABLED</span><span class="p">:</span>
<span class="kn">from</span> <span class="nn">evennia.server.game_index_client.service</span> <span class="kn">import</span> <span class="n">EvenniaGameIndexService</span>
<span class="n">egi_service</span> <span class="o">=</span> <span class="n">EvenniaGameIndexService</span><span class="p">()</span>
<span class="n">egi_service</span><span class="o">.</span><span class="n">setServiceParent</span><span class="p">(</span><span class="bp">self</span><span class="p">)</span>
<span class="k">if</span> <span class="n">ENABLED</span><span class="p">:</span>
<span class="bp">self</span><span class="o">.</span><span class="n">info_dict</span><span class="p">[</span><span class="s2">&quot;irc_rss&quot;</span><span class="p">]</span> <span class="o">=</span> <span class="s2">&quot;, &quot;</span><span class="o">.</span><span class="n">join</span><span class="p">(</span><span class="n">ENABLED</span><span class="p">)</span> <span class="o">+</span> <span class="s2">&quot; enabled.&quot;</span>
<span class="bp">self</span><span class="o">.</span><span class="n">register_plugins</span><span class="p">()</span>
<span class="nb">super</span><span class="p">()</span><span class="o">.</span><span class="n">privilegedStartService</span><span class="p">()</span>
<span class="c1"># clear server startup mode</span>
<span class="k">try</span><span class="p">:</span>
<span class="n">evennia</span><span class="o">.</span><span class="n">ServerConfig</span><span class="o">.</span><span class="n">objects</span><span class="o">.</span><span class="n">conf</span><span class="p">(</span><span class="s2">&quot;server_starting_mode&quot;</span><span class="p">,</span> <span class="n">delete</span><span class="o">=</span><span class="kc">True</span><span class="p">)</span>
<span class="k">except</span> <span class="n">OperationalError</span><span class="p">:</span>
<span class="nb">print</span><span class="p">(</span><span class="s2">&quot;Server server_starting_mode couldn&#39;t unset - db not set up.&quot;</span><span class="p">)</span></div>
<div class="viewcode-block" id="EvenniaServerService.register_plugins"><a class="viewcode-back" href="../../../api/evennia.server.service.html#evennia.server.service.EvenniaServerService.register_plugins">[docs]</a> <span class="k">def</span> <span class="nf">register_plugins</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="n">SERVER_SERVICES_PLUGIN_MODULES</span> <span class="o">=</span> <span class="n">make_iter</span><span class="p">(</span><span class="n">settings</span><span class="o">.</span><span class="n">SERVER_SERVICES_PLUGIN_MODULES</span><span class="p">)</span>
<span class="k">for</span> <span class="n">plugin_module</span> <span class="ow">in</span> <span class="n">SERVER_SERVICES_PLUGIN_MODULES</span><span class="p">:</span>
<span class="c1"># external plugin protocols - load here</span>
<span class="n">plugin_module</span> <span class="o">=</span> <span class="n">mod_import</span><span class="p">(</span><span class="n">plugin_module</span><span class="p">)</span>
<span class="k">if</span> <span class="n">plugin_module</span><span class="p">:</span>
<span class="n">plugin_module</span><span class="o">.</span><span class="n">start_plugin_services</span><span class="p">(</span><span class="bp">self</span><span class="p">)</span>
<span class="k">else</span><span class="p">:</span>
<span class="nb">print</span><span class="p">(</span><span class="sa">f</span><span class="s2">&quot;Could not load plugin module </span><span class="si">{</span><span class="n">plugin_module</span><span class="si">}</span><span class="s2">&quot;</span><span class="p">)</span></div>
<div class="viewcode-block" id="EvenniaServerService.register_amp"><a class="viewcode-back" href="../../../api/evennia.server.service.html#evennia.server.service.EvenniaServerService.register_amp">[docs]</a> <span class="k">def</span> <span class="nf">register_amp</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="c1"># The AMP protocol handles the communication between</span>
<span class="c1"># the portal and the mud server. Only reason to ever deactivate</span>
<span class="c1"># it would be during testing and debugging.</span>
<span class="n">ifacestr</span> <span class="o">=</span> <span class="s2">&quot;&quot;</span>
<span class="k">if</span> <span class="n">settings</span><span class="o">.</span><span class="n">AMP_INTERFACE</span> <span class="o">!=</span> <span class="s2">&quot;127.0.0.1&quot;</span><span class="p">:</span>
<span class="n">ifacestr</span> <span class="o">=</span> <span class="s2">&quot;-</span><span class="si">%s</span><span class="s2">&quot;</span> <span class="o">%</span> <span class="n">settings</span><span class="o">.</span><span class="n">AMP_INTERFACE</span>
<span class="bp">self</span><span class="o">.</span><span class="n">info_dict</span><span class="p">[</span><span class="s2">&quot;amp&quot;</span><span class="p">]</span> <span class="o">=</span> <span class="s2">&quot;amp </span><span class="si">%s</span><span class="s2">: </span><span class="si">%s</span><span class="s2">&quot;</span> <span class="o">%</span> <span class="p">(</span><span class="n">ifacestr</span><span class="p">,</span> <span class="n">settings</span><span class="o">.</span><span class="n">AMP_PORT</span><span class="p">)</span>
<span class="kn">from</span> <span class="nn">evennia.server</span> <span class="kn">import</span> <span class="n">amp_client</span>
<span class="n">factory</span> <span class="o">=</span> <span class="n">amp_client</span><span class="o">.</span><span class="n">AMPClientFactory</span><span class="p">(</span><span class="bp">self</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">amp_service</span> <span class="o">=</span> <span class="n">internet</span><span class="o">.</span><span class="n">TCPClient</span><span class="p">(</span><span class="n">settings</span><span class="o">.</span><span class="n">AMP_HOST</span><span class="p">,</span> <span class="n">settings</span><span class="o">.</span><span class="n">AMP_PORT</span><span class="p">,</span> <span class="n">factory</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">amp_service</span><span class="o">.</span><span class="n">setName</span><span class="p">(</span><span class="s2">&quot;ServerAMPClient&quot;</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">amp_service</span><span class="o">.</span><span class="n">setServiceParent</span><span class="p">(</span><span class="bp">self</span><span class="p">)</span></div>
<div class="viewcode-block" id="EvenniaServerService.register_webserver"><a class="viewcode-back" href="../../../api/evennia.server.service.html#evennia.server.service.EvenniaServerService.register_webserver">[docs]</a> <span class="k">def</span> <span class="nf">register_webserver</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="c1"># Start a django-compatible webserver.</span>
<span class="kn">from</span> <span class="nn">evennia.server.webserver</span> <span class="kn">import</span> <span class="p">(</span>
<span class="n">DjangoWebRoot</span><span class="p">,</span>
<span class="n">LockableThreadPool</span><span class="p">,</span>
<span class="n">PrivateStaticRoot</span><span class="p">,</span>
<span class="n">Website</span><span class="p">,</span>
<span class="n">WSGIWebServer</span><span class="p">,</span>
<span class="p">)</span>
<span class="c1"># start a thread pool and define the root url (/) as a wsgi resource</span>
<span class="c1"># recognized by Django</span>
<span class="n">threads</span> <span class="o">=</span> <span class="n">LockableThreadPool</span><span class="p">(</span>
<span class="n">minthreads</span><span class="o">=</span><span class="nb">max</span><span class="p">(</span><span class="mi">1</span><span class="p">,</span> <span class="n">settings</span><span class="o">.</span><span class="n">WEBSERVER_THREADPOOL_LIMITS</span><span class="p">[</span><span class="mi">0</span><span class="p">]),</span>
<span class="n">maxthreads</span><span class="o">=</span><span class="nb">max</span><span class="p">(</span><span class="mi">1</span><span class="p">,</span> <span class="n">settings</span><span class="o">.</span><span class="n">WEBSERVER_THREADPOOL_LIMITS</span><span class="p">[</span><span class="mi">1</span><span class="p">]),</span>
<span class="p">)</span>
<span class="n">web_root</span> <span class="o">=</span> <span class="n">DjangoWebRoot</span><span class="p">(</span><span class="n">threads</span><span class="p">)</span>
<span class="c1"># point our media resources to url /media</span>
<span class="n">web_root</span><span class="o">.</span><span class="n">putChild</span><span class="p">(</span><span class="sa">b</span><span class="s2">&quot;media&quot;</span><span class="p">,</span> <span class="n">PrivateStaticRoot</span><span class="p">(</span><span class="n">settings</span><span class="o">.</span><span class="n">MEDIA_ROOT</span><span class="p">))</span>
<span class="c1"># point our static resources to url /static</span>
<span class="n">web_root</span><span class="o">.</span><span class="n">putChild</span><span class="p">(</span><span class="sa">b</span><span class="s2">&quot;static&quot;</span><span class="p">,</span> <span class="n">PrivateStaticRoot</span><span class="p">(</span><span class="n">settings</span><span class="o">.</span><span class="n">STATIC_ROOT</span><span class="p">))</span>
<span class="bp">self</span><span class="o">.</span><span class="n">web_root</span> <span class="o">=</span> <span class="n">web_root</span>
<span class="k">try</span><span class="p">:</span>
<span class="n">WEB_PLUGINS_MODULE</span> <span class="o">=</span> <span class="n">mod_import</span><span class="p">(</span><span class="n">settings</span><span class="o">.</span><span class="n">WEB_PLUGINS_MODULE</span><span class="p">)</span>
<span class="k">except</span> <span class="ne">ImportError</span><span class="p">:</span>
<span class="n">WEB_PLUGINS_MODULE</span> <span class="o">=</span> <span class="kc">None</span>
<span class="bp">self</span><span class="o">.</span><span class="n">info_dict</span><span class="p">[</span><span class="s2">&quot;errors&quot;</span><span class="p">]</span> <span class="o">=</span> <span class="p">(</span>
<span class="s2">&quot;WARNING: settings.WEB_PLUGINS_MODULE not found - &quot;</span>
<span class="s2">&quot;copy &#39;evennia/game_template/server/conf/web_plugins.py to mygame/server/conf.&quot;</span>
<span class="p">)</span>
<span class="k">if</span> <span class="n">WEB_PLUGINS_MODULE</span><span class="p">:</span>
<span class="c1"># custom overloads</span>
<span class="n">web_root</span> <span class="o">=</span> <span class="n">WEB_PLUGINS_MODULE</span><span class="o">.</span><span class="n">at_webserver_root_creation</span><span class="p">(</span><span class="n">web_root</span><span class="p">)</span>
<span class="n">web_site</span> <span class="o">=</span> <span class="n">Website</span><span class="p">(</span><span class="n">web_root</span><span class="p">,</span> <span class="n">logPath</span><span class="o">=</span><span class="n">settings</span><span class="o">.</span><span class="n">HTTP_LOG_FILE</span><span class="p">)</span>
<span class="n">web_site</span><span class="o">.</span><span class="n">is_portal</span> <span class="o">=</span> <span class="kc">False</span>
<span class="bp">self</span><span class="o">.</span><span class="n">info_dict</span><span class="p">[</span><span class="s2">&quot;webserver&quot;</span><span class="p">]</span> <span class="o">=</span> <span class="s2">&quot;&quot;</span>
<span class="k">for</span> <span class="n">proxyport</span><span class="p">,</span> <span class="n">serverport</span> <span class="ow">in</span> <span class="n">settings</span><span class="o">.</span><span class="n">WEBSERVER_PORTS</span><span class="p">:</span>
<span class="c1"># create the webserver (we only need the port for this)</span>
<span class="n">webserver</span> <span class="o">=</span> <span class="n">WSGIWebServer</span><span class="p">(</span><span class="n">threads</span><span class="p">,</span> <span class="n">serverport</span><span class="p">,</span> <span class="n">web_site</span><span class="p">,</span> <span class="n">interface</span><span class="o">=</span><span class="s2">&quot;127.0.0.1&quot;</span><span class="p">)</span>
<span class="n">webserver</span><span class="o">.</span><span class="n">setName</span><span class="p">(</span><span class="s2">&quot;EvenniaWebServer</span><span class="si">%s</span><span class="s2">&quot;</span> <span class="o">%</span> <span class="n">serverport</span><span class="p">)</span>
<span class="n">webserver</span><span class="o">.</span><span class="n">setServiceParent</span><span class="p">(</span><span class="bp">self</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">info_dict</span><span class="p">[</span><span class="s2">&quot;webserver&quot;</span><span class="p">]</span> <span class="o">+=</span> <span class="s2">&quot;webserver: </span><span class="si">%s</span><span class="s2">&quot;</span> <span class="o">%</span> <span class="n">serverport</span></div>
<div class="viewcode-block" id="EvenniaServerService.sqlite3_prep"><a class="viewcode-back" href="../../../api/evennia.server.service.html#evennia.server.service.EvenniaServerService.sqlite3_prep">[docs]</a> <span class="k">def</span> <span class="nf">sqlite3_prep</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="w"> </span><span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> Optimize some SQLite stuff at startup since we</span>
<span class="sd"> can&#39;t save it to the database.</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="k">if</span> <span class="p">(</span>
<span class="s2">&quot;.&quot;</span><span class="o">.</span><span class="n">join</span><span class="p">(</span><span class="nb">str</span><span class="p">(</span><span class="n">i</span><span class="p">)</span> <span class="k">for</span> <span class="n">i</span> <span class="ow">in</span> <span class="n">django</span><span class="o">.</span><span class="n">VERSION</span><span class="p">)</span> <span class="o">&lt;</span> <span class="s2">&quot;1.2&quot;</span>
<span class="ow">and</span> <span class="n">settings</span><span class="o">.</span><span class="n">DATABASES</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s2">&quot;default&quot;</span><span class="p">,</span> <span class="p">{})</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s2">&quot;ENGINE&quot;</span><span class="p">)</span> <span class="o">==</span> <span class="s2">&quot;sqlite3&quot;</span>
<span class="p">)</span> <span class="ow">or</span> <span class="p">(</span>
<span class="nb">hasattr</span><span class="p">(</span><span class="n">settings</span><span class="p">,</span> <span class="s2">&quot;DATABASES&quot;</span><span class="p">)</span>
<span class="ow">and</span> <span class="n">settings</span><span class="o">.</span><span class="n">DATABASES</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s2">&quot;default&quot;</span><span class="p">,</span> <span class="p">{})</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s2">&quot;ENGINE&quot;</span><span class="p">,</span> <span class="kc">None</span><span class="p">)</span>
<span class="o">==</span> <span class="s2">&quot;django.db.backends.sqlite3&quot;</span>
<span class="p">):</span>
<span class="n">cursor</span> <span class="o">=</span> <span class="n">connection</span><span class="o">.</span><span class="n">cursor</span><span class="p">()</span>
<span class="n">cursor</span><span class="o">.</span><span class="n">execute</span><span class="p">(</span><span class="s2">&quot;PRAGMA cache_size=10000&quot;</span><span class="p">)</span>
<span class="n">cursor</span><span class="o">.</span><span class="n">execute</span><span class="p">(</span><span class="s2">&quot;PRAGMA synchronous=OFF&quot;</span><span class="p">)</span>
<span class="n">cursor</span><span class="o">.</span><span class="n">execute</span><span class="p">(</span><span class="s2">&quot;PRAGMA count_changes=OFF&quot;</span><span class="p">)</span>
<span class="n">cursor</span><span class="o">.</span><span class="n">execute</span><span class="p">(</span><span class="s2">&quot;PRAGMA temp_store=2&quot;</span><span class="p">)</span></div>
<div class="viewcode-block" id="EvenniaServerService.update_defaults"><a class="viewcode-back" href="../../../api/evennia.server.service.html#evennia.server.service.EvenniaServerService.update_defaults">[docs]</a> <span class="k">def</span> <span class="nf">update_defaults</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="w"> </span><span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> We make sure to store the most important object defaults here, so</span>
<span class="sd"> we can catch if they change and update them on-objects automatically.</span>
<span class="sd"> This allows for changing default cmdset locations and default</span>
<span class="sd"> typeclasses in the settings file and have them auto-update all</span>
<span class="sd"> already existing objects.</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="c1"># setting names</span>
<span class="n">settings_names</span> <span class="o">=</span> <span class="p">(</span>
<span class="s2">&quot;CMDSET_CHARACTER&quot;</span><span class="p">,</span>
<span class="s2">&quot;CMDSET_ACCOUNT&quot;</span><span class="p">,</span>
<span class="s2">&quot;BASE_ACCOUNT_TYPECLASS&quot;</span><span class="p">,</span>
<span class="s2">&quot;BASE_OBJECT_TYPECLASS&quot;</span><span class="p">,</span>
<span class="s2">&quot;BASE_CHARACTER_TYPECLASS&quot;</span><span class="p">,</span>
<span class="s2">&quot;BASE_ROOM_TYPECLASS&quot;</span><span class="p">,</span>
<span class="s2">&quot;BASE_EXIT_TYPECLASS&quot;</span><span class="p">,</span>
<span class="s2">&quot;BASE_SCRIPT_TYPECLASS&quot;</span><span class="p">,</span>
<span class="s2">&quot;BASE_CHANNEL_TYPECLASS&quot;</span><span class="p">,</span>
<span class="p">)</span>
<span class="c1"># get previous and current settings so they can be compared</span>
<span class="n">settings_compare</span> <span class="o">=</span> <span class="nb">list</span><span class="p">(</span>
<span class="nb">zip</span><span class="p">(</span>
<span class="p">[</span><span class="n">evennia</span><span class="o">.</span><span class="n">ServerConfig</span><span class="o">.</span><span class="n">objects</span><span class="o">.</span><span class="n">conf</span><span class="p">(</span><span class="n">name</span><span class="p">)</span> <span class="k">for</span> <span class="n">name</span> <span class="ow">in</span> <span class="n">settings_names</span><span class="p">],</span>
<span class="p">[</span><span class="n">settings</span><span class="o">.</span><span class="fm">__getattr__</span><span class="p">(</span><span class="n">name</span><span class="p">)</span> <span class="k">for</span> <span class="n">name</span> <span class="ow">in</span> <span class="n">settings_names</span><span class="p">],</span>
<span class="p">)</span>
<span class="p">)</span>
<span class="n">mismatches</span> <span class="o">=</span> <span class="p">[</span>
<span class="n">i</span> <span class="k">for</span> <span class="n">i</span><span class="p">,</span> <span class="n">tup</span> <span class="ow">in</span> <span class="nb">enumerate</span><span class="p">(</span><span class="n">settings_compare</span><span class="p">)</span> <span class="k">if</span> <span class="n">tup</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span> <span class="ow">and</span> <span class="n">tup</span><span class="p">[</span><span class="mi">1</span><span class="p">]</span> <span class="ow">and</span> <span class="n">tup</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span> <span class="o">!=</span> <span class="n">tup</span><span class="p">[</span><span class="mi">1</span><span class="p">]</span>
<span class="p">]</span>
<span class="k">if</span> <span class="nb">len</span><span class="p">(</span>
<span class="n">mismatches</span>
<span class="p">):</span> <span class="c1"># can&#39;t use any() since mismatches may be [0] which reads as False for any()</span>
<span class="c1"># we have a changed default. Import relevant objects and</span>
<span class="c1"># run the update</span>
<span class="c1"># from evennia.accounts.models import AccountDB</span>
<span class="k">for</span> <span class="n">i</span><span class="p">,</span> <span class="n">prev</span><span class="p">,</span> <span class="n">curr</span> <span class="ow">in</span> <span class="p">(</span>
<span class="p">(</span><span class="n">i</span><span class="p">,</span> <span class="n">tup</span><span class="p">[</span><span class="mi">0</span><span class="p">],</span> <span class="n">tup</span><span class="p">[</span><span class="mi">1</span><span class="p">])</span> <span class="k">for</span> <span class="n">i</span><span class="p">,</span> <span class="n">tup</span> <span class="ow">in</span> <span class="nb">enumerate</span><span class="p">(</span><span class="n">settings_compare</span><span class="p">)</span> <span class="k">if</span> <span class="n">i</span> <span class="ow">in</span> <span class="n">mismatches</span>
<span class="p">):</span>
<span class="c1"># update the database</span>
<span class="bp">self</span><span class="o">.</span><span class="n">info_dict</span><span class="p">[</span>
<span class="s2">&quot;info&quot;</span>
<span class="p">]</span> <span class="o">=</span> <span class="s2">&quot; </span><span class="si">%s</span><span class="s2">:</span><span class="se">\n</span><span class="s2"> &#39;</span><span class="si">%s</span><span class="s2">&#39; changed to &#39;</span><span class="si">%s</span><span class="s2">&#39;. Updating unchanged entries in database ...&quot;</span> <span class="o">%</span> <span class="p">(</span>
<span class="n">settings_names</span><span class="p">[</span><span class="n">i</span><span class="p">],</span>
<span class="n">prev</span><span class="p">,</span>
<span class="n">curr</span><span class="p">,</span>
<span class="p">)</span>
<span class="k">if</span> <span class="n">i</span> <span class="o">==</span> <span class="mi">0</span><span class="p">:</span>
<span class="n">evennia</span><span class="o">.</span><span class="n">ObjectDB</span><span class="o">.</span><span class="n">objects</span><span class="o">.</span><span class="n">filter</span><span class="p">(</span><span class="n">db_cmdset_storage__exact</span><span class="o">=</span><span class="n">prev</span><span class="p">)</span><span class="o">.</span><span class="n">update</span><span class="p">(</span>
<span class="n">db_cmdset_storage</span><span class="o">=</span><span class="n">curr</span>
<span class="p">)</span>
<span class="k">if</span> <span class="n">i</span> <span class="o">==</span> <span class="mi">1</span><span class="p">:</span>
<span class="n">evennia</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">filter</span><span class="p">(</span><span class="n">db_cmdset_storage__exact</span><span class="o">=</span><span class="n">prev</span><span class="p">)</span><span class="o">.</span><span class="n">update</span><span class="p">(</span>
<span class="n">db_cmdset_storage</span><span class="o">=</span><span class="n">curr</span>
<span class="p">)</span>
<span class="k">if</span> <span class="n">i</span> <span class="o">==</span> <span class="mi">2</span><span class="p">:</span>
<span class="n">evennia</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">filter</span><span class="p">(</span><span class="n">db_typeclass_path__exact</span><span class="o">=</span><span class="n">prev</span><span class="p">)</span><span class="o">.</span><span class="n">update</span><span class="p">(</span>
<span class="n">db_typeclass_path</span><span class="o">=</span><span class="n">curr</span>
<span class="p">)</span>
<span class="k">if</span> <span class="n">i</span> <span class="ow">in</span> <span class="p">(</span><span class="mi">3</span><span class="p">,</span> <span class="mi">4</span><span class="p">,</span> <span class="mi">5</span><span class="p">,</span> <span class="mi">6</span><span class="p">):</span>
<span class="n">evennia</span><span class="o">.</span><span class="n">ObjectDB</span><span class="o">.</span><span class="n">objects</span><span class="o">.</span><span class="n">filter</span><span class="p">(</span><span class="n">db_typeclass_path__exact</span><span class="o">=</span><span class="n">prev</span><span class="p">)</span><span class="o">.</span><span class="n">update</span><span class="p">(</span>
<span class="n">db_typeclass_path</span><span class="o">=</span><span class="n">curr</span>
<span class="p">)</span>
<span class="k">if</span> <span class="n">i</span> <span class="o">==</span> <span class="mi">7</span><span class="p">:</span>
<span class="n">evennia</span><span class="o">.</span><span class="n">ScriptDB</span><span class="o">.</span><span class="n">objects</span><span class="o">.</span><span class="n">filter</span><span class="p">(</span><span class="n">db_typeclass_path__exact</span><span class="o">=</span><span class="n">prev</span><span class="p">)</span><span class="o">.</span><span class="n">update</span><span class="p">(</span>
<span class="n">db_typeclass_path</span><span class="o">=</span><span class="n">curr</span>
<span class="p">)</span>
<span class="k">if</span> <span class="n">i</span> <span class="o">==</span> <span class="mi">8</span><span class="p">:</span>
<span class="n">evennia</span><span class="o">.</span><span class="n">ChannelDB</span><span class="o">.</span><span class="n">objects</span><span class="o">.</span><span class="n">filter</span><span class="p">(</span><span class="n">db_typeclass_path__exact</span><span class="o">=</span><span class="n">prev</span><span class="p">)</span><span class="o">.</span><span class="n">update</span><span class="p">(</span>
<span class="n">db_typeclass_path</span><span class="o">=</span><span class="n">curr</span>
<span class="p">)</span>
<span class="c1"># store the new default and clean caches</span>
<span class="n">evennia</span><span class="o">.</span><span class="n">ServerConfig</span><span class="o">.</span><span class="n">objects</span><span class="o">.</span><span class="n">conf</span><span class="p">(</span><span class="n">settings_names</span><span class="p">[</span><span class="n">i</span><span class="p">],</span> <span class="n">curr</span><span class="p">)</span>
<span class="n">evennia</span><span class="o">.</span><span class="n">ObjectDB</span><span class="o">.</span><span class="n">flush_instance_cache</span><span class="p">()</span>
<span class="n">evennia</span><span class="o">.</span><span class="n">AccountDB</span><span class="o">.</span><span class="n">flush_instance_cache</span><span class="p">()</span>
<span class="n">evennia</span><span class="o">.</span><span class="n">ScriptDB</span><span class="o">.</span><span class="n">flush_instance_cache</span><span class="p">()</span>
<span class="n">evennia</span><span class="o">.</span><span class="n">ChannelDB</span><span class="o">.</span><span class="n">flush_instance_cache</span><span class="p">()</span>
<span class="c1"># if this is the first start we might not have a &quot;previous&quot;</span>
<span class="c1"># setup saved. Store it now.</span>
<span class="p">[</span>
<span class="n">evennia</span><span class="o">.</span><span class="n">ServerConfig</span><span class="o">.</span><span class="n">objects</span><span class="o">.</span><span class="n">conf</span><span class="p">(</span><span class="n">settings_names</span><span class="p">[</span><span class="n">i</span><span class="p">],</span> <span class="n">tup</span><span class="p">[</span><span class="mi">1</span><span class="p">])</span>
<span class="k">for</span> <span class="n">i</span><span class="p">,</span> <span class="n">tup</span> <span class="ow">in</span> <span class="nb">enumerate</span><span class="p">(</span><span class="n">settings_compare</span><span class="p">)</span>
<span class="k">if</span> <span class="ow">not</span> <span class="n">tup</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span>
<span class="p">]</span></div>
<div class="viewcode-block" id="EvenniaServerService.run_initial_setup"><a class="viewcode-back" href="../../../api/evennia.server.service.html#evennia.server.service.EvenniaServerService.run_initial_setup">[docs]</a> <span class="k">def</span> <span class="nf">run_initial_setup</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="w"> </span><span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> This is triggered by the amp protocol when the connection</span>
<span class="sd"> to the portal has been established.</span>
<span class="sd"> This attempts to run the initial_setup script of the server.</span>
<span class="sd"> It returns if this is not the first time the server starts.</span>
<span class="sd"> Once finished the last_initial_setup_step is set to &#39;done&#39;</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="n">initial_setup</span> <span class="o">=</span> <span class="n">importlib</span><span class="o">.</span><span class="n">import_module</span><span class="p">(</span><span class="n">settings</span><span class="o">.</span><span class="n">INITIAL_SETUP_MODULE</span><span class="p">)</span>
<span class="n">last_initial_setup_step</span> <span class="o">=</span> <span class="n">evennia</span><span class="o">.</span><span class="n">ServerConfig</span><span class="o">.</span><span class="n">objects</span><span class="o">.</span><span class="n">conf</span><span class="p">(</span><span class="s2">&quot;last_initial_setup_step&quot;</span><span class="p">)</span>
<span class="k">try</span><span class="p">:</span>
<span class="k">if</span> <span class="ow">not</span> <span class="n">last_initial_setup_step</span><span class="p">:</span>
<span class="c1"># None is only returned if the config does not exist,</span>
<span class="c1"># i.e. this is an empty DB that needs populating.</span>
<span class="bp">self</span><span class="o">.</span><span class="n">info_dict</span><span class="p">[</span><span class="s2">&quot;info&quot;</span><span class="p">]</span> <span class="o">=</span> <span class="s2">&quot; Server started for the first time. Setting defaults.&quot;</span>
<span class="n">initial_setup</span><span class="o">.</span><span class="n">handle_setup</span><span class="p">()</span>
<span class="k">elif</span> <span class="n">last_initial_setup_step</span> <span class="ow">not</span> <span class="ow">in</span> <span class="p">(</span><span class="s2">&quot;done&quot;</span><span class="p">,</span> <span class="o">-</span><span class="mi">1</span><span class="p">):</span>
<span class="c1"># last step crashed, so we weill resume from this step.</span>
<span class="c1"># modules and setup will resume from this step, retrying</span>
<span class="c1"># the last failed module. When all are finished, the step</span>
<span class="c1"># is set to &#39;done&#39; to show it does not need to be run again.</span>
<span class="bp">self</span><span class="o">.</span><span class="n">info_dict</span><span class="p">[</span><span class="s2">&quot;info&quot;</span><span class="p">]</span> <span class="o">=</span> <span class="s2">&quot; Resuming initial setup from step &#39;</span><span class="si">{last}</span><span class="s2">&#39;.&quot;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span>
<span class="n">last</span><span class="o">=</span><span class="n">last_initial_setup_step</span>
<span class="p">)</span>
<span class="n">initial_setup</span><span class="o">.</span><span class="n">handle_setup</span><span class="p">(</span><span class="n">last_initial_setup_step</span><span class="p">)</span>
<span class="k">except</span> <span class="ne">Exception</span><span class="p">:</span>
<span class="c1"># stop server if this happens.</span>
<span class="nb">print</span><span class="p">(</span><span class="n">traceback</span><span class="o">.</span><span class="n">format_exc</span><span class="p">())</span>
<span class="k">if</span> <span class="ow">not</span> <span class="n">settings</span><span class="o">.</span><span class="n">_TEST_ENVIRONMENT</span> <span class="ow">or</span> <span class="ow">not</span> <span class="n">evennia</span><span class="o">.</span><span class="n">SESSION_HANDLER</span><span class="p">:</span>
<span class="nb">print</span><span class="p">(</span><span class="s2">&quot;Error in initial setup. Stopping Server + Portal.&quot;</span><span class="p">)</span>
<span class="n">evennia</span><span class="o">.</span><span class="n">SESSION_HANDLER</span><span class="o">.</span><span class="n">portal_shutdown</span><span class="p">()</span></div>
<div class="viewcode-block" id="EvenniaServerService.create_default_channels"><a class="viewcode-back" href="../../../api/evennia.server.service.html#evennia.server.service.EvenniaServerService.create_default_channels">[docs]</a> <span class="k">def</span> <span class="nf">create_default_channels</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="w"> </span><span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> check so default channels exist on every restart, create if not.</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="kn">from</span> <span class="nn">evennia</span> <span class="kn">import</span> <span class="n">AccountDB</span><span class="p">,</span> <span class="n">ChannelDB</span>
<span class="kn">from</span> <span class="nn">evennia.utils.create</span> <span class="kn">import</span> <span class="n">create_channel</span>
<span class="n">superuser</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</span><span class="p">(</span><span class="nb">id</span><span class="o">=</span><span class="mi">1</span><span class="p">)</span>
<span class="c1"># mudinfo</span>
<span class="n">mudinfo_chan</span> <span class="o">=</span> <span class="n">settings</span><span class="o">.</span><span class="n">CHANNEL_MUDINFO</span>
<span class="k">if</span> <span class="n">mudinfo_chan</span> <span class="ow">and</span> <span class="ow">not</span> <span class="n">ChannelDB</span><span class="o">.</span><span class="n">objects</span><span class="o">.</span><span class="n">filter</span><span class="p">(</span><span class="n">db_key__iexact</span><span class="o">=</span><span class="n">mudinfo_chan</span><span class="p">[</span><span class="s2">&quot;key&quot;</span><span class="p">]):</span>
<span class="n">channel</span> <span class="o">=</span> <span class="n">create_channel</span><span class="p">(</span><span class="o">**</span><span class="n">mudinfo_chan</span><span class="p">)</span>
<span class="n">channel</span><span class="o">.</span><span class="n">connect</span><span class="p">(</span><span class="n">superuser</span><span class="p">)</span>
<span class="c1"># connectinfo</span>
<span class="n">connectinfo_chan</span> <span class="o">=</span> <span class="n">settings</span><span class="o">.</span><span class="n">CHANNEL_CONNECTINFO</span>
<span class="k">if</span> <span class="n">connectinfo_chan</span> <span class="ow">and</span> <span class="ow">not</span> <span class="n">ChannelDB</span><span class="o">.</span><span class="n">objects</span><span class="o">.</span><span class="n">filter</span><span class="p">(</span>
<span class="n">db_key__iexact</span><span class="o">=</span><span class="n">connectinfo_chan</span><span class="p">[</span><span class="s2">&quot;key&quot;</span><span class="p">]</span>
<span class="p">):</span>
<span class="n">channel</span> <span class="o">=</span> <span class="n">create_channel</span><span class="p">(</span><span class="o">**</span><span class="n">connectinfo_chan</span><span class="p">)</span>
<span class="c1"># default channels</span>
<span class="k">for</span> <span class="n">chan_info</span> <span class="ow">in</span> <span class="n">settings</span><span class="o">.</span><span class="n">DEFAULT_CHANNELS</span><span class="p">:</span>
<span class="k">if</span> <span class="ow">not</span> <span class="n">ChannelDB</span><span class="o">.</span><span class="n">objects</span><span class="o">.</span><span class="n">filter</span><span class="p">(</span><span class="n">db_key__iexact</span><span class="o">=</span><span class="n">chan_info</span><span class="p">[</span><span class="s2">&quot;key&quot;</span><span class="p">]):</span>
<span class="n">channel</span> <span class="o">=</span> <span class="n">create_channel</span><span class="p">(</span><span class="o">**</span><span class="n">chan_info</span><span class="p">)</span>
<span class="n">channel</span><span class="o">.</span><span class="n">connect</span><span class="p">(</span><span class="n">superuser</span><span class="p">)</span></div>
<div class="viewcode-block" id="EvenniaServerService.run_init_hooks"><a class="viewcode-back" href="../../../api/evennia.server.service.html#evennia.server.service.EvenniaServerService.run_init_hooks">[docs]</a> <span class="k">def</span> <span class="nf">run_init_hooks</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">mode</span><span class="p">):</span>
<span class="w"> </span><span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> Called by the amp client once receiving sync back from Portal</span>
<span class="sd"> Args:</span>
<span class="sd"> mode (str): One of shutdown, reload or reset</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="kn">from</span> <span class="nn">evennia.typeclasses.models</span> <span class="kn">import</span> <span class="n">TypedObject</span>
<span class="c1"># start server time and maintenance task</span>
<span class="bp">self</span><span class="o">.</span><span class="n">maintenance_task</span> <span class="o">=</span> <span class="n">LoopingCall</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">server_maintenance</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">maintenance_task</span><span class="o">.</span><span class="n">start</span><span class="p">(</span><span class="mi">60</span><span class="p">,</span> <span class="n">now</span><span class="o">=</span><span class="kc">True</span><span class="p">)</span> <span class="c1"># call every minute</span>
<span class="c1"># update eventual changed defaults</span>
<span class="bp">self</span><span class="o">.</span><span class="n">update_defaults</span><span class="p">()</span>
<span class="c1"># run at_init() on all cached entities on reconnect</span>
<span class="p">[</span>
<span class="p">[</span><span class="n">entity</span><span class="o">.</span><span class="n">at_init</span><span class="p">()</span> <span class="k">for</span> <span class="n">entity</span> <span class="ow">in</span> <span class="n">typeclass_db</span><span class="o">.</span><span class="n">get_all_cached_instances</span><span class="p">()]</span>
<span class="k">for</span> <span class="n">typeclass_db</span> <span class="ow">in</span> <span class="n">TypedObject</span><span class="o">.</span><span class="n">__subclasses__</span><span class="p">()</span>
<span class="p">]</span>
<span class="bp">self</span><span class="o">.</span><span class="n">at_server_init</span><span class="p">()</span>
<span class="c1"># call correct server hook based on start file value</span>
<span class="k">if</span> <span class="n">mode</span> <span class="o">==</span> <span class="s2">&quot;reload&quot;</span><span class="p">:</span>
<span class="n">logger</span><span class="o">.</span><span class="n">log_msg</span><span class="p">(</span><span class="s2">&quot;Server successfully reloaded.&quot;</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">at_server_reload_start</span><span class="p">()</span>
<span class="k">elif</span> <span class="n">mode</span> <span class="o">==</span> <span class="s2">&quot;reset&quot;</span><span class="p">:</span>
<span class="c1"># only run hook, don&#39;t purge sessions</span>
<span class="bp">self</span><span class="o">.</span><span class="n">at_server_cold_start</span><span class="p">()</span>
<span class="n">logger</span><span class="o">.</span><span class="n">log_msg</span><span class="p">(</span><span class="s2">&quot;Evennia Server successfully restarted in &#39;reset&#39; mode.&quot;</span><span class="p">)</span>
<span class="k">elif</span> <span class="n">mode</span> <span class="o">==</span> <span class="s2">&quot;shutdown&quot;</span><span class="p">:</span>
<span class="kn">from</span> <span class="nn">evennia.objects.models</span> <span class="kn">import</span> <span class="n">ObjectDB</span>
<span class="bp">self</span><span class="o">.</span><span class="n">at_server_cold_start</span><span class="p">()</span>
<span class="c1"># clear eventual lingering session storages</span>
<span class="n">ObjectDB</span><span class="o">.</span><span class="n">objects</span><span class="o">.</span><span class="n">clear_all_sessids</span><span class="p">()</span>
<span class="n">logger</span><span class="o">.</span><span class="n">log_msg</span><span class="p">(</span><span class="s2">&quot;Evennia Server successfully started.&quot;</span><span class="p">)</span>
<span class="c1"># always call this regardless of start type</span>
<span class="bp">self</span><span class="o">.</span><span class="n">at_server_start</span><span class="p">()</span></div>
<div class="viewcode-block" id="EvenniaServerService.shutdown"><a class="viewcode-back" href="../../../api/evennia.server.service.html#evennia.server.service.EvenniaServerService.shutdown">[docs]</a> <span class="nd">@defer</span><span class="o">.</span><span class="n">inlineCallbacks</span>
<span class="k">def</span> <span class="nf">shutdown</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">mode</span><span class="o">=</span><span class="s2">&quot;reload&quot;</span><span class="p">,</span> <span class="n">_reactor_stopping</span><span class="o">=</span><span class="kc">False</span><span class="p">):</span>
<span class="w"> </span><span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> Shuts down the server from inside it.</span>
<span class="sd"> mode - sets the server restart mode.</span>
<span class="sd"> - &#39;reload&#39; - server restarts, no &quot;persistent&quot; scripts</span>
<span class="sd"> are stopped, at_reload hooks called.</span>
<span class="sd"> - &#39;reset&#39; - server restarts, non-persistent scripts stopped,</span>
<span class="sd"> at_shutdown hooks called but sessions will not</span>
<span class="sd"> be disconnected.</span>
<span class="sd"> - &#39;shutdown&#39; - like reset, but server will not auto-restart.</span>
<span class="sd"> _reactor_stopping - this is set if server is stopped by a kill</span>
<span class="sd"> command OR this method was already called</span>
<span class="sd"> once - in both cases the reactor is</span>
<span class="sd"> dead/stopping already.</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="k">if</span> <span class="n">_reactor_stopping</span> <span class="ow">and</span> <span class="nb">hasattr</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="s2">&quot;shutdown_complete&quot;</span><span class="p">):</span>
<span class="c1"># this means we have already passed through this method</span>
<span class="c1"># once; we don&#39;t need to run the shutdown procedure again.</span>
<span class="n">defer</span><span class="o">.</span><span class="n">returnValue</span><span class="p">(</span><span class="kc">None</span><span class="p">)</span>
<span class="k">if</span> <span class="n">mode</span> <span class="o">==</span> <span class="s2">&quot;reload&quot;</span><span class="p">:</span>
<span class="c1"># call restart hooks</span>
<span class="n">evennia</span><span class="o">.</span><span class="n">ServerConfig</span><span class="o">.</span><span class="n">objects</span><span class="o">.</span><span class="n">conf</span><span class="p">(</span><span class="s2">&quot;server_restart_mode&quot;</span><span class="p">,</span> <span class="s2">&quot;reload&quot;</span><span class="p">)</span>
<span class="k">yield</span> <span class="p">[</span><span class="n">o</span><span class="o">.</span><span class="n">at_server_reload</span><span class="p">()</span> <span class="k">for</span> <span class="n">o</span> <span class="ow">in</span> <span class="n">evennia</span><span class="o">.</span><span class="n">ObjectDB</span><span class="o">.</span><span class="n">get_all_cached_instances</span><span class="p">()]</span>
<span class="k">yield</span> <span class="p">[</span><span class="n">p</span><span class="o">.</span><span class="n">at_server_reload</span><span class="p">()</span> <span class="k">for</span> <span class="n">p</span> <span class="ow">in</span> <span class="n">evennia</span><span class="o">.</span><span class="n">AccountDB</span><span class="o">.</span><span class="n">get_all_cached_instances</span><span class="p">()]</span>
<span class="k">yield</span> <span class="p">[</span>
<span class="p">(</span><span class="n">s</span><span class="o">.</span><span class="n">_pause_task</span><span class="p">(</span><span class="n">auto_pause</span><span class="o">=</span><span class="kc">True</span><span class="p">)</span> <span class="k">if</span> <span class="n">s</span><span class="o">.</span><span class="n">is_active</span> <span class="k">else</span> <span class="kc">None</span><span class="p">,</span> <span class="n">s</span><span class="o">.</span><span class="n">at_server_reload</span><span class="p">())</span>
<span class="k">for</span> <span class="n">s</span> <span class="ow">in</span> <span class="n">evennia</span><span class="o">.</span><span class="n">ScriptDB</span><span class="o">.</span><span class="n">get_all_cached_instances</span><span class="p">()</span>
<span class="k">if</span> <span class="n">s</span><span class="o">.</span><span class="n">id</span>
<span class="p">]</span>
<span class="k">yield</span> <span class="n">evennia</span><span class="o">.</span><span class="n">SESSION_HANDLER</span><span class="o">.</span><span class="n">all_sessions_portal_sync</span><span class="p">()</span>
<span class="bp">self</span><span class="o">.</span><span class="n">at_server_reload_stop</span><span class="p">()</span>
<span class="c1"># only save monitor state on reload, not on shutdown/reset</span>
<span class="kn">from</span> <span class="nn">evennia.scripts.monitorhandler</span> <span class="kn">import</span> <span class="n">MONITOR_HANDLER</span>
<span class="n">MONITOR_HANDLER</span><span class="o">.</span><span class="n">save</span><span class="p">()</span>
<span class="k">else</span><span class="p">:</span>
<span class="k">if</span> <span class="n">mode</span> <span class="o">==</span> <span class="s2">&quot;reset&quot;</span><span class="p">:</span>
<span class="c1"># like shutdown but don&#39;t unset the is_connected flag and don&#39;t disconnect sessions</span>
<span class="k">yield</span> <span class="p">[</span><span class="n">o</span><span class="o">.</span><span class="n">at_server_shutdown</span><span class="p">()</span> <span class="k">for</span> <span class="n">o</span> <span class="ow">in</span> <span class="n">evennia</span><span class="o">.</span><span class="n">ObjectDB</span><span class="o">.</span><span class="n">get_all_cached_instances</span><span class="p">()]</span>
<span class="k">yield</span> <span class="p">[</span><span class="n">p</span><span class="o">.</span><span class="n">at_server_shutdown</span><span class="p">()</span> <span class="k">for</span> <span class="n">p</span> <span class="ow">in</span> <span class="n">evennia</span><span class="o">.</span><span class="n">AccountDB</span><span class="o">.</span><span class="n">get_all_cached_instances</span><span class="p">()]</span>
<span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">amp_protocol</span><span class="p">:</span>
<span class="k">yield</span> <span class="n">evennia</span><span class="o">.</span><span class="n">SESSION_HANDLER</span><span class="o">.</span><span class="n">all_sessions_portal_sync</span><span class="p">()</span>
<span class="k">else</span><span class="p">:</span> <span class="c1"># shutdown</span>
<span class="k">yield</span> <span class="p">[</span>
<span class="n">_SA</span><span class="p">(</span><span class="n">p</span><span class="p">,</span> <span class="s2">&quot;is_connected&quot;</span><span class="p">,</span> <span class="kc">False</span><span class="p">)</span>
<span class="k">for</span> <span class="n">p</span> <span class="ow">in</span> <span class="n">evennia</span><span class="o">.</span><span class="n">AccountDB</span><span class="o">.</span><span class="n">get_all_cached_instances</span><span class="p">()</span>
<span class="p">]</span>
<span class="k">yield</span> <span class="p">[</span><span class="n">o</span><span class="o">.</span><span class="n">at_server_shutdown</span><span class="p">()</span> <span class="k">for</span> <span class="n">o</span> <span class="ow">in</span> <span class="n">evennia</span><span class="o">.</span><span class="n">ObjectDB</span><span class="o">.</span><span class="n">get_all_cached_instances</span><span class="p">()]</span>
<span class="k">yield</span> <span class="p">[</span>
<span class="p">(</span><span class="n">p</span><span class="o">.</span><span class="n">unpuppet_all</span><span class="p">(),</span> <span class="n">p</span><span class="o">.</span><span class="n">at_server_shutdown</span><span class="p">())</span>
<span class="k">for</span> <span class="n">p</span> <span class="ow">in</span> <span class="n">evennia</span><span class="o">.</span><span class="n">AccountDB</span><span class="o">.</span><span class="n">get_all_cached_instances</span><span class="p">()</span>
<span class="p">]</span>
<span class="k">yield</span> <span class="n">evennia</span><span class="o">.</span><span class="n">ObjectDB</span><span class="o">.</span><span class="n">objects</span><span class="o">.</span><span class="n">clear_all_sessids</span><span class="p">()</span>
<span class="k">yield</span> <span class="p">[</span>
<span class="p">(</span><span class="n">s</span><span class="o">.</span><span class="n">_pause_task</span><span class="p">(</span><span class="n">auto_pause</span><span class="o">=</span><span class="kc">True</span><span class="p">),</span> <span class="n">s</span><span class="o">.</span><span class="n">at_server_shutdown</span><span class="p">())</span>
<span class="k">for</span> <span class="n">s</span> <span class="ow">in</span> <span class="n">evennia</span><span class="o">.</span><span class="n">ScriptDB</span><span class="o">.</span><span class="n">get_all_cached_instances</span><span class="p">()</span>
<span class="k">if</span> <span class="n">s</span><span class="o">.</span><span class="n">id</span> <span class="ow">and</span> <span class="n">s</span><span class="o">.</span><span class="n">is_active</span>
<span class="p">]</span>
<span class="n">evennia</span><span class="o">.</span><span class="n">ServerConfig</span><span class="o">.</span><span class="n">objects</span><span class="o">.</span><span class="n">conf</span><span class="p">(</span><span class="s2">&quot;server_restart_mode&quot;</span><span class="p">,</span> <span class="s2">&quot;reset&quot;</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">at_server_cold_stop</span><span class="p">()</span>
<span class="c1"># tickerhandler state should always be saved.</span>
<span class="kn">from</span> <span class="nn">evennia.scripts.tickerhandler</span> <span class="kn">import</span> <span class="n">TICKER_HANDLER</span>
<span class="n">TICKER_HANDLER</span><span class="o">.</span><span class="n">save</span><span class="p">()</span>
<span class="c1"># always called, also for a reload</span>
<span class="bp">self</span><span class="o">.</span><span class="n">at_server_stop</span><span class="p">()</span>
<span class="k">if</span> <span class="nb">hasattr</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="s2">&quot;web_root&quot;</span><span class="p">):</span> <span class="c1"># not set very first start</span>
<span class="k">yield</span> <span class="bp">self</span><span class="o">.</span><span class="n">web_root</span><span class="o">.</span><span class="n">empty_threadpool</span><span class="p">()</span>
<span class="k">if</span> <span class="ow">not</span> <span class="n">_reactor_stopping</span><span class="p">:</span>
<span class="c1"># kill the server</span>
<span class="bp">self</span><span class="o">.</span><span class="n">shutdown_complete</span> <span class="o">=</span> <span class="kc">True</span>
<span class="n">reactor</span><span class="o">.</span><span class="n">callLater</span><span class="p">(</span><span class="mi">1</span><span class="p">,</span> <span class="n">reactor</span><span class="o">.</span><span class="n">stop</span><span class="p">)</span>
<span class="c1"># we make sure the proper gametime is saved as late as possible</span>
<span class="n">evennia</span><span class="o">.</span><span class="n">ServerConfig</span><span class="o">.</span><span class="n">objects</span><span class="o">.</span><span class="n">conf</span><span class="p">(</span><span class="s2">&quot;runtime&quot;</span><span class="p">,</span> <span class="n">evennia</span><span class="o">.</span><span class="n">gametime</span><span class="o">.</span><span class="n">runtime</span><span class="p">())</span></div>
<div class="viewcode-block" id="EvenniaServerService.get_info_dict"><a class="viewcode-back" href="../../../api/evennia.server.service.html#evennia.server.service.EvenniaServerService.get_info_dict">[docs]</a> <span class="k">def</span> <span class="nf">get_info_dict</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="w"> </span><span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> Return the server info, for display.</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">info_dict</span></div>
<span class="c1"># server start/stop hooks</span>
<span class="k">def</span> <span class="nf">_call_start_stop</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">hookname</span><span class="p">):</span>
<span class="w"> </span><span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> Helper method for calling hooks on all modules.</span>
<span class="sd"> Args:</span>
<span class="sd"> hookname (str): Name of hook to call.</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="k">for</span> <span class="n">mod</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">start_stop_modules</span><span class="p">:</span>
<span class="k">if</span> <span class="n">hook</span> <span class="o">:=</span> <span class="nb">getattr</span><span class="p">(</span><span class="n">mod</span><span class="p">,</span> <span class="n">hookname</span><span class="p">,</span> <span class="kc">None</span><span class="p">):</span>
<span class="n">hook</span><span class="p">()</span>
<div class="viewcode-block" id="EvenniaServerService.at_server_init"><a class="viewcode-back" href="../../../api/evennia.server.service.html#evennia.server.service.EvenniaServerService.at_server_init">[docs]</a> <span class="k">def</span> <span class="nf">at_server_init</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="w"> </span><span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> This is called first when the server is starting, before any other hooks, regardless of how it&#39;s starting.</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="bp">self</span><span class="o">.</span><span class="n">_call_start_stop</span><span class="p">(</span><span class="s2">&quot;at_server_init&quot;</span><span class="p">)</span></div>
<div class="viewcode-block" id="EvenniaServerService.at_server_start"><a class="viewcode-back" href="../../../api/evennia.server.service.html#evennia.server.service.EvenniaServerService.at_server_start">[docs]</a> <span class="k">def</span> <span class="nf">at_server_start</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="w"> </span><span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> This is called every time the server starts up, regardless of</span>
<span class="sd"> how it was shut down.</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="bp">self</span><span class="o">.</span><span class="n">_call_start_stop</span><span class="p">(</span><span class="s2">&quot;at_server_start&quot;</span><span class="p">)</span></div>
<div class="viewcode-block" id="EvenniaServerService.at_server_stop"><a class="viewcode-back" href="../../../api/evennia.server.service.html#evennia.server.service.EvenniaServerService.at_server_stop">[docs]</a> <span class="k">def</span> <span class="nf">at_server_stop</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="w"> </span><span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> This is called just before a server is shut down, regardless</span>
<span class="sd"> of it is fore a reload, reset or shutdown.</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="bp">self</span><span class="o">.</span><span class="n">_call_start_stop</span><span class="p">(</span><span class="s2">&quot;at_server_stop&quot;</span><span class="p">)</span></div>
<div class="viewcode-block" id="EvenniaServerService.at_server_reload_start"><a class="viewcode-back" href="../../../api/evennia.server.service.html#evennia.server.service.EvenniaServerService.at_server_reload_start">[docs]</a> <span class="k">def</span> <span class="nf">at_server_reload_start</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="w"> </span><span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> This is called only when server starts back up after a reload.</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="bp">self</span><span class="o">.</span><span class="n">_call_start_stop</span><span class="p">(</span><span class="s2">&quot;at_server_reload_start&quot;</span><span class="p">)</span></div>
<div class="viewcode-block" id="EvenniaServerService.at_post_portal_sync"><a class="viewcode-back" href="../../../api/evennia.server.service.html#evennia.server.service.EvenniaServerService.at_post_portal_sync">[docs]</a> <span class="k">def</span> <span class="nf">at_post_portal_sync</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">mode</span><span class="p">):</span>
<span class="w"> </span><span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> This is called just after the portal has finished syncing back data to the server</span>
<span class="sd"> after reconnecting.</span>
<span class="sd"> Args:</span>
<span class="sd"> mode (str): One of &#39;reload&#39;, &#39;reset&#39; or &#39;shutdown&#39;.</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="kn">from</span> <span class="nn">evennia.scripts.monitorhandler</span> <span class="kn">import</span> <span class="n">MONITOR_HANDLER</span>
<span class="n">MONITOR_HANDLER</span><span class="o">.</span><span class="n">restore</span><span class="p">(</span><span class="n">mode</span> <span class="o">==</span> <span class="s2">&quot;reload&quot;</span><span class="p">)</span>
<span class="kn">from</span> <span class="nn">evennia.scripts.tickerhandler</span> <span class="kn">import</span> <span class="n">TICKER_HANDLER</span>
<span class="n">TICKER_HANDLER</span><span class="o">.</span><span class="n">restore</span><span class="p">(</span><span class="n">mode</span> <span class="o">==</span> <span class="s2">&quot;reload&quot;</span><span class="p">)</span>
<span class="c1"># Un-pause all scripts, stop non-persistent timers</span>
<span class="n">evennia</span><span class="o">.</span><span class="n">ScriptDB</span><span class="o">.</span><span class="n">objects</span><span class="o">.</span><span class="n">update_scripts_after_server_start</span><span class="p">()</span>
<span class="c1"># start the task handler</span>
<span class="kn">from</span> <span class="nn">evennia.scripts.taskhandler</span> <span class="kn">import</span> <span class="n">TASK_HANDLER</span>
<span class="n">TASK_HANDLER</span><span class="o">.</span><span class="n">load</span><span class="p">()</span>
<span class="n">TASK_HANDLER</span><span class="o">.</span><span class="n">create_delays</span><span class="p">()</span>
<span class="c1"># create/update channels</span>
<span class="bp">self</span><span class="o">.</span><span class="n">create_default_channels</span><span class="p">()</span>
<span class="c1"># delete the temporary setting</span>
<span class="n">evennia</span><span class="o">.</span><span class="n">ServerConfig</span><span class="o">.</span><span class="n">objects</span><span class="o">.</span><span class="n">conf</span><span class="p">(</span><span class="s2">&quot;server_restart_mode&quot;</span><span class="p">,</span> <span class="n">delete</span><span class="o">=</span><span class="kc">True</span><span class="p">)</span></div>
<div class="viewcode-block" id="EvenniaServerService.at_server_reload_stop"><a class="viewcode-back" href="../../../api/evennia.server.service.html#evennia.server.service.EvenniaServerService.at_server_reload_stop">[docs]</a> <span class="k">def</span> <span class="nf">at_server_reload_stop</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="w"> </span><span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> This is called only time the server stops before a reload.</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="bp">self</span><span class="o">.</span><span class="n">_call_start_stop</span><span class="p">(</span><span class="s2">&quot;at_server_reload_stop&quot;</span><span class="p">)</span></div>
<div class="viewcode-block" id="EvenniaServerService.at_server_cold_start"><a class="viewcode-back" href="../../../api/evennia.server.service.html#evennia.server.service.EvenniaServerService.at_server_cold_start">[docs]</a> <span class="k">def</span> <span class="nf">at_server_cold_start</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="w"> </span><span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> This is called only when the server starts &quot;cold&quot;, i.e. after a</span>
<span class="sd"> shutdown or a reset.</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="c1"># We need to do this just in case the server was killed in a way where</span>
<span class="c1"># the normal cleanup operations did not have time to run.</span>
<span class="kn">from</span> <span class="nn">evennia.objects.models</span> <span class="kn">import</span> <span class="n">ObjectDB</span>
<span class="n">ObjectDB</span><span class="o">.</span><span class="n">objects</span><span class="o">.</span><span class="n">clear_all_sessids</span><span class="p">()</span>
<span class="c1"># Remove non-persistent scripts</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">for</span> <span class="n">script</span> <span class="ow">in</span> <span class="n">ScriptDB</span><span class="o">.</span><span class="n">objects</span><span class="o">.</span><span class="n">filter</span><span class="p">(</span><span class="n">db_persistent</span><span class="o">=</span><span class="kc">False</span><span class="p">):</span>
<span class="n">script</span><span class="o">.</span><span class="n">_stop_task</span><span class="p">()</span>
<span class="k">if</span> <span class="n">settings</span><span class="o">.</span><span class="n">GUEST_ENABLED</span><span class="p">:</span>
<span class="k">for</span> <span class="n">guest</span> <span class="ow">in</span> <span class="n">evennia</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">all</span><span class="p">()</span><span class="o">.</span><span class="n">filter</span><span class="p">(</span>
<span class="n">db_typeclass_path</span><span class="o">=</span><span class="n">settings</span><span class="o">.</span><span class="n">BASE_GUEST_TYPECLASS</span>
<span class="p">):</span>
<span class="k">for</span> <span class="n">character</span> <span class="ow">in</span> <span class="n">guest</span><span class="o">.</span><span class="n">db</span><span class="o">.</span><span class="n">_playable_characters</span><span class="p">:</span>
<span class="k">if</span> <span class="n">character</span><span class="p">:</span>
<span class="n">character</span><span class="o">.</span><span class="n">delete</span><span class="p">()</span>
<span class="n">guest</span><span class="o">.</span><span class="n">delete</span><span class="p">()</span>
<span class="bp">self</span><span class="o">.</span><span class="n">_call_start_stop</span><span class="p">(</span><span class="s2">&quot;at_server_cold_start&quot;</span><span class="p">)</span></div>
<div class="viewcode-block" id="EvenniaServerService.at_server_cold_stop"><a class="viewcode-back" href="../../../api/evennia.server.service.html#evennia.server.service.EvenniaServerService.at_server_cold_stop">[docs]</a> <span class="k">def</span> <span class="nf">at_server_cold_stop</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="w"> </span><span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> This is called only when the server goes down due to a shutdown or reset.</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="bp">self</span><span class="o">.</span><span class="n">_call_start_stop</span><span class="p">(</span><span class="s2">&quot;at_server_cold_stop&quot;</span><span class="p">)</span></div></div>
</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 2.x</a> &#187;</li>
<li class="nav-item nav-item-1"><a href="../../index.html" >Module code</a> &#187;</li>
<li class="nav-item nav-item-2"><a href="../../evennia.html" >evennia</a> &#187;</li>
<li class="nav-item nav-item-this"><a href="">evennia.server.service</a></li>
</ul>
</div>
<div class="footer" role="contentinfo">
&#169; Copyright 2023, The Evennia developer community.
Created using <a href="https://www.sphinx-doc.org/">Sphinx</a> 3.2.1.
</div>
</body>
</html>

View file

@ -303,6 +303,7 @@
<li><a href="evennia/server/portal/naws.html">evennia.server.portal.naws</a></li>
<li><a href="evennia/server/portal/portalsessionhandler.html">evennia.server.portal.portalsessionhandler</a></li>
<li><a href="evennia/server/portal/rss.html">evennia.server.portal.rss</a></li>
<li><a href="evennia/server/portal/service.html">evennia.server.portal.service</a></li>
<li><a href="evennia/server/portal/ssh.html">evennia.server.portal.ssh</a></li>
<li><a href="evennia/server/portal/ssl.html">evennia.server.portal.ssl</a></li>
<li><a href="evennia/server/portal/suppress_ga.html">evennia.server.portal.suppress_ga</a></li>
@ -320,6 +321,7 @@
<li><a href="evennia/server/profiling/tests.html">evennia.server.profiling.tests</a></li>
<li><a href="evennia/server/profiling/timetrace.html">evennia.server.profiling.timetrace</a></li>
<li><a href="evennia/server/serversession.html">evennia.server.serversession</a></li>
<li><a href="evennia/server/service.html">evennia.server.service</a></li>
<li><a href="evennia/server/session.html">evennia.server.session</a></li>
<li><a href="evennia/server/sessionhandler.html">evennia.server.sessionhandler</a></li>
<li><a href="evennia/server/throttle.html">evennia.server.throttle</a></li>