mirror of
https://github.com/evennia/evennia.git
synced 2026-04-01 13:37:17 +02:00
Updated HTML docs.
This commit is contained in:
parent
6db213a843
commit
b4fe068f44
705 changed files with 2337 additions and 140 deletions
|
|
@ -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>
|
||||
|
|
|
|||
|
|
@ -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"> """</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>
|
||||
|
|
|
|||
|
|
@ -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">"This is a character."</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">"""</span>
|
||||
<span class="sd"> delete a character - this cannot be undone!</span>
|
||||
|
|
|
|||
|
|
@ -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>
|
||||
|
|
|
|||
481
docs/2.x/_modules/evennia/server/portal/service.html
Normal file
481
docs/2.x/_modules/evennia/server/portal/service.html
Normal 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 — 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> »</li>
|
||||
<li class="nav-item nav-item-1"><a href="../../../index.html" >Module code</a> »</li>
|
||||
<li class="nav-item nav-item-2"><a href="../../../evennia.html" accesskey="U">evennia</a> »</li>
|
||||
<li class="nav-item nav-item-this"><a href="">evennia.server.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">"shutdown"</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">"servername"</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">"version"</span><span class="p">:</span> <span class="n">get_evennia_version</span><span class="p">(),</span>
|
||||
<span class="s2">"errors"</span><span class="p">:</span> <span class="s2">""</span><span class="p">,</span>
|
||||
<span class="s2">"info"</span><span class="p">:</span> <span class="s2">""</span><span class="p">,</span>
|
||||
<span class="s2">"lockdown_mode"</span><span class="p">:</span> <span class="s2">""</span><span class="p">,</span>
|
||||
<span class="s2">"amp"</span><span class="p">:</span> <span class="s2">""</span><span class="p">,</span>
|
||||
<span class="s2">"telnet"</span><span class="p">:</span> <span class="p">[],</span>
|
||||
<span class="s2">"telnet_ssl"</span><span class="p">:</span> <span class="p">[],</span>
|
||||
<span class="s2">"ssh"</span><span class="p">:</span> <span class="p">[],</span>
|
||||
<span class="s2">"webclient"</span><span class="p">:</span> <span class="p">[],</span>
|
||||
<span class="s2">"webserver_proxy"</span><span class="p">:</span> <span class="p">[],</span>
|
||||
<span class="s2">"webserver_internal"</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">"""</span>
|
||||
<span class="sd"> Repeated maintenance tasks for the portal.</span>
|
||||
|
||||
<span class="sd"> """</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">"before"</span><span class="p">,</span> <span class="s2">"shutdown"</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">"lockdown_mode"</span><span class="p">]</span> <span class="o">=</span> <span class="s2">" LOCKDOWN_MODE active: Only local connections."</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">"127.0.0.1"</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">""</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">"0.0.0.0"</span><span class="p">,</span> <span class="s2">"::"</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">></span> <span class="mi">1</span><span class="p">:</span>
|
||||
<span class="n">ifacestr</span> <span class="o">=</span> <span class="s2">"-</span><span class="si">%s</span><span class="s2">"</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">"</span><span class="si">%s</span><span class="s2">:</span><span class="si">%s</span><span class="s2">"</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">"EvenniaSSL</span><span class="si">%s</span><span class="s2">"</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">"telnet_ssl"</span><span class="p">]</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="s2">"telnet+ssl</span><span class="si">%s</span><span class="s2">: </span><span class="si">%s</span><span class="s2">"</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">"telnet_ssl"</span><span class="p">]</span><span class="o">.</span><span class="n">append</span><span class="p">(</span>
|
||||
<span class="s2">"telnet+ssl</span><span class="si">%s</span><span class="s2">: </span><span class="si">%s</span><span class="s2"> (deactivated - keys/cert unset)"</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">""</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">"0.0.0.0"</span><span class="p">,</span> <span class="s2">"::"</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">></span> <span class="mi">1</span><span class="p">:</span>
|
||||
<span class="n">ifacestr</span> <span class="o">=</span> <span class="s2">"-</span><span class="si">%s</span><span class="s2">"</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">"</span><span class="si">%s</span><span class="s2">:</span><span class="si">%s</span><span class="s2">"</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">"protocolFactory"</span><span class="p">:</span> <span class="n">_ssh_protocol</span><span class="p">,</span>
|
||||
<span class="s2">"protocolArgs"</span><span class="p">:</span> <span class="p">(),</span>
|
||||
<span class="s2">"sessions"</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">"EvenniaSSH</span><span class="si">%s</span><span class="s2">"</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">"ssh"</span><span class="p">]</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="s2">"ssh</span><span class="si">%s</span><span class="s2">: </span><span class="si">%s</span><span class="s2">"</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">""</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">"0.0.0.0"</span><span class="p">,</span> <span class="s2">"::"</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">></span> <span class="mi">1</span><span class="p">:</span>
|
||||
<span class="n">ifacestr</span> <span class="o">=</span> <span class="s2">"-</span><span class="si">%s</span><span class="s2">"</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">"127.0.0.1"</span><span class="p">,</span> <span class="n">serverport</span><span class="p">,</span> <span class="s2">""</span><span class="p">)</span>
|
||||
<span class="n">webclientstr</span> <span class="o">=</span> <span class="s2">""</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">"webclientdata"</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">"webclient (ajax only)"</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">"127.0.0.1"</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">""</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">"0.0.0.0"</span><span class="p">,</span> <span class="s2">"::"</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">></span> <span class="mi">1</span>
|
||||
<span class="p">):</span>
|
||||
<span class="n">w_ifacestr</span> <span class="o">=</span> <span class="s2">"-</span><span class="si">%s</span><span class="s2">"</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">"Only here for better naming in logs"</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">"EvenniaWebSocket</span><span class="si">%s</span><span class="s2">:</span><span class="si">%s</span><span class="s2">"</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">"webclient-websocket</span><span class="si">%s</span><span class="s2">: </span><span class="si">%s</span><span class="s2">"</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">"webclient"</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">"errors"</span><span class="p">]</span> <span class="o">=</span> <span class="p">(</span>
|
||||
<span class="s2">"WARNING: settings.WEB_PLUGINS_MODULE not found - "</span>
|
||||
<span class="s2">"copy 'evennia/game_template/server/conf/web_plugins.py to "</span>
|
||||
<span class="s2">"mygame/server/conf."</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">"errors"</span><span class="p">]</span> <span class="o">=</span> <span class="p">(</span>
|
||||
<span class="s2">"WARNING: WEB_PLUGINS_MODULE is enabled but at_webproxy_root_creation() "</span>
|
||||
<span class="s2">"not found copy 'evennia/game_template/server/conf/web_plugins.py to "</span>
|
||||
<span class="s2">"mygame/server/conf."</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">"EvenniaWebProxy</span><span class="si">%s</span><span class="s2">:</span><span class="si">%s</span><span class="s2">"</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">"webserver_proxy"</span><span class="p">]</span><span class="o">.</span><span class="n">append</span><span class="p">(</span>
|
||||
<span class="s2">"webserver-proxy</span><span class="si">%s</span><span class="s2">: </span><span class="si">%s</span><span class="s2">"</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">"webserver_internal"</span><span class="p">]</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="s2">"webserver: </span><span class="si">%s</span><span class="s2">"</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">""</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">"0.0.0.0"</span><span class="p">,</span> <span class="s2">"::"</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">></span> <span class="mi">1</span><span class="p">:</span>
|
||||
<span class="n">ifacestr</span> <span class="o">=</span> <span class="s2">"-</span><span class="si">%s</span><span class="s2">"</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">"</span><span class="si">%s</span><span class="s2">:</span><span class="si">%s</span><span class="s2">"</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">"EvenniaTelnet</span><span class="si">%s</span><span class="s2">"</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">"telnet"</span><span class="p">]</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="s2">"telnet</span><span class="si">%s</span><span class="s2">: </span><span class="si">%s</span><span class="s2">"</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">"amp"</span><span class="p">]</span> <span class="o">=</span> <span class="s2">"amp: </span><span class="si">%s</span><span class="s2">"</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">"PortalAMPServer"</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">"""</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'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"> """</span>
|
||||
<span class="n">server_twistd_cmd</span> <span class="o">=</span> <span class="p">[</span>
|
||||
<span class="s2">"twistd"</span><span class="p">,</span>
|
||||
<span class="s2">"--python=</span><span class="si">{}</span><span class="s2">"</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">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">"server.py"</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">"nt"</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">"--pidfile=</span><span class="si">{}</span><span class="s2">"</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">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">"server"</span><span class="p">,</span> <span class="s2">"server.pid"</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">"""</span>
|
||||
<span class="sd"> Return the Portal info, for display.</span>
|
||||
|
||||
<span class="sd"> """</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">"""</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'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"> """</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">"shutdown_complete"</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">"shutdown"</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> »</li>
|
||||
<li class="nav-item nav-item-1"><a href="../../../index.html" >Module code</a> »</li>
|
||||
<li class="nav-item nav-item-2"><a href="../../../evennia.html" >evennia</a> »</li>
|
||||
<li class="nav-item nav-item-this"><a href="">evennia.server.portal.service</a></li>
|
||||
</ul>
|
||||
</div>
|
||||
|
||||
|
||||
|
||||
<div class="footer" role="contentinfo">
|
||||
© Copyright 2023, The Evennia developer community.
|
||||
Created using <a href="https://www.sphinx-doc.org/">Sphinx</a> 3.2.1.
|
||||
</div>
|
||||
</body>
|
||||
</html>
|
||||
|
|
@ -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>
|
||||
|
|
|
|||
808
docs/2.x/_modules/evennia/server/service.html
Normal file
808
docs/2.x/_modules/evennia/server/service.html
Normal 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 — 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> »</li>
|
||||
<li class="nav-item nav-item-1"><a href="../../index.html" >Module code</a> »</li>
|
||||
<li class="nav-item nav-item-2"><a href="../../evennia.html" accesskey="U">evennia</a> »</li>
|
||||
<li class="nav-item nav-item-this"><a href="">evennia.server.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">"""</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">"""</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">"web_root"</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">"reload"</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">"reload"</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">"servername"</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">"version"</span><span class="p">:</span> <span class="n">get_evennia_version</span><span class="p">(),</span>
|
||||
<span class="s2">"amp"</span><span class="p">:</span> <span class="s2">""</span><span class="p">,</span>
|
||||
<span class="s2">"errors"</span><span class="p">:</span> <span class="s2">""</span><span class="p">,</span>
|
||||
<span class="s2">"info"</span><span class="p">:</span> <span class="s2">""</span><span class="p">,</span>
|
||||
<span class="s2">"webserver"</span><span class="p">:</span> <span class="s2">""</span><span class="p">,</span>
|
||||
<span class="s2">"irc_rss"</span><span class="p">:</span> <span class="s2">""</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'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">"""</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"> """</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">"runtime"</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">"runtime"</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">></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">"puppeted"</span><span class="p">,</span> <span class="n">category</span><span class="o">=</span><span class="s2">"account"</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">" (connection lost)"</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">"puppeted"</span><span class="p">,</span> <span class="n">category</span><span class="o">=</span><span class="s2">"account"</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">"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."</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">></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">"idle timeout exceeded"</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">></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">"noidletimeout"</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">"server_starting_mode"</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">"Server server_starting_mode couldn't be set - database not set up."</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">"irc"</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">"rss"</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">"grapevine"</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">"irc_rss"</span><span class="p">]</span> <span class="o">=</span> <span class="s2">", "</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">" enabled."</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">"server_starting_mode"</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">"Server server_starting_mode couldn't unset - db not set up."</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">"Could not load plugin module </span><span class="si">{</span><span class="n">plugin_module</span><span class="si">}</span><span class="s2">"</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">""</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">"127.0.0.1"</span><span class="p">:</span>
|
||||
<span class="n">ifacestr</span> <span class="o">=</span> <span class="s2">"-</span><span class="si">%s</span><span class="s2">"</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">"amp"</span><span class="p">]</span> <span class="o">=</span> <span class="s2">"amp </span><span class="si">%s</span><span class="s2">: </span><span class="si">%s</span><span class="s2">"</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">"ServerAMPClient"</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">"media"</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">"static"</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">"errors"</span><span class="p">]</span> <span class="o">=</span> <span class="p">(</span>
|
||||
<span class="s2">"WARNING: settings.WEB_PLUGINS_MODULE not found - "</span>
|
||||
<span class="s2">"copy 'evennia/game_template/server/conf/web_plugins.py to mygame/server/conf."</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">"webserver"</span><span class="p">]</span> <span class="o">=</span> <span class="s2">""</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">"127.0.0.1"</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">"EvenniaWebServer</span><span class="si">%s</span><span class="s2">"</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">"webserver"</span><span class="p">]</span> <span class="o">+=</span> <span class="s2">"webserver: </span><span class="si">%s</span><span class="s2">"</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">"""</span>
|
||||
<span class="sd"> Optimize some SQLite stuff at startup since we</span>
|
||||
<span class="sd"> can't save it to the database.</span>
|
||||
<span class="sd"> """</span>
|
||||
<span class="k">if</span> <span class="p">(</span>
|
||||
<span class="s2">"."</span><span class="o">.</span><span class="n">join</span><span class="p">(</span><span class="nb">str</span><span class="p">(</span><span class="n">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"><</span> <span class="s2">"1.2"</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">"default"</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">"ENGINE"</span><span class="p">)</span> <span class="o">==</span> <span class="s2">"sqlite3"</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">"DATABASES"</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">"default"</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">"ENGINE"</span><span class="p">,</span> <span class="kc">None</span><span class="p">)</span>
|
||||
<span class="o">==</span> <span class="s2">"django.db.backends.sqlite3"</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">"PRAGMA cache_size=10000"</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">"PRAGMA synchronous=OFF"</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">"PRAGMA count_changes=OFF"</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">"PRAGMA temp_store=2"</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">"""</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"> """</span>
|
||||
|
||||
<span class="c1"># setting names</span>
|
||||
<span class="n">settings_names</span> <span class="o">=</span> <span class="p">(</span>
|
||||
<span class="s2">"CMDSET_CHARACTER"</span><span class="p">,</span>
|
||||
<span class="s2">"CMDSET_ACCOUNT"</span><span class="p">,</span>
|
||||
<span class="s2">"BASE_ACCOUNT_TYPECLASS"</span><span class="p">,</span>
|
||||
<span class="s2">"BASE_OBJECT_TYPECLASS"</span><span class="p">,</span>
|
||||
<span class="s2">"BASE_CHARACTER_TYPECLASS"</span><span class="p">,</span>
|
||||
<span class="s2">"BASE_ROOM_TYPECLASS"</span><span class="p">,</span>
|
||||
<span class="s2">"BASE_EXIT_TYPECLASS"</span><span class="p">,</span>
|
||||
<span class="s2">"BASE_SCRIPT_TYPECLASS"</span><span class="p">,</span>
|
||||
<span class="s2">"BASE_CHANNEL_TYPECLASS"</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'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">"info"</span>
|
||||
<span class="p">]</span> <span class="o">=</span> <span class="s2">" </span><span class="si">%s</span><span class="s2">:</span><span class="se">\n</span><span class="s2"> '</span><span class="si">%s</span><span class="s2">' changed to '</span><span class="si">%s</span><span class="s2">'. Updating unchanged entries in database ..."</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 "previous"</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">"""</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 'done'</span>
|
||||
|
||||
<span class="sd"> """</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">"last_initial_setup_step"</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">"info"</span><span class="p">]</span> <span class="o">=</span> <span class="s2">" Server started for the first time. Setting defaults."</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">"done"</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 'done' 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">"info"</span><span class="p">]</span> <span class="o">=</span> <span class="s2">" Resuming initial setup from step '</span><span class="si">{last}</span><span class="s2">'."</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">"Error in initial setup. Stopping Server + Portal."</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">"""</span>
|
||||
<span class="sd"> check so default channels exist on every restart, create if not.</span>
|
||||
|
||||
<span class="sd"> """</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">"key"</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">"key"</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">"key"</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">"""</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"> """</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">"reload"</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">"Server successfully reloaded."</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">"reset"</span><span class="p">:</span>
|
||||
<span class="c1"># only run hook, don'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">"Evennia Server successfully restarted in 'reset' mode."</span><span class="p">)</span>
|
||||
<span class="k">elif</span> <span class="n">mode</span> <span class="o">==</span> <span class="s2">"shutdown"</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">"Evennia Server successfully started."</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">"reload"</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">"""</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"> - 'reload' - server restarts, no "persistent" scripts</span>
|
||||
<span class="sd"> are stopped, at_reload hooks called.</span>
|
||||
<span class="sd"> - 'reset' - 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"> - 'shutdown' - 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"> """</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">"shutdown_complete"</span><span class="p">):</span>
|
||||
<span class="c1"># this means we have already passed through this method</span>
|
||||
<span class="c1"># once; we don'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">"reload"</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">"server_restart_mode"</span><span class="p">,</span> <span class="s2">"reload"</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">"reset"</span><span class="p">:</span>
|
||||
<span class="c1"># like shutdown but don't unset the is_connected flag and don'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">"is_connected"</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">"server_restart_mode"</span><span class="p">,</span> <span class="s2">"reset"</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">"web_root"</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">"runtime"</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">"""</span>
|
||||
<span class="sd"> Return the server info, for display.</span>
|
||||
|
||||
<span class="sd"> """</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">"""</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"> """</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">"""</span>
|
||||
<span class="sd"> This is called first when the server is starting, before any other hooks, regardless of how it's starting.</span>
|
||||
<span class="sd"> """</span>
|
||||
<span class="bp">self</span><span class="o">.</span><span class="n">_call_start_stop</span><span class="p">(</span><span class="s2">"at_server_init"</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">"""</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"> """</span>
|
||||
<span class="bp">self</span><span class="o">.</span><span class="n">_call_start_stop</span><span class="p">(</span><span class="s2">"at_server_start"</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">"""</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"> """</span>
|
||||
<span class="bp">self</span><span class="o">.</span><span class="n">_call_start_stop</span><span class="p">(</span><span class="s2">"at_server_stop"</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">"""</span>
|
||||
<span class="sd"> This is called only when server starts back up after a reload.</span>
|
||||
|
||||
<span class="sd"> """</span>
|
||||
<span class="bp">self</span><span class="o">.</span><span class="n">_call_start_stop</span><span class="p">(</span><span class="s2">"at_server_reload_start"</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">"""</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 'reload', 'reset' or 'shutdown'.</span>
|
||||
|
||||
<span class="sd"> """</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">"reload"</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">"reload"</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">"server_restart_mode"</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">"""</span>
|
||||
<span class="sd"> This is called only time the server stops before a reload.</span>
|
||||
|
||||
<span class="sd"> """</span>
|
||||
<span class="bp">self</span><span class="o">.</span><span class="n">_call_start_stop</span><span class="p">(</span><span class="s2">"at_server_reload_stop"</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">"""</span>
|
||||
<span class="sd"> This is called only when the server starts "cold", i.e. after a</span>
|
||||
<span class="sd"> shutdown or a reset.</span>
|
||||
|
||||
<span class="sd"> """</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">"at_server_cold_start"</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">"""</span>
|
||||
<span class="sd"> This is called only when the server goes down due to a shutdown or reset.</span>
|
||||
|
||||
<span class="sd"> """</span>
|
||||
<span class="bp">self</span><span class="o">.</span><span class="n">_call_start_stop</span><span class="p">(</span><span class="s2">"at_server_cold_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> »</li>
|
||||
<li class="nav-item nav-item-1"><a href="../../index.html" >Module code</a> »</li>
|
||||
<li class="nav-item nav-item-2"><a href="../../evennia.html" >evennia</a> »</li>
|
||||
<li class="nav-item nav-item-this"><a href="">evennia.server.service</a></li>
|
||||
</ul>
|
||||
</div>
|
||||
|
||||
|
||||
|
||||
<div class="footer" role="contentinfo">
|
||||
© Copyright 2023, The Evennia developer community.
|
||||
Created using <a href="https://www.sphinx-doc.org/">Sphinx</a> 3.2.1.
|
||||
</div>
|
||||
</body>
|
||||
</html>
|
||||
|
|
@ -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>
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue