Updated HTML docs.

This commit is contained in:
Evennia docbuilder action 2023-12-02 19:37:09 +00:00
parent 90cc0d8d92
commit ae58d94a51
684 changed files with 260 additions and 110 deletions

View file

@ -91,16 +91,15 @@
<span class="kn">from</span> <span class="nn">anything</span> <span class="kn">import</span> <span class="n">Something</span>
<span class="kn">from</span> <span class="nn">django.test</span> <span class="kn">import</span> <span class="n">override_settings</span>
<span class="kn">from</span> <span class="nn">mock</span> <span class="kn">import</span> <span class="n">Mock</span><span class="p">,</span> <span class="n">patch</span>
<span class="kn">from</span> <span class="nn">evennia.utils.create</span> <span class="kn">import</span> <span class="n">create_object</span>
<span class="kn">from</span> <span class="nn">evennia.utils.test_resources</span> <span class="kn">import</span> <span class="n">EvenniaTestCase</span>
<span class="kn">from</span> <span class="nn">mock</span> <span class="kn">import</span> <span class="n">Mock</span><span class="p">,</span> <span class="n">patch</span>
<span class="kn">from</span> <span class="nn">.llm_npc</span> <span class="kn">import</span> <span class="n">LLMNPC</span>
<div class="viewcode-block" id="TestLLMClient"><a class="viewcode-back" href="../../../../../api/evennia.contrib.rpg.llm.tests.html#evennia.contrib.rpg.llm.tests.TestLLMClient">[docs]</a><span class="k">class</span> <span class="nc">TestLLMClient</span><span class="p">(</span><span class="n">EvenniaTestCase</span><span class="p">):</span>
<div class="viewcode-block" id="TestLLMClient.test_npc_at_talked_to"><a class="viewcode-back" href="../../../../../api/evennia.contrib.rpg.llm.tests.html#evennia.contrib.rpg.llm.tests.TestLLMClient.test_npc_at_talked_to">[docs]</a> <span class="nd">@override_settings</span><span class="p">(</span><span class="n">LLM_PROMPT_PREFIX</span><span class="o">=</span><span class="s2">&quot;You are a test bot.&quot;</span><span class="p">)</span>
<div class="viewcode-block" id="TestLLMClient.test_npc_at_talked_to"><a class="viewcode-back" href="../../../../../api/evennia.contrib.rpg.llm.tests.html#evennia.contrib.rpg.llm.tests.TestLLMClient.test_npc_at_talked_to">[docs]</a> <span class="nd">@override_settings</span><span class="p">(</span><span class="n">LLM_PROMPT_PREFIX</span><span class="o">=</span><span class="s2">&quot;You are a test bot.&quot;</span><span class="p">,</span> <span class="n">TEST_ENVIRONMENT</span><span class="o">=</span><span class="kc">True</span><span class="p">)</span>
<span class="nd">@patch</span><span class="p">(</span><span class="s2">&quot;evennia.contrib.rpg.llm.llm_npc.task.deferLater&quot;</span><span class="p">)</span>
<span class="k">def</span> <span class="nf">test_npc_at_talked_to</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">mock_deferLater</span><span class="p">):</span>
<span class="w"> </span><span class="sd">&quot;&quot;&quot;</span>

View file

@ -117,7 +117,7 @@
<span class="kn">from</span> <span class="nn">evennia.utils</span> <span class="kn">import</span> <span class="n">utils</span>
<span class="kn">from</span> <span class="nn">evennia.utils.ansi</span> <span class="kn">import</span> <span class="n">parse_ansi</span>
<span class="kn">from</span> <span class="nn">evennia.utils.text2html</span> <span class="kn">import</span> <span class="n">parse_html</span>
<span class="kn">from</span> <span class="nn">evennia.utils.utils</span> <span class="kn">import</span> <span class="n">to_bytes</span>
<span class="kn">from</span> <span class="nn">evennia.utils.utils</span> <span class="kn">import</span> <span class="n">to_bytes</span><span class="p">,</span> <span class="n">ip_from_request</span>
<span class="n">_CLIENT_SESSIONS</span> <span class="o">=</span> <span class="n">utils</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">SESSION_ENGINE</span><span class="p">)</span><span class="o">.</span><span class="n">SessionStore</span>
<span class="n">_RE_SCREENREADER_REGEX</span> <span class="o">=</span> <span class="n">re</span><span class="o">.</span><span class="n">compile</span><span class="p">(</span>
@ -283,16 +283,7 @@
<span class="n">csessid</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">get_client_sessid</span><span class="p">(</span><span class="n">request</span><span class="p">)</span>
<span class="n">browserstr</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">get_browserstr</span><span class="p">(</span><span class="n">request</span><span class="p">)</span>
<span class="n">remote_addr</span> <span class="o">=</span> <span class="n">request</span><span class="o">.</span><span class="n">getClientIP</span><span class="p">()</span>
<span class="k">if</span> <span class="n">remote_addr</span> <span class="ow">in</span> <span class="n">settings</span><span class="o">.</span><span class="n">UPSTREAM_IPS</span> <span class="ow">and</span> <span class="n">request</span><span class="o">.</span><span class="n">getHeader</span><span class="p">(</span><span class="s2">&quot;x-forwarded-for&quot;</span><span class="p">):</span>
<span class="n">addresses</span> <span class="o">=</span> <span class="p">[</span><span class="n">x</span><span class="o">.</span><span class="n">strip</span><span class="p">()</span> <span class="k">for</span> <span class="n">x</span> <span class="ow">in</span> <span class="n">request</span><span class="o">.</span><span class="n">getHeader</span><span class="p">(</span><span class="s2">&quot;x-forwarded-for&quot;</span><span class="p">)</span><span class="o">.</span><span class="n">split</span><span class="p">(</span><span class="s2">&quot;,&quot;</span><span class="p">)]</span>
<span class="n">addresses</span><span class="o">.</span><span class="n">reverse</span><span class="p">()</span>
<span class="k">for</span> <span class="n">addr</span> <span class="ow">in</span> <span class="n">addresses</span><span class="p">:</span>
<span class="k">if</span> <span class="n">addr</span> <span class="ow">not</span> <span class="ow">in</span> <span class="n">settings</span><span class="o">.</span><span class="n">UPSTREAM_IPS</span><span class="p">:</span>
<span class="n">remote_addr</span> <span class="o">=</span> <span class="n">addr</span>
<span class="k">break</span>
<span class="n">remote_addr</span> <span class="o">=</span> <span class="n">ip_from_request</span><span class="p">(</span><span class="n">request</span><span class="p">)</span>
<span class="n">host_string</span> <span class="o">=</span> <span class="s2">&quot;</span><span class="si">%s</span><span class="s2"> (</span><span class="si">%s</span><span class="s2">:</span><span class="si">%s</span><span class="s2">)&quot;</span> <span class="o">%</span> <span class="p">(</span>
<span class="n">_SERVERNAME</span><span class="p">,</span>

View file

@ -183,6 +183,7 @@
<span class="n">BASE_GUEST_TYPECLASS</span><span class="o">=</span><span class="s2">&quot;evennia.accounts.accounts.DefaultGuest&quot;</span><span class="p">,</span>
<span class="c1"># a special setting boolean TEST_ENVIRONMENT is set by the test runner</span>
<span class="c1"># while the test suite is running.</span>
<span class="n">TEST_ENVIRONMENT</span><span class="o">=</span><span class="kc">True</span>
<span class="p">)</span>
<span class="n">DEFAULT_SETTINGS</span> <span class="o">=</span> <span class="p">{</span><span class="o">**</span><span class="n">all_from_module</span><span class="p">(</span><span class="n">settings_default</span><span class="p">),</span> <span class="o">**</span><span class="n">DEFAULT_SETTING_RESETS</span><span class="p">}</span>

View file

@ -97,6 +97,7 @@
<span class="kn">import</span> <span class="nn">importlib.machinery</span>
<span class="kn">import</span> <span class="nn">importlib.util</span>
<span class="kn">import</span> <span class="nn">inspect</span>
<span class="kn">import</span> <span class="nn">ipaddress</span>
<span class="kn">import</span> <span class="nn">math</span>
<span class="kn">import</span> <span class="nn">os</span>
<span class="kn">import</span> <span class="nn">random</span>
@ -3028,6 +3029,81 @@
<span class="c1"># invalid number-word, raise ValueError</span>
<span class="k">raise</span> <span class="ne">ValueError</span><span class="p">(</span><span class="sa">f</span><span class="s2">&quot;String </span><span class="si">{</span><span class="n">original_input</span><span class="si">}</span><span class="s2"> cannot be converted to int.&quot;</span><span class="p">)</span>
<span class="k">return</span> <span class="nb">sum</span><span class="p">(</span><span class="n">sums</span><span class="p">)</span></div>
<div class="viewcode-block" id="match_ip"><a class="viewcode-back" href="../../../api/evennia.utils.utils.html#evennia.commands.default.building.match_ip">[docs]</a><span class="k">def</span> <span class="nf">match_ip</span><span class="p">(</span><span class="n">address</span><span class="p">,</span> <span class="n">pattern</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="nb">bool</span><span class="p">:</span>
<span class="w"> </span><span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> Check if an IP address matches a given pattern. The pattern can be a single IP address</span>
<span class="sd"> such as 8.8.8.8 or a CIDR-formatted subnet like 10.0.0.0/8</span>
<span class="sd"> IPv6 is supported to, with CIDR-subnets looking like 2001:db8::/48</span>
<span class="sd"> Args:</span>
<span class="sd"> address (str): The source address being checked.</span>
<span class="sd"> pattern (str): The single IP address or subnet to check against.</span>
<span class="sd"> Returns:</span>
<span class="sd"> result (bool): Whether it was a match or not.</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="k">try</span><span class="p">:</span>
<span class="c1"># Convert the given IP address to an IPv4Address or IPv6Address object</span>
<span class="n">ip_obj</span> <span class="o">=</span> <span class="n">ipaddress</span><span class="o">.</span><span class="n">ip_address</span><span class="p">(</span><span class="n">address</span><span class="p">)</span>
<span class="k">except</span> <span class="ne">ValueError</span><span class="p">:</span>
<span class="c1"># Invalid IP address format</span>
<span class="k">return</span> <span class="kc">False</span>
<span class="k">try</span><span class="p">:</span>
<span class="c1"># Check if pattern is a single IP or a subnet</span>
<span class="k">if</span> <span class="s2">&quot;/&quot;</span> <span class="ow">in</span> <span class="n">pattern</span><span class="p">:</span>
<span class="c1"># It&#39;s (hopefully) a subnet in CIDR notation</span>
<span class="n">network</span> <span class="o">=</span> <span class="n">ipaddress</span><span class="o">.</span><span class="n">ip_network</span><span class="p">(</span><span class="n">pattern</span><span class="p">,</span> <span class="n">strict</span><span class="o">=</span><span class="kc">False</span><span class="p">)</span>
<span class="k">if</span> <span class="n">ip_obj</span> <span class="ow">in</span> <span class="n">network</span><span class="p">:</span>
<span class="k">return</span> <span class="kc">True</span>
<span class="k">else</span><span class="p">:</span>
<span class="c1"># It&#39;s a single IP address</span>
<span class="k">if</span> <span class="n">ip_obj</span> <span class="o">==</span> <span class="n">ipaddress</span><span class="o">.</span><span class="n">ip_address</span><span class="p">(</span><span class="n">pattern</span><span class="p">):</span>
<span class="k">return</span> <span class="kc">True</span>
<span class="k">except</span> <span class="ne">ValueError</span><span class="p">:</span>
<span class="k">return</span> <span class="kc">False</span>
<span class="k">return</span> <span class="kc">False</span></div>
<div class="viewcode-block" id="ip_from_request"><a class="viewcode-back" href="../../../api/evennia.utils.utils.html#evennia.commands.default.building.ip_from_request">[docs]</a><span class="k">def</span> <span class="nf">ip_from_request</span><span class="p">(</span><span class="n">request</span><span class="p">,</span> <span class="n">exclude</span><span class="o">=</span><span class="kc">None</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="nb">str</span><span class="p">:</span>
<span class="w"> </span><span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> Retrieves the IP address from a web Request, while respecting X-Forwarded-For and</span>
<span class="sd"> settings.UPSTREAM_IPS.</span>
<span class="sd"> Args:</span>
<span class="sd"> request (django Request or twisted.web.http.Request): The web request.</span>
<span class="sd"> exclude: (list, optional): A list of IP addresses to exclude from the check. If left none,</span>
<span class="sd"> then settings.UPSTREAM_IPS will be used.</span>
<span class="sd"> Returns:</span>
<span class="sd"> ip (str): The IP address the request originated from.</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="k">if</span> <span class="n">exclude</span> <span class="ow">is</span> <span class="kc">None</span><span class="p">:</span>
<span class="n">exclude</span> <span class="o">=</span> <span class="n">settings</span><span class="o">.</span><span class="n">UPSTREAM_IPS</span>
<span class="k">if</span> <span class="nb">hasattr</span><span class="p">(</span><span class="n">request</span><span class="p">,</span> <span class="s2">&quot;getClientIP&quot;</span><span class="p">):</span>
<span class="c1"># It&#39;s a twisted request.</span>
<span class="n">remote_addr</span> <span class="o">=</span> <span class="n">request</span><span class="o">.</span><span class="n">getClientIP</span><span class="p">()</span>
<span class="n">forwarded</span> <span class="o">=</span> <span class="n">request</span><span class="o">.</span><span class="n">getHeader</span><span class="p">(</span><span class="s2">&quot;x-forwarded-for&quot;</span><span class="p">)</span>
<span class="k">else</span><span class="p">:</span>
<span class="c1"># it&#39;s a Django request.</span>
<span class="n">remote_addr</span> <span class="o">=</span> <span class="n">request</span><span class="o">.</span><span class="n">META</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s2">&quot;REMOTE_ADDR&quot;</span><span class="p">)</span>
<span class="n">forwarded</span> <span class="o">=</span> <span class="n">request</span><span class="o">.</span><span class="n">META</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s2">&quot;HTTP_X_FORWARDED_FOR&quot;</span><span class="p">)</span>
<span class="n">addresses</span> <span class="o">=</span> <span class="p">[</span><span class="n">remote_addr</span><span class="p">]</span>
<span class="k">if</span> <span class="n">forwarded</span><span class="p">:</span>
<span class="n">addresses</span><span class="o">.</span><span class="n">extend</span><span class="p">(</span><span class="n">x</span><span class="o">.</span><span class="n">strip</span><span class="p">()</span> <span class="k">for</span> <span class="n">x</span> <span class="ow">in</span> <span class="n">forwarded</span><span class="o">.</span><span class="n">split</span><span class="p">(</span><span class="s2">&quot;,&quot;</span><span class="p">))</span>
<span class="k">for</span> <span class="n">addr</span> <span class="ow">in</span> <span class="nb">reversed</span><span class="p">(</span><span class="n">addresses</span><span class="p">):</span>
<span class="k">if</span> <span class="nb">all</span><span class="p">(</span><span class="ow">not</span> <span class="n">match_ip</span><span class="p">(</span><span class="n">addr</span><span class="p">,</span> <span class="n">pattern</span><span class="p">)</span> <span class="k">for</span> <span class="n">pattern</span> <span class="ow">in</span> <span class="n">exclude</span><span class="p">):</span>
<span class="k">return</span> <span class="n">addr</span>
<span class="n">logger</span><span class="o">.</span><span class="n">log_warn</span><span class="p">(</span><span class="s2">&quot;ip_from_request: No valid IP address found in request. Using remote_addr.&quot;</span><span class="p">)</span>
<span class="k">return</span> <span class="n">remote_addr</span></div>
</pre></div>
</div>

View file

@ -87,7 +87,21 @@
<span></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">login</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.utils</span> <span class="kn">import</span> <span class="n">logger</span>
<span class="kn">from</span> <span class="nn">evennia.utils</span> <span class="kn">import</span> <span class="n">logger</span><span class="p">,</span> <span class="n">ip_from_request</span>
<div class="viewcode-block" id="OriginIpMiddleware"><a class="viewcode-back" href="../../../../api/evennia.web.utils.middleware.html#evennia.web.utils.middleware.OriginIpMiddleware">[docs]</a><span class="k">class</span> <span class="nc">OriginIpMiddleware</span><span class="p">:</span>
<span class="w"> </span><span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> This Django Middleware simply sets the request.origin_ip attribute to what is</span>
<span class="sd"> respected by the Evennia Server, taking into account settings.UPSTREAM_IPS.</span>
<span class="sd"> &quot;&quot;&quot;</span>
<div class="viewcode-block" id="OriginIpMiddleware.__init__"><a class="viewcode-back" href="../../../../api/evennia.web.utils.middleware.html#evennia.web.utils.middleware.OriginIpMiddleware.__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="n">get_response</span><span class="p">):</span>
<span class="bp">self</span><span class="o">.</span><span class="n">get_response</span> <span class="o">=</span> <span class="n">get_response</span></div>
<span class="k">def</span> <span class="fm">__call__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">request</span><span class="p">):</span>
<span class="n">request</span><span class="o">.</span><span class="n">origin_ip</span> <span class="o">=</span> <span class="n">ip_from_request</span><span class="p">(</span><span class="n">request</span><span class="p">)</span>
<span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">get_response</span><span class="p">(</span><span class="n">request</span><span class="p">)</span></div>
<div class="viewcode-block" id="SharedLoginMiddleware"><a class="viewcode-back" href="../../../../api/evennia.web.utils.middleware.html#evennia.web.utils.middleware.SharedLoginMiddleware">[docs]</a><span class="k">class</span> <span class="nc">SharedLoginMiddleware</span><span class="p">(</span><span class="nb">object</span><span class="p">):</span>