mirror of
https://github.com/evennia/evennia.git
synced 2026-03-31 13:07:16 +02:00
1720 lines
No EOL
198 KiB
HTML
1720 lines
No EOL
198 KiB
HTML
|
|
<!DOCTYPE html>
|
|
|
|
<html>
|
|
<head>
|
|
<meta charset="utf-8" />
|
|
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
|
|
<title>evennia.contrib.rpsystem — Evennia 0.9.5 documentation</title>
|
|
<link rel="stylesheet" href="../../../_static/nature.css" type="text/css" />
|
|
<link rel="stylesheet" href="../../../_static/pygments.css" type="text/css" />
|
|
<script id="documentation_options" data-url_root="../../../" src="../../../_static/documentation_options.js"></script>
|
|
<script src="../../../_static/jquery.js"></script>
|
|
<script src="../../../_static/underscore.js"></script>
|
|
<script src="../../../_static/doctools.js"></script>
|
|
<script src="../../../_static/language_data.js"></script>
|
|
<link rel="shortcut icon" href="../../../_static/favicon.ico"/>
|
|
<link rel="index" title="Index" href="../../../genindex.html" />
|
|
<link rel="search" title="Search" href="../../../search.html" />
|
|
</head><body>
|
|
<div class="related" role="navigation" aria-label="related navigation">
|
|
<h3>Navigation</h3>
|
|
<ul>
|
|
<li class="right" style="margin-right: 10px">
|
|
<a href="../../../genindex.html" title="General Index"
|
|
accesskey="I">index</a></li>
|
|
<li class="right" >
|
|
<a href="../../../py-modindex.html" title="Python Module Index"
|
|
>modules</a> |</li>
|
|
<li class="nav-item nav-item-0"><a href="../../../index.html">Evennia 0.9.5</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.contrib.rpsystem</a></li>
|
|
</ul>
|
|
<div class="develop">develop branch</div>
|
|
</div>
|
|
|
|
<div class="document">
|
|
<div class="documentwrapper">
|
|
<div class="bodywrapper">
|
|
<div class="body" role="main">
|
|
|
|
<h1>Source code for evennia.contrib.rpsystem</h1><div class="highlight"><pre>
|
|
<span></span><span class="sd">"""</span>
|
|
<span class="sd">Roleplaying base system for Evennia</span>
|
|
|
|
<span class="sd">Contribution - Griatch, 2015</span>
|
|
|
|
<span class="sd">This module contains the ContribRPObject, ContribRPRoom and</span>
|
|
<span class="sd">ContribRPCharacter typeclasses. If you inherit your</span>
|
|
<span class="sd">objects/rooms/character from these (or make them the defaults) from</span>
|
|
<span class="sd">these you will get the following features:</span>
|
|
|
|
<span class="sd"> - Objects/Rooms will get the ability to have poses and will report</span>
|
|
<span class="sd"> the poses of items inside them (the latter most useful for Rooms).</span>
|
|
<span class="sd"> - Characters will get poses and also sdescs (short descriptions)</span>
|
|
<span class="sd"> that will be used instead of their keys. They will gain commands</span>
|
|
<span class="sd"> for managing recognition (custom sdesc-replacement), masking</span>
|
|
<span class="sd"> themselves as well as an advanced free-form emote command.</span>
|
|
|
|
<span class="sd">To use, simply import the typclasses you want from this module and use</span>
|
|
<span class="sd">them to create your objects, or set them to default.</span>
|
|
|
|
<span class="sd">In more detail, This RP base system introduces the following features</span>
|
|
<span class="sd">to a game, common to many RP-centric games:</span>
|
|
|
|
<span class="sd"> - emote system using director stance emoting (names/sdescs).</span>
|
|
<span class="sd"> This uses a customizable replacement noun (/me, @ etc) to</span>
|
|
<span class="sd"> represent you in the emote. You can use /sdesc, /nick, /key or</span>
|
|
<span class="sd"> /alias to reference objects in the room. You can use any</span>
|
|
<span class="sd"> number of sdesc sub-parts to differentiate a local sdesc, or</span>
|
|
<span class="sd"> use /1-sdesc etc to differentiate them. The emote also</span>
|
|
<span class="sd"> identifies nested says.</span>
|
|
<span class="sd"> - sdesc obscuration of real character names for use in emotes</span>
|
|
<span class="sd"> and in any referencing such as object.search(). This relies</span>
|
|
<span class="sd"> on an SdescHandler `sdesc` being set on the Character and</span>
|
|
<span class="sd"> makes use of a custom Character.get_display_name hook. If</span>
|
|
<span class="sd"> sdesc is not set, the character's `key` is used instead. This</span>
|
|
<span class="sd"> is particularly used in the emoting system.</span>
|
|
<span class="sd"> - recog system to assign your own nicknames to characters, can then</span>
|
|
<span class="sd"> be used for referencing. The user may recog a user and assign</span>
|
|
<span class="sd"> any personal nick to them. This will be shown in descriptions</span>
|
|
<span class="sd"> and used to reference them. This is making use of the nick</span>
|
|
<span class="sd"> functionality of Evennia.</span>
|
|
<span class="sd"> - masks to hide your identity (using a simple lock).</span>
|
|
<span class="sd"> - pose system to set room-persistent poses, visible in room</span>
|
|
<span class="sd"> descriptions and when looking at the person/object. This is a</span>
|
|
<span class="sd"> simple Attribute that modifies how the characters is viewed when</span>
|
|
<span class="sd"> in a room as sdesc + pose.</span>
|
|
<span class="sd"> - in-emote says, including seamless integration with language</span>
|
|
<span class="sd"> obscuration routine (such as contrib/rplanguage.py)</span>
|
|
|
|
<span class="sd">Examples:</span>
|
|
|
|
<span class="sd">> look</span>
|
|
<span class="sd">Tavern</span>
|
|
<span class="sd">The tavern is full of nice people</span>
|
|
|
|
<span class="sd">*A tall man* is standing by the bar.</span>
|
|
|
|
<span class="sd">Above is an example of a player with an sdesc "a tall man". It is also</span>
|
|
<span class="sd">an example of a static *pose*: The "standing by the bar" has been set</span>
|
|
<span class="sd">by the player of the tall man, so that people looking at him can tell</span>
|
|
<span class="sd">at a glance what is going on.</span>
|
|
|
|
<span class="sd">> emote /me looks at /tall and says "Hello!"</span>
|
|
|
|
<span class="sd">I see:</span>
|
|
<span class="sd"> Griatch looks at Tall man and says "Hello".</span>
|
|
<span class="sd">Tall man (assuming his name is Tom) sees:</span>
|
|
<span class="sd"> The godlike figure looks at Tom and says "Hello".</span>
|
|
|
|
<span class="sd">Verbose Installation Instructions:</span>
|
|
|
|
<span class="sd"> 1. In typeclasses/character.py:</span>
|
|
<span class="sd"> Import the `ContribRPCharacter` class:</span>
|
|
<span class="sd"> `from evennia.contrib.rpsystem import ContribRPCharacter`</span>
|
|
<span class="sd"> Inherit ContribRPCharacter:</span>
|
|
<span class="sd"> Change "class Character(DefaultCharacter):" to</span>
|
|
<span class="sd"> `class Character(ContribRPCharacter):`</span>
|
|
<span class="sd"> If you have any overriden calls in `at_object_creation(self)`:</span>
|
|
<span class="sd"> Add `super().at_object_creation()` as the top line.</span>
|
|
<span class="sd"> 2. In `typeclasses/rooms.py`:</span>
|
|
<span class="sd"> Import the `ContribRPRoom` class:</span>
|
|
<span class="sd"> `from evennia.contrib.rpsystem import ContribRPRoom`</span>
|
|
<span class="sd"> Inherit `ContribRPRoom`:</span>
|
|
<span class="sd"> Change `class Room(DefaultRoom):` to</span>
|
|
<span class="sd"> `class Room(ContribRPRoom):`</span>
|
|
<span class="sd"> 3. In `typeclasses/objects.py`</span>
|
|
<span class="sd"> Import the `ContribRPObject` class:</span>
|
|
<span class="sd"> `from evennia.contrib.rpsystem import ContribRPObject`</span>
|
|
<span class="sd"> Inherit `ContribRPObject`:</span>
|
|
<span class="sd"> Change `class Object(DefaultObject):` to</span>
|
|
<span class="sd"> `class Object(ContribRPObject):`</span>
|
|
<span class="sd"> 4. Reload the server (@reload or from console: "evennia reload")</span>
|
|
<span class="sd"> 5. Force typeclass updates as required. Example for your character:</span>
|
|
<span class="sd"> @type/reset/force me = typeclasses.characters.Character</span>
|
|
|
|
<span class="sd">"""</span>
|
|
<span class="kn">import</span> <span class="nn">re</span>
|
|
<span class="kn">from</span> <span class="nn">re</span> <span class="k">import</span> <span class="n">escape</span> <span class="k">as</span> <span class="n">re_escape</span>
|
|
<span class="kn">import</span> <span class="nn">itertools</span>
|
|
<span class="kn">from</span> <span class="nn">django.conf</span> <span class="k">import</span> <span class="n">settings</span>
|
|
<span class="kn">from</span> <span class="nn">evennia</span> <span class="k">import</span> <span class="n">DefaultObject</span><span class="p">,</span> <span class="n">DefaultCharacter</span><span class="p">,</span> <span class="n">ObjectDB</span>
|
|
<span class="kn">from</span> <span class="nn">evennia</span> <span class="k">import</span> <span class="n">Command</span><span class="p">,</span> <span class="n">CmdSet</span>
|
|
<span class="kn">from</span> <span class="nn">evennia</span> <span class="k">import</span> <span class="n">ansi</span>
|
|
<span class="kn">from</span> <span class="nn">evennia.utils.utils</span> <span class="k">import</span> <span class="n">lazy_property</span><span class="p">,</span> <span class="n">make_iter</span><span class="p">,</span> <span class="n">variable_from_module</span>
|
|
|
|
<span class="n">_AT_SEARCH_RESULT</span> <span class="o">=</span> <span class="n">variable_from_module</span><span class="p">(</span><span class="o">*</span><span class="n">settings</span><span class="o">.</span><span class="n">SEARCH_AT_RESULT</span><span class="o">.</span><span class="n">rsplit</span><span class="p">(</span><span class="s2">"."</span><span class="p">,</span> <span class="mi">1</span><span class="p">))</span>
|
|
<span class="c1"># ------------------------------------------------------------</span>
|
|
<span class="c1"># Emote parser</span>
|
|
<span class="c1"># ------------------------------------------------------------</span>
|
|
|
|
<span class="c1"># Settings</span>
|
|
|
|
<span class="c1"># The prefix is the (single-character) symbol used to find the start</span>
|
|
<span class="c1"># of a object reference, such as /tall (note that</span>
|
|
<span class="c1"># the system will understand multi-word references like '/a tall man' too).</span>
|
|
<span class="n">_PREFIX</span> <span class="o">=</span> <span class="s2">"/"</span>
|
|
|
|
<span class="c1"># The num_sep is the (single-character) symbol used to separate the</span>
|
|
<span class="c1"># sdesc from the number when trying to separate identical sdescs from</span>
|
|
<span class="c1"># one another. This is the same syntax used in the rest of Evennia, so</span>
|
|
<span class="c1"># by default, multiple "tall" can be separated by entering 1-tall,</span>
|
|
<span class="c1"># 2-tall etc.</span>
|
|
<span class="n">_NUM_SEP</span> <span class="o">=</span> <span class="s2">"-"</span>
|
|
|
|
<span class="c1"># Texts</span>
|
|
|
|
<span class="n">_EMOTE_NOMATCH_ERROR</span> <span class="o">=</span> <span class="s2">"""|RNo match for |r</span><span class="si">{ref}</span><span class="s2">|R.|n"""</span>
|
|
|
|
<span class="n">_EMOTE_MULTIMATCH_ERROR</span> <span class="o">=</span> <span class="s2">"""|RMultiple possibilities for </span><span class="si">{ref}</span><span class="s2">:</span>
|
|
<span class="s2"> |r</span><span class="si">{reflist}</span><span class="s2">|n"""</span>
|
|
|
|
<span class="n">_RE_FLAGS</span> <span class="o">=</span> <span class="n">re</span><span class="o">.</span><span class="n">MULTILINE</span> <span class="o">+</span> <span class="n">re</span><span class="o">.</span><span class="n">IGNORECASE</span> <span class="o">+</span> <span class="n">re</span><span class="o">.</span><span class="n">UNICODE</span>
|
|
|
|
<span class="n">_RE_PREFIX</span> <span class="o">=</span> <span class="n">re</span><span class="o">.</span><span class="n">compile</span><span class="p">(</span><span class="sa">r</span><span class="s2">"^</span><span class="si">%s</span><span class="s2">"</span> <span class="o">%</span> <span class="n">_PREFIX</span><span class="p">,</span> <span class="n">re</span><span class="o">.</span><span class="n">UNICODE</span><span class="p">)</span>
|
|
|
|
<span class="c1"># This regex will return groups (num, word), where num is an optional counter to</span>
|
|
<span class="c1"># separate multimatches from one another and word is the first word in the</span>
|
|
<span class="c1"># marker. So entering "/tall man" will return groups ("", "tall")</span>
|
|
<span class="c1"># and "/2-tall man" will return groups ("2", "tall").</span>
|
|
<span class="n">_RE_OBJ_REF_START</span> <span class="o">=</span> <span class="n">re</span><span class="o">.</span><span class="n">compile</span><span class="p">(</span><span class="sa">r</span><span class="s2">"</span><span class="si">%s</span><span class="s2">(?:([0-9]+)</span><span class="si">%s</span><span class="s2">)*(\w+)"</span> <span class="o">%</span> <span class="p">(</span><span class="n">_PREFIX</span><span class="p">,</span> <span class="n">_NUM_SEP</span><span class="p">),</span> <span class="n">_RE_FLAGS</span><span class="p">)</span>
|
|
|
|
<span class="n">_RE_LEFT_BRACKETS</span> <span class="o">=</span> <span class="n">re</span><span class="o">.</span><span class="n">compile</span><span class="p">(</span><span class="sa">r</span><span class="s2">"\{+"</span><span class="p">,</span> <span class="n">_RE_FLAGS</span><span class="p">)</span>
|
|
<span class="n">_RE_RIGHT_BRACKETS</span> <span class="o">=</span> <span class="n">re</span><span class="o">.</span><span class="n">compile</span><span class="p">(</span><span class="sa">r</span><span class="s2">"\}+"</span><span class="p">,</span> <span class="n">_RE_FLAGS</span><span class="p">)</span>
|
|
<span class="c1"># Reference markers are used internally when distributing the emote to</span>
|
|
<span class="c1"># all that can see it. They are never seen by players and are on the form {#dbref}.</span>
|
|
<span class="n">_RE_REF</span> <span class="o">=</span> <span class="n">re</span><span class="o">.</span><span class="n">compile</span><span class="p">(</span><span class="sa">r</span><span class="s2">"\{+\#([0-9]+)\}+"</span><span class="p">)</span>
|
|
|
|
<span class="c1"># This regex is used to quickly reference one self in an emote.</span>
|
|
<span class="n">_RE_SELF_REF</span> <span class="o">=</span> <span class="n">re</span><span class="o">.</span><span class="n">compile</span><span class="p">(</span><span class="sa">r</span><span class="s2">"/me|@"</span><span class="p">,</span> <span class="n">_RE_FLAGS</span><span class="p">)</span>
|
|
|
|
<span class="c1"># regex for non-alphanumberic end of a string</span>
|
|
<span class="n">_RE_CHAREND</span> <span class="o">=</span> <span class="n">re</span><span class="o">.</span><span class="n">compile</span><span class="p">(</span><span class="sa">r</span><span class="s2">"\W+$"</span><span class="p">,</span> <span class="n">_RE_FLAGS</span><span class="p">)</span>
|
|
|
|
<span class="c1"># reference markers for language</span>
|
|
<span class="n">_RE_REF_LANG</span> <span class="o">=</span> <span class="n">re</span><span class="o">.</span><span class="n">compile</span><span class="p">(</span><span class="sa">r</span><span class="s2">"\{+\##([0-9]+)\}+"</span><span class="p">)</span>
|
|
<span class="c1"># language says in the emote are on the form "..." or langname"..." (no spaces).</span>
|
|
<span class="c1"># this regex returns in groups (langname, say), where langname can be empty.</span>
|
|
<span class="n">_RE_LANGUAGE</span> <span class="o">=</span> <span class="n">re</span><span class="o">.</span><span class="n">compile</span><span class="p">(</span><span class="sa">r</span><span class="s2">"(?:\((\w+)\))*(</span><span class="se">\"</span><span class="s2">.+?</span><span class="se">\"</span><span class="s2">)"</span><span class="p">)</span>
|
|
|
|
<span class="c1"># the emote parser works in two steps:</span>
|
|
<span class="c1"># 1) convert the incoming emote into an intermediary</span>
|
|
<span class="c1"># form with all object references mapped to ids.</span>
|
|
<span class="c1"># 2) for every person seeing the emote, parse this</span>
|
|
<span class="c1"># intermediary form into the one valid for that char.</span>
|
|
|
|
|
|
<div class="viewcode-block" id="EmoteError"><a class="viewcode-back" href="../../../api/evennia.contrib.rpsystem.html#evennia.contrib.rpsystem.EmoteError">[docs]</a><span class="k">class</span> <span class="nc">EmoteError</span><span class="p">(</span><span class="ne">Exception</span><span class="p">):</span>
|
|
<span class="k">pass</span></div>
|
|
|
|
|
|
<div class="viewcode-block" id="SdescError"><a class="viewcode-back" href="../../../api/evennia.contrib.rpsystem.html#evennia.contrib.rpsystem.SdescError">[docs]</a><span class="k">class</span> <span class="nc">SdescError</span><span class="p">(</span><span class="ne">Exception</span><span class="p">):</span>
|
|
<span class="k">pass</span></div>
|
|
|
|
|
|
<div class="viewcode-block" id="RecogError"><a class="viewcode-back" href="../../../api/evennia.contrib.rpsystem.html#evennia.contrib.rpsystem.RecogError">[docs]</a><span class="k">class</span> <span class="nc">RecogError</span><span class="p">(</span><span class="ne">Exception</span><span class="p">):</span>
|
|
<span class="k">pass</span></div>
|
|
|
|
|
|
<div class="viewcode-block" id="LanguageError"><a class="viewcode-back" href="../../../api/evennia.contrib.rpsystem.html#evennia.contrib.rpsystem.LanguageError">[docs]</a><span class="k">class</span> <span class="nc">LanguageError</span><span class="p">(</span><span class="ne">Exception</span><span class="p">):</span>
|
|
<span class="k">pass</span></div>
|
|
|
|
|
|
<span class="k">def</span> <span class="nf">_dummy_process</span><span class="p">(</span><span class="n">text</span><span class="p">,</span> <span class="o">*</span><span class="n">args</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">):</span>
|
|
<span class="s2">"Pass-through processor"</span>
|
|
<span class="k">return</span> <span class="n">text</span>
|
|
|
|
|
|
<span class="c1"># emoting mechanisms</span>
|
|
|
|
|
|
<div class="viewcode-block" id="ordered_permutation_regex"><a class="viewcode-back" href="../../../api/evennia.contrib.rpsystem.html#evennia.contrib.rpsystem.ordered_permutation_regex">[docs]</a><span class="k">def</span> <span class="nf">ordered_permutation_regex</span><span class="p">(</span><span class="n">sentence</span><span class="p">):</span>
|
|
<span class="sd">"""</span>
|
|
<span class="sd"> Builds a regex that matches 'ordered permutations' of a sentence's</span>
|
|
<span class="sd"> words.</span>
|
|
|
|
<span class="sd"> Args:</span>
|
|
<span class="sd"> sentence (str): The sentence to build a match pattern to</span>
|
|
|
|
<span class="sd"> Returns:</span>
|
|
<span class="sd"> regex (re object): Compiled regex object represented the</span>
|
|
<span class="sd"> possible ordered permutations of the sentence, from longest to</span>
|
|
<span class="sd"> shortest.</span>
|
|
<span class="sd"> Example:</span>
|
|
<span class="sd"> The sdesc_regex for an sdesc of " very tall man" will</span>
|
|
<span class="sd"> result in the following allowed permutations,</span>
|
|
<span class="sd"> regex-matched in inverse order of length (case-insensitive):</span>
|
|
<span class="sd"> "the very tall man", "the very tall", "very tall man",</span>
|
|
<span class="sd"> "very tall", "the very", "tall man", "the", "very", "tall",</span>
|
|
<span class="sd"> and "man".</span>
|
|
<span class="sd"> We also add regex to make sure it also accepts num-specifiers,</span>
|
|
<span class="sd"> like /2-tall.</span>
|
|
|
|
<span class="sd"> """</span>
|
|
<span class="c1"># escape {#nnn} markers from sentence, replace with nnn</span>
|
|
<span class="n">sentence</span> <span class="o">=</span> <span class="n">_RE_REF</span><span class="o">.</span><span class="n">sub</span><span class="p">(</span><span class="sa">r</span><span class="s2">"\1"</span><span class="p">,</span> <span class="n">sentence</span><span class="p">)</span>
|
|
<span class="c1"># escape {##nnn} markers, replace with nnn</span>
|
|
<span class="n">sentence</span> <span class="o">=</span> <span class="n">_RE_REF_LANG</span><span class="o">.</span><span class="n">sub</span><span class="p">(</span><span class="sa">r</span><span class="s2">"\1"</span><span class="p">,</span> <span class="n">sentence</span><span class="p">)</span>
|
|
<span class="c1"># escape self-ref marker from sentence</span>
|
|
<span class="n">sentence</span> <span class="o">=</span> <span class="n">_RE_SELF_REF</span><span class="o">.</span><span class="n">sub</span><span class="p">(</span><span class="sa">r</span><span class="s2">""</span><span class="p">,</span> <span class="n">sentence</span><span class="p">)</span>
|
|
|
|
<span class="c1"># ordered permutation algorithm</span>
|
|
<span class="n">words</span> <span class="o">=</span> <span class="n">sentence</span><span class="o">.</span><span class="n">split</span><span class="p">()</span>
|
|
<span class="n">combinations</span> <span class="o">=</span> <span class="n">itertools</span><span class="o">.</span><span class="n">product</span><span class="p">((</span><span class="kc">True</span><span class="p">,</span> <span class="kc">False</span><span class="p">),</span> <span class="n">repeat</span><span class="o">=</span><span class="nb">len</span><span class="p">(</span><span class="n">words</span><span class="p">))</span>
|
|
<span class="n">solution</span> <span class="o">=</span> <span class="p">[]</span>
|
|
<span class="k">for</span> <span class="n">combination</span> <span class="ow">in</span> <span class="n">combinations</span><span class="p">:</span>
|
|
<span class="n">comb</span> <span class="o">=</span> <span class="p">[]</span>
|
|
<span class="k">for</span> <span class="n">iword</span><span class="p">,</span> <span class="n">word</span> <span class="ow">in</span> <span class="nb">enumerate</span><span class="p">(</span><span class="n">words</span><span class="p">):</span>
|
|
<span class="k">if</span> <span class="n">combination</span><span class="p">[</span><span class="n">iword</span><span class="p">]:</span>
|
|
<span class="n">comb</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">word</span><span class="p">)</span>
|
|
<span class="k">elif</span> <span class="n">comb</span><span class="p">:</span>
|
|
<span class="k">break</span>
|
|
<span class="k">if</span> <span class="n">comb</span><span class="p">:</span>
|
|
<span class="n">solution</span><span class="o">.</span><span class="n">append</span><span class="p">(</span>
|
|
<span class="n">_PREFIX</span>
|
|
<span class="o">+</span> <span class="sa">r</span><span class="s2">"[0-9]*</span><span class="si">%s</span><span class="s2">*</span><span class="si">%s</span><span class="s2">(?=\W|$)+"</span> <span class="o">%</span> <span class="p">(</span><span class="n">_NUM_SEP</span><span class="p">,</span> <span class="n">re_escape</span><span class="p">(</span><span class="s2">" "</span><span class="o">.</span><span class="n">join</span><span class="p">(</span><span class="n">comb</span><span class="p">))</span><span class="o">.</span><span class="n">rstrip</span><span class="p">(</span><span class="s2">"</span><span class="se">\\</span><span class="s2">"</span><span class="p">))</span>
|
|
<span class="p">)</span>
|
|
|
|
<span class="c1"># combine into a match regex, first matching the longest down to the shortest components</span>
|
|
<span class="n">regex</span> <span class="o">=</span> <span class="sa">r</span><span class="s2">"|"</span><span class="o">.</span><span class="n">join</span><span class="p">(</span><span class="nb">sorted</span><span class="p">(</span><span class="nb">set</span><span class="p">(</span><span class="n">solution</span><span class="p">),</span> <span class="n">key</span><span class="o">=</span><span class="k">lambda</span> <span class="n">item</span><span class="p">:</span> <span class="p">(</span><span class="o">-</span><span class="nb">len</span><span class="p">(</span><span class="n">item</span><span class="p">),</span> <span class="n">item</span><span class="p">)))</span>
|
|
<span class="k">return</span> <span class="n">regex</span></div>
|
|
|
|
|
|
<div class="viewcode-block" id="regex_tuple_from_key_alias"><a class="viewcode-back" href="../../../api/evennia.contrib.rpsystem.html#evennia.contrib.rpsystem.regex_tuple_from_key_alias">[docs]</a><span class="k">def</span> <span class="nf">regex_tuple_from_key_alias</span><span class="p">(</span><span class="n">obj</span><span class="p">):</span>
|
|
<span class="sd">"""</span>
|
|
<span class="sd"> This will build a regex tuple for any object, not just from those</span>
|
|
<span class="sd"> with sdesc/recog handlers. It's used as a legacy mechanism for</span>
|
|
<span class="sd"> being able to mix this contrib with objects not using sdescs, but</span>
|
|
<span class="sd"> note that creating the ordered permutation regex dynamically for</span>
|
|
<span class="sd"> every object will add computational overhead.</span>
|
|
|
|
<span class="sd"> Args:</span>
|
|
<span class="sd"> obj (Object): This object's key and eventual aliases will</span>
|
|
<span class="sd"> be used to build the tuple.</span>
|
|
|
|
<span class="sd"> Returns:</span>
|
|
<span class="sd"> regex_tuple (tuple): A tuple</span>
|
|
<span class="sd"> (ordered_permutation_regex, obj, key/alias)</span>
|
|
|
|
<span class="sd"> """</span>
|
|
<span class="k">return</span> <span class="p">(</span>
|
|
<span class="n">re</span><span class="o">.</span><span class="n">compile</span><span class="p">(</span><span class="n">ordered_permutation_regex</span><span class="p">(</span><span class="s2">" "</span><span class="o">.</span><span class="n">join</span><span class="p">([</span><span class="n">obj</span><span class="o">.</span><span class="n">key</span><span class="p">]</span> <span class="o">+</span> <span class="n">obj</span><span class="o">.</span><span class="n">aliases</span><span class="o">.</span><span class="n">all</span><span class="p">())),</span> <span class="n">_RE_FLAGS</span><span class="p">),</span>
|
|
<span class="n">obj</span><span class="p">,</span>
|
|
<span class="n">obj</span><span class="o">.</span><span class="n">key</span><span class="p">,</span>
|
|
<span class="p">)</span></div>
|
|
|
|
|
|
<div class="viewcode-block" id="parse_language"><a class="viewcode-back" href="../../../api/evennia.contrib.rpsystem.html#evennia.contrib.rpsystem.parse_language">[docs]</a><span class="k">def</span> <span class="nf">parse_language</span><span class="p">(</span><span class="n">speaker</span><span class="p">,</span> <span class="n">emote</span><span class="p">):</span>
|
|
<span class="sd">"""</span>
|
|
<span class="sd"> Parse the emote for language. This is</span>
|
|
<span class="sd"> used with a plugin for handling languages.</span>
|
|
|
|
<span class="sd"> Args:</span>
|
|
<span class="sd"> speaker (Object): The object speaking.</span>
|
|
<span class="sd"> emote (str): An emote possibly containing</span>
|
|
<span class="sd"> language references.</span>
|
|
|
|
<span class="sd"> Returns:</span>
|
|
<span class="sd"> (emote, mapping) (tuple): A tuple where the</span>
|
|
<span class="sd"> `emote` is the emote string with all says</span>
|
|
<span class="sd"> (including quotes) replaced with reference</span>
|
|
<span class="sd"> markers on the form {##n} where n is a running</span>
|
|
<span class="sd"> number. The `mapping` is a dictionary between</span>
|
|
<span class="sd"> the markers and a tuple (langname, saytext), where</span>
|
|
<span class="sd"> langname can be None.</span>
|
|
<span class="sd"> Raises:</span>
|
|
<span class="sd"> evennia.contrib.rpsystem.LanguageError: If an invalid language was</span>
|
|
<span class="sd"> specified.</span>
|
|
|
|
<span class="sd"> Notes:</span>
|
|
<span class="sd"> Note that no errors are raised if the wrong language identifier</span>
|
|
<span class="sd"> is given.</span>
|
|
<span class="sd"> This data, together with the identity of the speaker, is</span>
|
|
<span class="sd"> intended to be used by the "listener" later, since with this</span>
|
|
<span class="sd"> information the language skill of the speaker can be offset to</span>
|
|
<span class="sd"> the language skill of the listener to determine how much</span>
|
|
<span class="sd"> information is actually conveyed.</span>
|
|
|
|
<span class="sd"> """</span>
|
|
<span class="c1"># escape mapping syntax on the form {##id} if it exists already in emote,</span>
|
|
<span class="c1"># if so it is replaced with just "id".</span>
|
|
<span class="n">emote</span> <span class="o">=</span> <span class="n">_RE_REF_LANG</span><span class="o">.</span><span class="n">sub</span><span class="p">(</span><span class="sa">r</span><span class="s2">"\1"</span><span class="p">,</span> <span class="n">emote</span><span class="p">)</span>
|
|
|
|
<span class="n">errors</span> <span class="o">=</span> <span class="p">[]</span>
|
|
<span class="n">mapping</span> <span class="o">=</span> <span class="p">{}</span>
|
|
<span class="k">for</span> <span class="n">imatch</span><span class="p">,</span> <span class="n">say_match</span> <span class="ow">in</span> <span class="nb">enumerate</span><span class="p">(</span><span class="nb">reversed</span><span class="p">(</span><span class="nb">list</span><span class="p">(</span><span class="n">_RE_LANGUAGE</span><span class="o">.</span><span class="n">finditer</span><span class="p">(</span><span class="n">emote</span><span class="p">)))):</span>
|
|
<span class="c1"># process matches backwards to be able to replace</span>
|
|
<span class="c1"># in-place without messing up indexes for future matches</span>
|
|
<span class="c1"># note that saytext includes surrounding "...".</span>
|
|
<span class="n">langname</span><span class="p">,</span> <span class="n">saytext</span> <span class="o">=</span> <span class="n">say_match</span><span class="o">.</span><span class="n">groups</span><span class="p">()</span>
|
|
<span class="n">istart</span><span class="p">,</span> <span class="n">iend</span> <span class="o">=</span> <span class="n">say_match</span><span class="o">.</span><span class="n">start</span><span class="p">(),</span> <span class="n">say_match</span><span class="o">.</span><span class="n">end</span><span class="p">()</span>
|
|
<span class="c1"># the key is simply the running match in the emote</span>
|
|
<span class="n">key</span> <span class="o">=</span> <span class="s2">"##</span><span class="si">%i</span><span class="s2">"</span> <span class="o">%</span> <span class="n">imatch</span>
|
|
<span class="c1"># replace say with ref markers in emote</span>
|
|
<span class="n">emote</span> <span class="o">=</span> <span class="n">emote</span><span class="p">[:</span><span class="n">istart</span><span class="p">]</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">key</span> <span class="o">+</span> <span class="n">emote</span><span class="p">[</span><span class="n">iend</span><span class="p">:]</span>
|
|
<span class="n">mapping</span><span class="p">[</span><span class="n">key</span><span class="p">]</span> <span class="o">=</span> <span class="p">(</span><span class="n">langname</span><span class="p">,</span> <span class="n">saytext</span><span class="p">)</span>
|
|
|
|
<span class="k">if</span> <span class="n">errors</span><span class="p">:</span>
|
|
<span class="c1"># catch errors and report</span>
|
|
<span class="k">raise</span> <span class="n">LanguageError</span><span class="p">(</span><span class="s2">"</span><span class="se">\n</span><span class="s2">"</span><span class="o">.</span><span class="n">join</span><span class="p">(</span><span class="n">errors</span><span class="p">))</span>
|
|
|
|
<span class="c1"># at this point all says have been replaced with {##nn} markers</span>
|
|
<span class="c1"># and mapping maps 1:1 to this.</span>
|
|
<span class="k">return</span> <span class="n">emote</span><span class="p">,</span> <span class="n">mapping</span></div>
|
|
|
|
|
|
<div class="viewcode-block" id="parse_sdescs_and_recogs"><a class="viewcode-back" href="../../../api/evennia.contrib.rpsystem.html#evennia.contrib.rpsystem.parse_sdescs_and_recogs">[docs]</a><span class="k">def</span> <span class="nf">parse_sdescs_and_recogs</span><span class="p">(</span><span class="n">sender</span><span class="p">,</span> <span class="n">candidates</span><span class="p">,</span> <span class="n">string</span><span class="p">,</span> <span class="n">search_mode</span><span class="o">=</span><span class="kc">False</span><span class="p">):</span>
|
|
<span class="sd">"""</span>
|
|
<span class="sd"> Read a raw emote and parse it into an intermediary</span>
|
|
<span class="sd"> format for distributing to all observers.</span>
|
|
|
|
<span class="sd"> Args:</span>
|
|
<span class="sd"> sender (Object): The object sending the emote. This object's</span>
|
|
<span class="sd"> recog data will be considered in the parsing.</span>
|
|
<span class="sd"> candidates (iterable): A list of objects valid for referencing</span>
|
|
<span class="sd"> in the emote.</span>
|
|
<span class="sd"> string (str): The string (like an emote) we want to analyze for keywords.</span>
|
|
<span class="sd"> search_mode (bool, optional): If `True`, the "emote" is a query string</span>
|
|
<span class="sd"> we want to analyze. If so, the return value is changed.</span>
|
|
|
|
<span class="sd"> Returns:</span>
|
|
<span class="sd"> (emote, mapping) (tuple): If `search_mode` is `False`</span>
|
|
<span class="sd"> (default), a tuple where the emote is the emote string, with</span>
|
|
<span class="sd"> all references replaced with internal-representation {#dbref}</span>
|
|
<span class="sd"> markers and mapping is a dictionary `{"#dbref":obj, ...}`.</span>
|
|
<span class="sd"> result (list): If `search_mode` is `True` we are</span>
|
|
<span class="sd"> performing a search query on `string`, looking for a specific</span>
|
|
<span class="sd"> object. A list with zero, one or more matches.</span>
|
|
|
|
<span class="sd"> Raises:</span>
|
|
<span class="sd"> EmoteException: For various ref-matching errors.</span>
|
|
|
|
<span class="sd"> Notes:</span>
|
|
<span class="sd"> The parser analyzes and should understand the following</span>
|
|
<span class="sd"> _PREFIX-tagged structures in the emote:</span>
|
|
<span class="sd"> - self-reference (/me)</span>
|
|
<span class="sd"> - recogs (any part of it) stored on emoter, matching obj in `candidates`.</span>
|
|
<span class="sd"> - sdesc (any part of it) from any obj in `candidates`.</span>
|
|
<span class="sd"> - N-sdesc, N-recog separating multi-matches (1-tall, 2-tall)</span>
|
|
<span class="sd"> - says, "..." are</span>
|
|
|
|
<span class="sd"> """</span>
|
|
<span class="c1"># Load all candidate regex tuples [(regex, obj, sdesc/recog),...]</span>
|
|
<span class="n">candidate_regexes</span> <span class="o">=</span> <span class="p">(</span>
|
|
<span class="p">([(</span><span class="n">_RE_SELF_REF</span><span class="p">,</span> <span class="n">sender</span><span class="p">,</span> <span class="n">sender</span><span class="o">.</span><span class="n">sdesc</span><span class="o">.</span><span class="n">get</span><span class="p">())]</span> <span class="k">if</span> <span class="nb">hasattr</span><span class="p">(</span><span class="n">sender</span><span class="p">,</span> <span class="s2">"sdesc"</span><span class="p">)</span> <span class="k">else</span> <span class="p">[])</span>
|
|
<span class="o">+</span> <span class="p">(</span>
|
|
<span class="p">[</span><span class="n">sender</span><span class="o">.</span><span class="n">recog</span><span class="o">.</span><span class="n">get_regex_tuple</span><span class="p">(</span><span class="n">obj</span><span class="p">)</span> <span class="k">for</span> <span class="n">obj</span> <span class="ow">in</span> <span class="n">candidates</span><span class="p">]</span>
|
|
<span class="k">if</span> <span class="nb">hasattr</span><span class="p">(</span><span class="n">sender</span><span class="p">,</span> <span class="s2">"recog"</span><span class="p">)</span>
|
|
<span class="k">else</span> <span class="p">[]</span>
|
|
<span class="p">)</span>
|
|
<span class="o">+</span> <span class="p">[</span><span class="n">obj</span><span class="o">.</span><span class="n">sdesc</span><span class="o">.</span><span class="n">get_regex_tuple</span><span class="p">()</span> <span class="k">for</span> <span class="n">obj</span> <span class="ow">in</span> <span class="n">candidates</span> <span class="k">if</span> <span class="nb">hasattr</span><span class="p">(</span><span class="n">obj</span><span class="p">,</span> <span class="s2">"sdesc"</span><span class="p">)]</span>
|
|
<span class="o">+</span> <span class="p">[</span>
|
|
<span class="n">regex_tuple_from_key_alias</span><span class="p">(</span><span class="n">obj</span><span class="p">)</span> <span class="c1"># handle objects without sdescs</span>
|
|
<span class="k">for</span> <span class="n">obj</span> <span class="ow">in</span> <span class="n">candidates</span>
|
|
<span class="k">if</span> <span class="ow">not</span> <span class="p">(</span><span class="nb">hasattr</span><span class="p">(</span><span class="n">obj</span><span class="p">,</span> <span class="s2">"recog"</span><span class="p">)</span> <span class="ow">and</span> <span class="nb">hasattr</span><span class="p">(</span><span class="n">obj</span><span class="p">,</span> <span class="s2">"sdesc"</span><span class="p">))</span>
|
|
<span class="p">]</span>
|
|
<span class="p">)</span>
|
|
|
|
<span class="c1"># filter out non-found data</span>
|
|
<span class="n">candidate_regexes</span> <span class="o">=</span> <span class="p">[</span><span class="n">tup</span> <span class="k">for</span> <span class="n">tup</span> <span class="ow">in</span> <span class="n">candidate_regexes</span> <span class="k">if</span> <span class="n">tup</span><span class="p">]</span>
|
|
|
|
<span class="c1"># escape mapping syntax on the form {#id} if it exists already in emote,</span>
|
|
<span class="c1"># if so it is replaced with just "id".</span>
|
|
<span class="n">string</span> <span class="o">=</span> <span class="n">_RE_REF</span><span class="o">.</span><span class="n">sub</span><span class="p">(</span><span class="sa">r</span><span class="s2">"\1"</span><span class="p">,</span> <span class="n">string</span><span class="p">)</span>
|
|
<span class="c1"># escape loose { } brackets since this will clash with formatting</span>
|
|
<span class="n">string</span> <span class="o">=</span> <span class="n">_RE_LEFT_BRACKETS</span><span class="o">.</span><span class="n">sub</span><span class="p">(</span><span class="s2">"{{"</span><span class="p">,</span> <span class="n">string</span><span class="p">)</span>
|
|
<span class="n">string</span> <span class="o">=</span> <span class="n">_RE_RIGHT_BRACKETS</span><span class="o">.</span><span class="n">sub</span><span class="p">(</span><span class="s2">"}}"</span><span class="p">,</span> <span class="n">string</span><span class="p">)</span>
|
|
|
|
<span class="c1"># we now loop over all references and analyze them</span>
|
|
<span class="n">mapping</span> <span class="o">=</span> <span class="p">{}</span>
|
|
<span class="n">errors</span> <span class="o">=</span> <span class="p">[]</span>
|
|
<span class="n">obj</span> <span class="o">=</span> <span class="kc">None</span>
|
|
<span class="n">nmatches</span> <span class="o">=</span> <span class="mi">0</span>
|
|
<span class="k">for</span> <span class="n">marker_match</span> <span class="ow">in</span> <span class="nb">reversed</span><span class="p">(</span><span class="nb">list</span><span class="p">(</span><span class="n">_RE_OBJ_REF_START</span><span class="o">.</span><span class="n">finditer</span><span class="p">(</span><span class="n">string</span><span class="p">))):</span>
|
|
<span class="c1"># we scan backwards so we can replace in-situ without messing</span>
|
|
<span class="c1"># up later occurrences. Given a marker match, query from</span>
|
|
<span class="c1"># start index forward for all candidates.</span>
|
|
|
|
<span class="c1"># first see if there is a number given (e.g. 1-tall)</span>
|
|
<span class="n">num_identifier</span><span class="p">,</span> <span class="n">_</span> <span class="o">=</span> <span class="n">marker_match</span><span class="o">.</span><span class="n">groups</span><span class="p">(</span><span class="s2">""</span><span class="p">)</span> <span class="c1"># return "" if no match, rather than None</span>
|
|
<span class="n">istart0</span> <span class="o">=</span> <span class="n">marker_match</span><span class="o">.</span><span class="n">start</span><span class="p">()</span>
|
|
<span class="n">istart</span> <span class="o">=</span> <span class="n">istart0</span>
|
|
|
|
<span class="c1"># loop over all candidate regexes and match against the string following the match</span>
|
|
<span class="n">matches</span> <span class="o">=</span> <span class="p">((</span><span class="n">reg</span><span class="o">.</span><span class="n">match</span><span class="p">(</span><span class="n">string</span><span class="p">[</span><span class="n">istart</span><span class="p">:]),</span> <span class="n">obj</span><span class="p">,</span> <span class="n">text</span><span class="p">)</span> <span class="k">for</span> <span class="n">reg</span><span class="p">,</span> <span class="n">obj</span><span class="p">,</span> <span class="n">text</span> <span class="ow">in</span> <span class="n">candidate_regexes</span><span class="p">)</span>
|
|
|
|
<span class="c1"># score matches by how long part of the string was matched</span>
|
|
<span class="n">matches</span> <span class="o">=</span> <span class="p">[(</span><span class="n">match</span><span class="o">.</span><span class="n">end</span><span class="p">()</span> <span class="k">if</span> <span class="n">match</span> <span class="k">else</span> <span class="o">-</span><span class="mi">1</span><span class="p">,</span> <span class="n">obj</span><span class="p">,</span> <span class="n">text</span><span class="p">)</span> <span class="k">for</span> <span class="n">match</span><span class="p">,</span> <span class="n">obj</span><span class="p">,</span> <span class="n">text</span> <span class="ow">in</span> <span class="n">matches</span><span class="p">]</span>
|
|
<span class="n">maxscore</span> <span class="o">=</span> <span class="nb">max</span><span class="p">(</span><span class="n">score</span> <span class="k">for</span> <span class="n">score</span><span class="p">,</span> <span class="n">obj</span><span class="p">,</span> <span class="n">text</span> <span class="ow">in</span> <span class="n">matches</span><span class="p">)</span>
|
|
|
|
<span class="c1"># we have a valid maxscore, extract all matches with this value</span>
|
|
<span class="n">bestmatches</span> <span class="o">=</span> <span class="p">[(</span><span class="n">obj</span><span class="p">,</span> <span class="n">text</span><span class="p">)</span> <span class="k">for</span> <span class="n">score</span><span class="p">,</span> <span class="n">obj</span><span class="p">,</span> <span class="n">text</span> <span class="ow">in</span> <span class="n">matches</span> <span class="k">if</span> <span class="n">maxscore</span> <span class="o">==</span> <span class="n">score</span> <span class="o">!=</span> <span class="o">-</span><span class="mi">1</span><span class="p">]</span>
|
|
<span class="n">nmatches</span> <span class="o">=</span> <span class="nb">len</span><span class="p">(</span><span class="n">bestmatches</span><span class="p">)</span>
|
|
|
|
<span class="k">if</span> <span class="ow">not</span> <span class="n">nmatches</span><span class="p">:</span>
|
|
<span class="c1"># no matches</span>
|
|
<span class="n">obj</span> <span class="o">=</span> <span class="kc">None</span>
|
|
<span class="n">nmatches</span> <span class="o">=</span> <span class="mi">0</span>
|
|
<span class="k">elif</span> <span class="n">nmatches</span> <span class="o">==</span> <span class="mi">1</span><span class="p">:</span>
|
|
<span class="c1"># an exact match.</span>
|
|
<span class="n">obj</span> <span class="o">=</span> <span class="n">bestmatches</span><span class="p">[</span><span class="mi">0</span><span class="p">][</span><span class="mi">0</span><span class="p">]</span>
|
|
<span class="n">nmatches</span> <span class="o">=</span> <span class="mi">1</span>
|
|
<span class="k">elif</span> <span class="nb">all</span><span class="p">(</span><span class="n">bestmatches</span><span class="p">[</span><span class="mi">0</span><span class="p">][</span><span class="mi">0</span><span class="p">]</span><span class="o">.</span><span class="n">id</span> <span class="o">==</span> <span class="n">obj</span><span class="o">.</span><span class="n">id</span> <span class="k">for</span> <span class="n">obj</span><span class="p">,</span> <span class="n">text</span> <span class="ow">in</span> <span class="n">bestmatches</span><span class="p">):</span>
|
|
<span class="c1"># multi-match but all matches actually reference the same</span>
|
|
<span class="c1"># obj (could happen with clashing recogs + sdescs)</span>
|
|
<span class="n">obj</span> <span class="o">=</span> <span class="n">bestmatches</span><span class="p">[</span><span class="mi">0</span><span class="p">][</span><span class="mi">0</span><span class="p">]</span>
|
|
<span class="n">nmatches</span> <span class="o">=</span> <span class="mi">1</span>
|
|
<span class="k">else</span><span class="p">:</span>
|
|
<span class="c1"># multi-match.</span>
|
|
<span class="c1"># was a numerical identifier given to help us separate the multi-match?</span>
|
|
<span class="n">inum</span> <span class="o">=</span> <span class="nb">min</span><span class="p">(</span><span class="nb">max</span><span class="p">(</span><span class="mi">0</span><span class="p">,</span> <span class="nb">int</span><span class="p">(</span><span class="n">num_identifier</span><span class="p">)</span> <span class="o">-</span> <span class="mi">1</span><span class="p">),</span> <span class="n">nmatches</span> <span class="o">-</span> <span class="mi">1</span><span class="p">)</span> <span class="k">if</span> <span class="n">num_identifier</span> <span class="k">else</span> <span class="kc">None</span>
|
|
<span class="k">if</span> <span class="n">inum</span> <span class="ow">is</span> <span class="ow">not</span> <span class="kc">None</span><span class="p">:</span>
|
|
<span class="c1"># A valid inum is given. Use this to separate data.</span>
|
|
<span class="n">obj</span> <span class="o">=</span> <span class="n">bestmatches</span><span class="p">[</span><span class="n">inum</span><span class="p">][</span><span class="mi">0</span><span class="p">]</span>
|
|
<span class="n">nmatches</span> <span class="o">=</span> <span class="mi">1</span>
|
|
<span class="k">else</span><span class="p">:</span>
|
|
<span class="c1"># no identifier given - a real multimatch.</span>
|
|
<span class="n">obj</span> <span class="o">=</span> <span class="n">bestmatches</span>
|
|
|
|
<span class="k">if</span> <span class="n">search_mode</span><span class="p">:</span>
|
|
<span class="c1"># single-object search mode. Don't continue loop.</span>
|
|
<span class="k">break</span>
|
|
<span class="k">elif</span> <span class="n">nmatches</span> <span class="o">==</span> <span class="mi">0</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">_EMOTE_NOMATCH_ERROR</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">ref</span><span class="o">=</span><span class="n">marker_match</span><span class="o">.</span><span class="n">group</span><span class="p">()))</span>
|
|
<span class="k">elif</span> <span class="n">nmatches</span> <span class="o">==</span> <span class="mi">1</span><span class="p">:</span>
|
|
<span class="n">key</span> <span class="o">=</span> <span class="s2">"#</span><span class="si">%i</span><span class="s2">"</span> <span class="o">%</span> <span class="n">obj</span><span class="o">.</span><span class="n">id</span>
|
|
<span class="n">string</span> <span class="o">=</span> <span class="n">string</span><span class="p">[:</span><span class="n">istart0</span><span class="p">]</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">key</span> <span class="o">+</span> <span class="n">string</span><span class="p">[</span><span class="n">istart</span> <span class="o">+</span> <span class="n">maxscore</span> <span class="p">:]</span>
|
|
<span class="n">mapping</span><span class="p">[</span><span class="n">key</span><span class="p">]</span> <span class="o">=</span> <span class="n">obj</span>
|
|
<span class="k">else</span><span class="p">:</span>
|
|
<span class="n">refname</span> <span class="o">=</span> <span class="n">marker_match</span><span class="o">.</span><span class="n">group</span><span class="p">()</span>
|
|
<span class="n">reflist</span> <span class="o">=</span> <span class="p">[</span>
|
|
<span class="s2">"</span><span class="si">%s%s%s</span><span class="s2"> (</span><span class="si">%s%s</span><span class="s2">)"</span>
|
|
<span class="o">%</span> <span class="p">(</span>
|
|
<span class="n">inum</span> <span class="o">+</span> <span class="mi">1</span><span class="p">,</span>
|
|
<span class="n">_NUM_SEP</span><span class="p">,</span>
|
|
<span class="n">_RE_PREFIX</span><span class="o">.</span><span class="n">sub</span><span class="p">(</span><span class="s2">""</span><span class="p">,</span> <span class="n">refname</span><span class="p">),</span>
|
|
<span class="n">text</span><span class="p">,</span>
|
|
<span class="s2">" (</span><span class="si">%s</span><span class="s2">)"</span> <span class="o">%</span> <span class="n">sender</span><span class="o">.</span><span class="n">key</span> <span class="k">if</span> <span class="n">sender</span> <span class="o">==</span> <span class="n">ob</span> <span class="k">else</span> <span class="s2">""</span><span class="p">,</span>
|
|
<span class="p">)</span>
|
|
<span class="k">for</span> <span class="n">inum</span><span class="p">,</span> <span class="p">(</span><span class="n">ob</span><span class="p">,</span> <span class="n">text</span><span class="p">)</span> <span class="ow">in</span> <span class="nb">enumerate</span><span class="p">(</span><span class="n">obj</span><span class="p">)</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">_EMOTE_MULTIMATCH_ERROR</span><span class="o">.</span><span class="n">format</span><span class="p">(</span>
|
|
<span class="n">ref</span><span class="o">=</span><span class="n">marker_match</span><span class="o">.</span><span class="n">group</span><span class="p">(),</span> <span class="n">reflist</span><span class="o">=</span><span class="s2">"</span><span class="se">\n</span><span class="s2"> "</span><span class="o">.</span><span class="n">join</span><span class="p">(</span><span class="n">reflist</span><span class="p">)</span>
|
|
<span class="p">)</span>
|
|
<span class="p">)</span>
|
|
<span class="k">if</span> <span class="n">search_mode</span><span class="p">:</span>
|
|
<span class="c1"># return list of object(s) matching</span>
|
|
<span class="k">if</span> <span class="n">nmatches</span> <span class="o">==</span> <span class="mi">0</span><span class="p">:</span>
|
|
<span class="k">return</span> <span class="p">[]</span>
|
|
<span class="k">elif</span> <span class="n">nmatches</span> <span class="o">==</span> <span class="mi">1</span><span class="p">:</span>
|
|
<span class="k">return</span> <span class="p">[</span><span class="n">obj</span><span class="p">]</span>
|
|
<span class="k">else</span><span class="p">:</span>
|
|
<span class="k">return</span> <span class="p">[</span><span class="n">tup</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span> <span class="k">for</span> <span class="n">tup</span> <span class="ow">in</span> <span class="n">obj</span><span class="p">]</span>
|
|
|
|
<span class="k">if</span> <span class="n">errors</span><span class="p">:</span>
|
|
<span class="c1"># make sure to not let errors through.</span>
|
|
<span class="k">raise</span> <span class="n">EmoteError</span><span class="p">(</span><span class="s2">"</span><span class="se">\n</span><span class="s2">"</span><span class="o">.</span><span class="n">join</span><span class="p">(</span><span class="n">errors</span><span class="p">))</span>
|
|
|
|
<span class="c1"># at this point all references have been replaced with {#xxx} markers and the mapping contains</span>
|
|
<span class="c1"># a 1:1 mapping between those inline markers and objects.</span>
|
|
<span class="k">return</span> <span class="n">string</span><span class="p">,</span> <span class="n">mapping</span></div>
|
|
|
|
|
|
<div class="viewcode-block" id="send_emote"><a class="viewcode-back" href="../../../api/evennia.contrib.rpsystem.html#evennia.contrib.rpsystem.send_emote">[docs]</a><span class="k">def</span> <span class="nf">send_emote</span><span class="p">(</span><span class="n">sender</span><span class="p">,</span> <span class="n">receivers</span><span class="p">,</span> <span class="n">emote</span><span class="p">,</span> <span class="n">anonymous_add</span><span class="o">=</span><span class="s2">"first"</span><span class="p">):</span>
|
|
<span class="sd">"""</span>
|
|
<span class="sd"> Main access function for distribute an emote.</span>
|
|
|
|
<span class="sd"> Args:</span>
|
|
<span class="sd"> sender (Object): The one sending the emote.</span>
|
|
<span class="sd"> receivers (iterable): Receivers of the emote. These</span>
|
|
<span class="sd"> will also form the basis for which sdescs are</span>
|
|
<span class="sd"> 'valid' to use in the emote.</span>
|
|
<span class="sd"> emote (str): The raw emote string as input by emoter.</span>
|
|
<span class="sd"> anonymous_add (str or None, optional): If `sender` is not</span>
|
|
<span class="sd"> self-referencing in the emote, this will auto-add</span>
|
|
<span class="sd"> `sender`'s data to the emote. Possible values are</span>
|
|
<span class="sd"> - None: No auto-add at anonymous emote</span>
|
|
<span class="sd"> - 'last': Add sender to the end of emote as [sender]</span>
|
|
<span class="sd"> - 'first': Prepend sender to start of emote.</span>
|
|
|
|
<span class="sd"> """</span>
|
|
<span class="k">try</span><span class="p">:</span>
|
|
<span class="n">emote</span><span class="p">,</span> <span class="n">obj_mapping</span> <span class="o">=</span> <span class="n">parse_sdescs_and_recogs</span><span class="p">(</span><span class="n">sender</span><span class="p">,</span> <span class="n">receivers</span><span class="p">,</span> <span class="n">emote</span><span class="p">)</span>
|
|
<span class="n">emote</span><span class="p">,</span> <span class="n">language_mapping</span> <span class="o">=</span> <span class="n">parse_language</span><span class="p">(</span><span class="n">sender</span><span class="p">,</span> <span class="n">emote</span><span class="p">)</span>
|
|
<span class="k">except</span> <span class="p">(</span><span class="n">EmoteError</span><span class="p">,</span> <span class="n">LanguageError</span><span class="p">)</span> <span class="k">as</span> <span class="n">err</span><span class="p">:</span>
|
|
<span class="c1"># handle all error messages, don't hide actual coding errors</span>
|
|
<span class="n">sender</span><span class="o">.</span><span class="n">msg</span><span class="p">(</span><span class="nb">str</span><span class="p">(</span><span class="n">err</span><span class="p">))</span>
|
|
<span class="k">return</span>
|
|
<span class="c1"># we escape the object mappings since we'll do the language ones first</span>
|
|
<span class="c1"># (the text could have nested object mappings).</span>
|
|
<span class="n">emote</span> <span class="o">=</span> <span class="n">_RE_REF</span><span class="o">.</span><span class="n">sub</span><span class="p">(</span><span class="sa">r</span><span class="s2">"{{#\1}}"</span><span class="p">,</span> <span class="n">emote</span><span class="p">)</span>
|
|
|
|
<span class="k">if</span> <span class="n">anonymous_add</span> <span class="ow">and</span> <span class="ow">not</span> <span class="s2">"#</span><span class="si">%i</span><span class="s2">"</span> <span class="o">%</span> <span class="n">sender</span><span class="o">.</span><span class="n">id</span> <span class="ow">in</span> <span class="n">obj_mapping</span><span class="p">:</span>
|
|
<span class="c1"># no self-reference in the emote - add to the end</span>
|
|
<span class="n">key</span> <span class="o">=</span> <span class="s2">"#</span><span class="si">%i</span><span class="s2">"</span> <span class="o">%</span> <span class="n">sender</span><span class="o">.</span><span class="n">id</span>
|
|
<span class="n">obj_mapping</span><span class="p">[</span><span class="n">key</span><span class="p">]</span> <span class="o">=</span> <span class="n">sender</span>
|
|
<span class="k">if</span> <span class="n">anonymous_add</span> <span class="o">==</span> <span class="s2">"first"</span><span class="p">:</span>
|
|
<span class="n">possessive</span> <span class="o">=</span> <span class="s2">""</span> <span class="k">if</span> <span class="n">emote</span><span class="o">.</span><span class="n">startswith</span><span class="p">(</span><span class="s2">"'"</span><span class="p">)</span> <span class="k">else</span> <span class="s2">" "</span>
|
|
<span class="n">emote</span> <span class="o">=</span> <span class="s2">"</span><span class="si">%s%s%s</span><span class="s2">"</span> <span class="o">%</span> <span class="p">(</span><span class="s2">"{{</span><span class="si">%s</span><span class="s2">}}"</span> <span class="o">%</span> <span class="n">key</span><span class="p">,</span> <span class="n">possessive</span><span class="p">,</span> <span class="n">emote</span><span class="p">)</span>
|
|
<span class="k">else</span><span class="p">:</span>
|
|
<span class="n">emote</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">emote</span><span class="p">,</span> <span class="s2">"{{</span><span class="si">%s</span><span class="s2">}}"</span> <span class="o">%</span> <span class="n">key</span><span class="p">)</span>
|
|
|
|
<span class="c1"># broadcast emote to everyone</span>
|
|
<span class="k">for</span> <span class="n">receiver</span> <span class="ow">in</span> <span class="n">receivers</span><span class="p">:</span>
|
|
<span class="c1"># first handle the language mapping, which always produce different keys ##nn</span>
|
|
<span class="n">receiver_lang_mapping</span> <span class="o">=</span> <span class="p">{}</span>
|
|
<span class="k">try</span><span class="p">:</span>
|
|
<span class="n">process_language</span> <span class="o">=</span> <span class="n">receiver</span><span class="o">.</span><span class="n">process_language</span>
|
|
<span class="k">except</span> <span class="ne">AttributeError</span><span class="p">:</span>
|
|
<span class="n">process_language</span> <span class="o">=</span> <span class="n">_dummy_process</span>
|
|
<span class="k">for</span> <span class="n">key</span><span class="p">,</span> <span class="p">(</span><span class="n">langname</span><span class="p">,</span> <span class="n">saytext</span><span class="p">)</span> <span class="ow">in</span> <span class="n">language_mapping</span><span class="o">.</span><span class="n">items</span><span class="p">():</span>
|
|
<span class="c1"># color says</span>
|
|
<span class="n">receiver_lang_mapping</span><span class="p">[</span><span class="n">key</span><span class="p">]</span> <span class="o">=</span> <span class="n">process_language</span><span class="p">(</span><span class="n">saytext</span><span class="p">,</span> <span class="n">sender</span><span class="p">,</span> <span class="n">langname</span><span class="p">)</span>
|
|
<span class="c1"># map the language {##num} markers. This will convert the escaped sdesc markers on</span>
|
|
<span class="c1"># the form {{#num}} to {#num} markers ready to sdescmat in the next step.</span>
|
|
<span class="n">sendemote</span> <span class="o">=</span> <span class="n">emote</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="o">**</span><span class="n">receiver_lang_mapping</span><span class="p">)</span>
|
|
|
|
<span class="c1"># handle sdesc mappings. we make a temporary copy that we can modify</span>
|
|
<span class="k">try</span><span class="p">:</span>
|
|
<span class="n">process_sdesc</span> <span class="o">=</span> <span class="n">receiver</span><span class="o">.</span><span class="n">process_sdesc</span>
|
|
<span class="k">except</span> <span class="ne">AttributeError</span><span class="p">:</span>
|
|
<span class="n">process_sdesc</span> <span class="o">=</span> <span class="n">_dummy_process</span>
|
|
|
|
<span class="k">try</span><span class="p">:</span>
|
|
<span class="n">process_recog</span> <span class="o">=</span> <span class="n">receiver</span><span class="o">.</span><span class="n">process_recog</span>
|
|
<span class="k">except</span> <span class="ne">AttributeError</span><span class="p">:</span>
|
|
<span class="n">process_recog</span> <span class="o">=</span> <span class="n">_dummy_process</span>
|
|
|
|
<span class="k">try</span><span class="p">:</span>
|
|
<span class="n">recog_get</span> <span class="o">=</span> <span class="n">receiver</span><span class="o">.</span><span class="n">recog</span><span class="o">.</span><span class="n">get</span>
|
|
<span class="n">receiver_sdesc_mapping</span> <span class="o">=</span> <span class="nb">dict</span><span class="p">(</span>
|
|
<span class="p">(</span><span class="n">ref</span><span class="p">,</span> <span class="n">process_recog</span><span class="p">(</span><span class="n">recog_get</span><span class="p">(</span><span class="n">obj</span><span class="p">),</span> <span class="n">obj</span><span class="p">))</span> <span class="k">for</span> <span class="n">ref</span><span class="p">,</span> <span class="n">obj</span> <span class="ow">in</span> <span class="n">obj_mapping</span><span class="o">.</span><span class="n">items</span><span class="p">()</span>
|
|
<span class="p">)</span>
|
|
<span class="k">except</span> <span class="ne">AttributeError</span><span class="p">:</span>
|
|
<span class="n">receiver_sdesc_mapping</span> <span class="o">=</span> <span class="nb">dict</span><span class="p">(</span>
|
|
<span class="p">(</span>
|
|
<span class="n">ref</span><span class="p">,</span>
|
|
<span class="n">process_sdesc</span><span class="p">(</span><span class="n">obj</span><span class="o">.</span><span class="n">sdesc</span><span class="o">.</span><span class="n">get</span><span class="p">(),</span> <span class="n">obj</span><span class="p">)</span>
|
|
<span class="k">if</span> <span class="nb">hasattr</span><span class="p">(</span><span class="n">obj</span><span class="p">,</span> <span class="s2">"sdesc"</span><span class="p">)</span>
|
|
<span class="k">else</span> <span class="n">process_sdesc</span><span class="p">(</span><span class="n">obj</span><span class="o">.</span><span class="n">key</span><span class="p">,</span> <span class="n">obj</span><span class="p">),</span>
|
|
<span class="p">)</span>
|
|
<span class="k">for</span> <span class="n">ref</span><span class="p">,</span> <span class="n">obj</span> <span class="ow">in</span> <span class="n">obj_mapping</span><span class="o">.</span><span class="n">items</span><span class="p">()</span>
|
|
<span class="p">)</span>
|
|
<span class="c1"># make sure receiver always sees their real name</span>
|
|
<span class="n">rkey</span> <span class="o">=</span> <span class="s2">"#</span><span class="si">%i</span><span class="s2">"</span> <span class="o">%</span> <span class="n">receiver</span><span class="o">.</span><span class="n">id</span>
|
|
<span class="k">if</span> <span class="n">rkey</span> <span class="ow">in</span> <span class="n">receiver_sdesc_mapping</span><span class="p">:</span>
|
|
<span class="n">receiver_sdesc_mapping</span><span class="p">[</span><span class="n">rkey</span><span class="p">]</span> <span class="o">=</span> <span class="n">process_sdesc</span><span class="p">(</span><span class="n">receiver</span><span class="o">.</span><span class="n">key</span><span class="p">,</span> <span class="n">receiver</span><span class="p">)</span>
|
|
|
|
<span class="c1"># do the template replacement of the sdesc/recog {#num} markers</span>
|
|
<span class="n">receiver</span><span class="o">.</span><span class="n">msg</span><span class="p">(</span><span class="n">sendemote</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="o">**</span><span class="n">receiver_sdesc_mapping</span><span class="p">))</span></div>
|
|
|
|
|
|
<span class="c1"># ------------------------------------------------------------</span>
|
|
<span class="c1"># Handlers for sdesc and recog</span>
|
|
<span class="c1"># ------------------------------------------------------------</span>
|
|
|
|
|
|
<div class="viewcode-block" id="SdescHandler"><a class="viewcode-back" href="../../../api/evennia.contrib.rpsystem.html#evennia.contrib.rpsystem.SdescHandler">[docs]</a><span class="k">class</span> <span class="nc">SdescHandler</span><span class="p">(</span><span class="nb">object</span><span class="p">):</span>
|
|
<span class="sd">"""</span>
|
|
<span class="sd"> This Handler wraps all operations with sdescs. We</span>
|
|
<span class="sd"> need to use this since we do a lot preparations on</span>
|
|
<span class="sd"> sdescs when updating them, in order for them to be</span>
|
|
<span class="sd"> efficient to search for and query.</span>
|
|
|
|
<span class="sd"> The handler stores data in the following Attributes</span>
|
|
|
|
<span class="sd"> _sdesc - a string</span>
|
|
<span class="sd"> _regex - an empty dictionary</span>
|
|
|
|
<span class="sd"> """</span>
|
|
|
|
<div class="viewcode-block" id="SdescHandler.__init__"><a class="viewcode-back" href="../../../api/evennia.contrib.rpsystem.html#evennia.contrib.rpsystem.SdescHandler.__init__">[docs]</a> <span class="k">def</span> <span class="nf">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">obj</span><span class="p">):</span>
|
|
<span class="sd">"""</span>
|
|
<span class="sd"> Initialize the handler</span>
|
|
|
|
<span class="sd"> Args:</span>
|
|
<span class="sd"> obj (Object): The entity on which this handler is stored.</span>
|
|
|
|
<span class="sd"> """</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">obj</span> <span class="o">=</span> <span class="n">obj</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">sdesc</span> <span class="o">=</span> <span class="s2">""</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">sdesc_regex</span> <span class="o">=</span> <span class="s2">""</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">_cache</span><span class="p">()</span></div>
|
|
|
|
<span class="k">def</span> <span class="nf">_cache</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
|
|
<span class="sd">"""</span>
|
|
<span class="sd"> Cache data from storage</span>
|
|
|
|
<span class="sd"> """</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">sdesc</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">obj</span><span class="o">.</span><span class="n">attributes</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s2">"_sdesc"</span><span class="p">,</span> <span class="n">default</span><span class="o">=</span><span class="s2">""</span><span class="p">)</span>
|
|
<span class="n">sdesc_regex</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">obj</span><span class="o">.</span><span class="n">attributes</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s2">"_sdesc_regex"</span><span class="p">,</span> <span class="n">default</span><span class="o">=</span><span class="s2">""</span><span class="p">)</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">sdesc_regex</span> <span class="o">=</span> <span class="n">re</span><span class="o">.</span><span class="n">compile</span><span class="p">(</span><span class="n">sdesc_regex</span><span class="p">,</span> <span class="n">_RE_FLAGS</span><span class="p">)</span>
|
|
|
|
<div class="viewcode-block" id="SdescHandler.add"><a class="viewcode-back" href="../../../api/evennia.contrib.rpsystem.html#evennia.contrib.rpsystem.SdescHandler.add">[docs]</a> <span class="k">def</span> <span class="nf">add</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">sdesc</span><span class="p">,</span> <span class="n">max_length</span><span class="o">=</span><span class="mi">60</span><span class="p">):</span>
|
|
<span class="sd">"""</span>
|
|
<span class="sd"> Add a new sdesc to object, replacing the old one.</span>
|
|
|
|
<span class="sd"> Args:</span>
|
|
<span class="sd"> sdesc (str): The sdesc to set. This may be stripped</span>
|
|
<span class="sd"> of control sequences before setting.</span>
|
|
<span class="sd"> max_length (int, optional): The max limit of the sdesc.</span>
|
|
|
|
<span class="sd"> Returns:</span>
|
|
<span class="sd"> sdesc (str): The actually set sdesc.</span>
|
|
|
|
<span class="sd"> Raises:</span>
|
|
<span class="sd"> SdescError: If the sdesc is empty, can not be set or is</span>
|
|
<span class="sd"> longer than `max_length`.</span>
|
|
|
|
<span class="sd"> """</span>
|
|
<span class="c1"># strip emote components from sdesc</span>
|
|
<span class="n">sdesc</span> <span class="o">=</span> <span class="n">_RE_REF</span><span class="o">.</span><span class="n">sub</span><span class="p">(</span>
|
|
<span class="sa">r</span><span class="s2">"\1"</span><span class="p">,</span>
|
|
<span class="n">_RE_REF_LANG</span><span class="o">.</span><span class="n">sub</span><span class="p">(</span>
|
|
<span class="sa">r</span><span class="s2">"\1"</span><span class="p">,</span>
|
|
<span class="n">_RE_SELF_REF</span><span class="o">.</span><span class="n">sub</span><span class="p">(</span><span class="sa">r</span><span class="s2">""</span><span class="p">,</span> <span class="n">_RE_LANGUAGE</span><span class="o">.</span><span class="n">sub</span><span class="p">(</span><span class="sa">r</span><span class="s2">""</span><span class="p">,</span> <span class="n">_RE_OBJ_REF_START</span><span class="o">.</span><span class="n">sub</span><span class="p">(</span><span class="sa">r</span><span class="s2">""</span><span class="p">,</span> <span class="n">sdesc</span><span class="p">))),</span>
|
|
<span class="p">),</span>
|
|
<span class="p">)</span>
|
|
|
|
<span class="c1"># make an sdesc clean of ANSI codes</span>
|
|
<span class="n">cleaned_sdesc</span> <span class="o">=</span> <span class="n">ansi</span><span class="o">.</span><span class="n">strip_ansi</span><span class="p">(</span><span class="n">sdesc</span><span class="p">)</span>
|
|
|
|
<span class="k">if</span> <span class="ow">not</span> <span class="n">cleaned_sdesc</span><span class="p">:</span>
|
|
<span class="k">raise</span> <span class="n">SdescError</span><span class="p">(</span><span class="s2">"Short desc cannot be empty."</span><span class="p">)</span>
|
|
|
|
<span class="k">if</span> <span class="nb">len</span><span class="p">(</span><span class="n">cleaned_sdesc</span><span class="p">)</span> <span class="o">></span> <span class="n">max_length</span><span class="p">:</span>
|
|
<span class="k">raise</span> <span class="n">SdescError</span><span class="p">(</span>
|
|
<span class="s2">"Short desc can max be </span><span class="si">%i</span><span class="s2"> chars long (was </span><span class="si">%i</span><span class="s2"> chars)."</span>
|
|
<span class="o">%</span> <span class="p">(</span><span class="n">max_length</span><span class="p">,</span> <span class="nb">len</span><span class="p">(</span><span class="n">cleaned_sdesc</span><span class="p">))</span>
|
|
<span class="p">)</span>
|
|
|
|
<span class="c1"># store to attributes</span>
|
|
<span class="n">sdesc_regex</span> <span class="o">=</span> <span class="n">ordered_permutation_regex</span><span class="p">(</span><span class="n">cleaned_sdesc</span><span class="p">)</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">obj</span><span class="o">.</span><span class="n">attributes</span><span class="o">.</span><span class="n">add</span><span class="p">(</span><span class="s2">"_sdesc"</span><span class="p">,</span> <span class="n">sdesc</span><span class="p">)</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">obj</span><span class="o">.</span><span class="n">attributes</span><span class="o">.</span><span class="n">add</span><span class="p">(</span><span class="s2">"_sdesc_regex"</span><span class="p">,</span> <span class="n">sdesc_regex</span><span class="p">)</span>
|
|
<span class="c1"># local caching</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">sdesc</span> <span class="o">=</span> <span class="n">sdesc</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">sdesc_regex</span> <span class="o">=</span> <span class="n">re</span><span class="o">.</span><span class="n">compile</span><span class="p">(</span><span class="n">sdesc_regex</span><span class="p">,</span> <span class="n">_RE_FLAGS</span><span class="p">)</span>
|
|
|
|
<span class="k">return</span> <span class="n">sdesc</span></div>
|
|
|
|
<div class="viewcode-block" id="SdescHandler.get"><a class="viewcode-back" href="../../../api/evennia.contrib.rpsystem.html#evennia.contrib.rpsystem.SdescHandler.get">[docs]</a> <span class="k">def</span> <span class="nf">get</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
|
|
<span class="sd">"""</span>
|
|
<span class="sd"> Simple getter. The sdesc should never be allowed to</span>
|
|
<span class="sd"> be empty, but if it is we must fall back to the key.</span>
|
|
|
|
<span class="sd"> """</span>
|
|
<span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">sdesc</span> <span class="ow">or</span> <span class="bp">self</span><span class="o">.</span><span class="n">obj</span><span class="o">.</span><span class="n">key</span></div>
|
|
|
|
<div class="viewcode-block" id="SdescHandler.get_regex_tuple"><a class="viewcode-back" href="../../../api/evennia.contrib.rpsystem.html#evennia.contrib.rpsystem.SdescHandler.get_regex_tuple">[docs]</a> <span class="k">def</span> <span class="nf">get_regex_tuple</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
|
|
<span class="sd">"""</span>
|
|
<span class="sd"> Return data for sdesc/recog handling</span>
|
|
|
|
<span class="sd"> Returns:</span>
|
|
<span class="sd"> tup (tuple): tuple (sdesc_regex, obj, sdesc)</span>
|
|
|
|
<span class="sd"> """</span>
|
|
<span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">sdesc_regex</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">obj</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">sdesc</span></div></div>
|
|
|
|
|
|
<div class="viewcode-block" id="RecogHandler"><a class="viewcode-back" href="../../../api/evennia.contrib.rpsystem.html#evennia.contrib.rpsystem.RecogHandler">[docs]</a><span class="k">class</span> <span class="nc">RecogHandler</span><span class="p">(</span><span class="nb">object</span><span class="p">):</span>
|
|
<span class="sd">"""</span>
|
|
<span class="sd"> This handler manages the recognition mapping</span>
|
|
<span class="sd"> of an Object.</span>
|
|
|
|
<span class="sd"> The handler stores data in Attributes as dictionaries of</span>
|
|
<span class="sd"> the following names:</span>
|
|
|
|
<span class="sd"> _recog_ref2recog</span>
|
|
<span class="sd"> _recog_obj2recog</span>
|
|
<span class="sd"> _recog_obj2regex</span>
|
|
|
|
<span class="sd"> """</span>
|
|
|
|
<div class="viewcode-block" id="RecogHandler.__init__"><a class="viewcode-back" href="../../../api/evennia.contrib.rpsystem.html#evennia.contrib.rpsystem.RecogHandler.__init__">[docs]</a> <span class="k">def</span> <span class="nf">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">obj</span><span class="p">):</span>
|
|
<span class="sd">"""</span>
|
|
<span class="sd"> Initialize the handler</span>
|
|
|
|
<span class="sd"> Args:</span>
|
|
<span class="sd"> obj (Object): The entity on which this handler is stored.</span>
|
|
|
|
<span class="sd"> """</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">obj</span> <span class="o">=</span> <span class="n">obj</span>
|
|
<span class="c1"># mappings</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">ref2recog</span> <span class="o">=</span> <span class="p">{}</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">obj2regex</span> <span class="o">=</span> <span class="p">{}</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">obj2recog</span> <span class="o">=</span> <span class="p">{}</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">_cache</span><span class="p">()</span></div>
|
|
|
|
<span class="k">def</span> <span class="nf">_cache</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
|
|
<span class="sd">"""</span>
|
|
<span class="sd"> Load data to handler cache</span>
|
|
<span class="sd"> """</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">ref2recog</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">obj</span><span class="o">.</span><span class="n">attributes</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s2">"_recog_ref2recog"</span><span class="p">,</span> <span class="n">default</span><span class="o">=</span><span class="p">{})</span>
|
|
<span class="n">obj2regex</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">obj</span><span class="o">.</span><span class="n">attributes</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s2">"_recog_obj2regex"</span><span class="p">,</span> <span class="n">default</span><span class="o">=</span><span class="p">{})</span>
|
|
<span class="n">obj2recog</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">obj</span><span class="o">.</span><span class="n">attributes</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s2">"_recog_obj2recog"</span><span class="p">,</span> <span class="n">default</span><span class="o">=</span><span class="p">{})</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">obj2regex</span> <span class="o">=</span> <span class="nb">dict</span><span class="p">(</span>
|
|
<span class="p">(</span><span class="n">obj</span><span class="p">,</span> <span class="n">re</span><span class="o">.</span><span class="n">compile</span><span class="p">(</span><span class="n">regex</span><span class="p">,</span> <span class="n">_RE_FLAGS</span><span class="p">))</span> <span class="k">for</span> <span class="n">obj</span><span class="p">,</span> <span class="n">regex</span> <span class="ow">in</span> <span class="n">obj2regex</span><span class="o">.</span><span class="n">items</span><span class="p">()</span> <span class="k">if</span> <span class="n">obj</span>
|
|
<span class="p">)</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">obj2recog</span> <span class="o">=</span> <span class="nb">dict</span><span class="p">((</span><span class="n">obj</span><span class="p">,</span> <span class="n">recog</span><span class="p">)</span> <span class="k">for</span> <span class="n">obj</span><span class="p">,</span> <span class="n">recog</span> <span class="ow">in</span> <span class="n">obj2recog</span><span class="o">.</span><span class="n">items</span><span class="p">()</span> <span class="k">if</span> <span class="n">obj</span><span class="p">)</span>
|
|
|
|
<div class="viewcode-block" id="RecogHandler.add"><a class="viewcode-back" href="../../../api/evennia.contrib.rpsystem.html#evennia.contrib.rpsystem.RecogHandler.add">[docs]</a> <span class="k">def</span> <span class="nf">add</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">obj</span><span class="p">,</span> <span class="n">recog</span><span class="p">,</span> <span class="n">max_length</span><span class="o">=</span><span class="mi">60</span><span class="p">):</span>
|
|
<span class="sd">"""</span>
|
|
<span class="sd"> Assign a custom recog (nick) to the given object.</span>
|
|
|
|
<span class="sd"> Args:</span>
|
|
<span class="sd"> obj (Object): The object ot associate with the recog</span>
|
|
<span class="sd"> string. This is usually determined from the sdesc in the</span>
|
|
<span class="sd"> room by a call to parse_sdescs_and_recogs, but can also be</span>
|
|
<span class="sd"> given.</span>
|
|
<span class="sd"> recog (str): The replacement string to use with this object.</span>
|
|
<span class="sd"> max_length (int, optional): The max length of the recog string.</span>
|
|
|
|
<span class="sd"> Returns:</span>
|
|
<span class="sd"> recog (str): The (possibly cleaned up) recog string actually set.</span>
|
|
|
|
<span class="sd"> Raises:</span>
|
|
<span class="sd"> SdescError: When recog could not be set or sdesc longer</span>
|
|
<span class="sd"> than `max_length`.</span>
|
|
|
|
<span class="sd"> """</span>
|
|
<span class="k">if</span> <span class="ow">not</span> <span class="n">obj</span><span class="o">.</span><span class="n">access</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">obj</span><span class="p">,</span> <span class="s2">"enable_recog"</span><span class="p">,</span> <span class="n">default</span><span class="o">=</span><span class="kc">True</span><span class="p">):</span>
|
|
<span class="k">raise</span> <span class="n">SdescError</span><span class="p">(</span><span class="s2">"This person is unrecognizeable."</span><span class="p">)</span>
|
|
|
|
<span class="c1"># strip emote components from recog</span>
|
|
<span class="n">recog</span> <span class="o">=</span> <span class="n">_RE_REF</span><span class="o">.</span><span class="n">sub</span><span class="p">(</span>
|
|
<span class="sa">r</span><span class="s2">"\1"</span><span class="p">,</span>
|
|
<span class="n">_RE_REF_LANG</span><span class="o">.</span><span class="n">sub</span><span class="p">(</span>
|
|
<span class="sa">r</span><span class="s2">"\1"</span><span class="p">,</span>
|
|
<span class="n">_RE_SELF_REF</span><span class="o">.</span><span class="n">sub</span><span class="p">(</span><span class="sa">r</span><span class="s2">""</span><span class="p">,</span> <span class="n">_RE_LANGUAGE</span><span class="o">.</span><span class="n">sub</span><span class="p">(</span><span class="sa">r</span><span class="s2">""</span><span class="p">,</span> <span class="n">_RE_OBJ_REF_START</span><span class="o">.</span><span class="n">sub</span><span class="p">(</span><span class="sa">r</span><span class="s2">""</span><span class="p">,</span> <span class="n">recog</span><span class="p">))),</span>
|
|
<span class="p">),</span>
|
|
<span class="p">)</span>
|
|
|
|
<span class="c1"># make an recog clean of ANSI codes</span>
|
|
<span class="n">cleaned_recog</span> <span class="o">=</span> <span class="n">ansi</span><span class="o">.</span><span class="n">strip_ansi</span><span class="p">(</span><span class="n">recog</span><span class="p">)</span>
|
|
|
|
<span class="k">if</span> <span class="ow">not</span> <span class="n">cleaned_recog</span><span class="p">:</span>
|
|
<span class="k">raise</span> <span class="n">SdescError</span><span class="p">(</span><span class="s2">"Recog string cannot be empty."</span><span class="p">)</span>
|
|
|
|
<span class="k">if</span> <span class="nb">len</span><span class="p">(</span><span class="n">cleaned_recog</span><span class="p">)</span> <span class="o">></span> <span class="n">max_length</span><span class="p">:</span>
|
|
<span class="k">raise</span> <span class="n">RecogError</span><span class="p">(</span>
|
|
<span class="s2">"Recog string cannot be longer than </span><span class="si">%i</span><span class="s2"> chars (was </span><span class="si">%i</span><span class="s2"> chars)"</span>
|
|
<span class="o">%</span> <span class="p">(</span><span class="n">max_length</span><span class="p">,</span> <span class="nb">len</span><span class="p">(</span><span class="n">cleaned_recog</span><span class="p">))</span>
|
|
<span class="p">)</span>
|
|
|
|
<span class="c1"># mapping #dbref:obj</span>
|
|
<span class="n">key</span> <span class="o">=</span> <span class="s2">"#</span><span class="si">%i</span><span class="s2">"</span> <span class="o">%</span> <span class="n">obj</span><span class="o">.</span><span class="n">id</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">obj</span><span class="o">.</span><span class="n">attributes</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s2">"_recog_ref2recog"</span><span class="p">,</span> <span class="n">default</span><span class="o">=</span><span class="p">{})[</span><span class="n">key</span><span class="p">]</span> <span class="o">=</span> <span class="n">recog</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">obj</span><span class="o">.</span><span class="n">attributes</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s2">"_recog_obj2recog"</span><span class="p">,</span> <span class="n">default</span><span class="o">=</span><span class="p">{})[</span><span class="n">obj</span><span class="p">]</span> <span class="o">=</span> <span class="n">recog</span>
|
|
<span class="n">regex</span> <span class="o">=</span> <span class="n">ordered_permutation_regex</span><span class="p">(</span><span class="n">cleaned_recog</span><span class="p">)</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">obj</span><span class="o">.</span><span class="n">attributes</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s2">"_recog_obj2regex"</span><span class="p">,</span> <span class="n">default</span><span class="o">=</span><span class="p">{})[</span><span class="n">obj</span><span class="p">]</span> <span class="o">=</span> <span class="n">regex</span>
|
|
<span class="c1"># local caching</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">ref2recog</span><span class="p">[</span><span class="n">key</span><span class="p">]</span> <span class="o">=</span> <span class="n">recog</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">obj2recog</span><span class="p">[</span><span class="n">obj</span><span class="p">]</span> <span class="o">=</span> <span class="n">recog</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">obj2regex</span><span class="p">[</span><span class="n">obj</span><span class="p">]</span> <span class="o">=</span> <span class="n">re</span><span class="o">.</span><span class="n">compile</span><span class="p">(</span><span class="n">regex</span><span class="p">,</span> <span class="n">_RE_FLAGS</span><span class="p">)</span>
|
|
<span class="k">return</span> <span class="n">recog</span></div>
|
|
|
|
<div class="viewcode-block" id="RecogHandler.get"><a class="viewcode-back" href="../../../api/evennia.contrib.rpsystem.html#evennia.contrib.rpsystem.RecogHandler.get">[docs]</a> <span class="k">def</span> <span class="nf">get</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">obj</span><span class="p">):</span>
|
|
<span class="sd">"""</span>
|
|
<span class="sd"> Get recog replacement string, if one exists, otherwise</span>
|
|
<span class="sd"> get sdesc and as a last resort, the object's key.</span>
|
|
|
|
<span class="sd"> Args:</span>
|
|
<span class="sd"> obj (Object): The object, whose sdesc to replace</span>
|
|
<span class="sd"> Returns:</span>
|
|
<span class="sd"> recog (str): The replacement string to use.</span>
|
|
|
|
<span class="sd"> Notes:</span>
|
|
<span class="sd"> This method will respect a "enable_recog" lock set on</span>
|
|
<span class="sd"> `obj` (True by default) in order to turn off recog</span>
|
|
<span class="sd"> mechanism. This is useful for adding masks/hoods etc.</span>
|
|
<span class="sd"> """</span>
|
|
<span class="k">if</span> <span class="n">obj</span><span class="o">.</span><span class="n">access</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">obj</span><span class="p">,</span> <span class="s2">"enable_recog"</span><span class="p">,</span> <span class="n">default</span><span class="o">=</span><span class="kc">True</span><span class="p">):</span>
|
|
<span class="c1"># check an eventual recog_masked lock on the object</span>
|
|
<span class="c1"># to avoid revealing masked characters. If lock</span>
|
|
<span class="c1"># does not exist, pass automatically.</span>
|
|
<span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">obj2recog</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="n">obj</span><span class="p">,</span> <span class="n">obj</span><span class="o">.</span><span class="n">sdesc</span><span class="o">.</span><span class="n">get</span><span class="p">()</span> <span class="k">if</span> <span class="nb">hasattr</span><span class="p">(</span><span class="n">obj</span><span class="p">,</span> <span class="s2">"sdesc"</span><span class="p">)</span> <span class="k">else</span> <span class="n">obj</span><span class="o">.</span><span class="n">key</span><span class="p">)</span>
|
|
<span class="k">else</span><span class="p">:</span>
|
|
<span class="c1"># recog_mask log not passed, disable recog</span>
|
|
<span class="k">return</span> <span class="n">obj</span><span class="o">.</span><span class="n">sdesc</span><span class="o">.</span><span class="n">get</span><span class="p">()</span> <span class="k">if</span> <span class="nb">hasattr</span><span class="p">(</span><span class="n">obj</span><span class="p">,</span> <span class="s2">"sdesc"</span><span class="p">)</span> <span class="k">else</span> <span class="n">obj</span><span class="o">.</span><span class="n">key</span></div>
|
|
|
|
<div class="viewcode-block" id="RecogHandler.all"><a class="viewcode-back" href="../../../api/evennia.contrib.rpsystem.html#evennia.contrib.rpsystem.RecogHandler.all">[docs]</a> <span class="k">def</span> <span class="nf">all</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
|
|
<span class="sd">"""</span>
|
|
<span class="sd"> Get a mapping of the recogs stored in handler.</span>
|
|
|
|
<span class="sd"> Returns:</span>
|
|
<span class="sd"> recogs (dict): A mapping of {recog: obj} stored in handler.</span>
|
|
|
|
<span class="sd"> """</span>
|
|
<span class="k">return</span> <span class="p">{</span><span class="bp">self</span><span class="o">.</span><span class="n">obj2recog</span><span class="p">[</span><span class="n">obj</span><span class="p">]:</span> <span class="n">obj</span> <span class="k">for</span> <span class="n">obj</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">obj2recog</span><span class="o">.</span><span class="n">keys</span><span class="p">()}</span></div>
|
|
|
|
<div class="viewcode-block" id="RecogHandler.remove"><a class="viewcode-back" href="../../../api/evennia.contrib.rpsystem.html#evennia.contrib.rpsystem.RecogHandler.remove">[docs]</a> <span class="k">def</span> <span class="nf">remove</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">obj</span><span class="p">):</span>
|
|
<span class="sd">"""</span>
|
|
<span class="sd"> Clear recog for a given object.</span>
|
|
|
|
<span class="sd"> Args:</span>
|
|
<span class="sd"> obj (Object): The object for which to remove recog.</span>
|
|
<span class="sd"> """</span>
|
|
<span class="k">if</span> <span class="n">obj</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">obj2recog</span><span class="p">:</span>
|
|
<span class="k">del</span> <span class="bp">self</span><span class="o">.</span><span class="n">obj</span><span class="o">.</span><span class="n">db</span><span class="o">.</span><span class="n">_recog_obj2recog</span><span class="p">[</span><span class="n">obj</span><span class="p">]</span>
|
|
<span class="k">del</span> <span class="bp">self</span><span class="o">.</span><span class="n">obj</span><span class="o">.</span><span class="n">db</span><span class="o">.</span><span class="n">_recog_obj2regex</span><span class="p">[</span><span class="n">obj</span><span class="p">]</span>
|
|
<span class="k">del</span> <span class="bp">self</span><span class="o">.</span><span class="n">obj</span><span class="o">.</span><span class="n">db</span><span class="o">.</span><span class="n">_recog_ref2recog</span><span class="p">[</span><span class="s2">"#</span><span class="si">%i</span><span class="s2">"</span> <span class="o">%</span> <span class="n">obj</span><span class="o">.</span><span class="n">id</span><span class="p">]</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">_cache</span><span class="p">()</span></div>
|
|
|
|
<div class="viewcode-block" id="RecogHandler.get_regex_tuple"><a class="viewcode-back" href="../../../api/evennia.contrib.rpsystem.html#evennia.contrib.rpsystem.RecogHandler.get_regex_tuple">[docs]</a> <span class="k">def</span> <span class="nf">get_regex_tuple</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">obj</span><span class="p">):</span>
|
|
<span class="sd">"""</span>
|
|
<span class="sd"> Returns:</span>
|
|
<span class="sd"> rec (tuple): Tuple (recog_regex, obj, recog)</span>
|
|
<span class="sd"> """</span>
|
|
<span class="k">if</span> <span class="n">obj</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">obj2recog</span> <span class="ow">and</span> <span class="n">obj</span><span class="o">.</span><span class="n">access</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">obj</span><span class="p">,</span> <span class="s2">"enable_recog"</span><span class="p">,</span> <span class="n">default</span><span class="o">=</span><span class="kc">True</span><span class="p">):</span>
|
|
<span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">obj2regex</span><span class="p">[</span><span class="n">obj</span><span class="p">],</span> <span class="n">obj</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">obj2regex</span><span class="p">[</span><span class="n">obj</span><span class="p">]</span>
|
|
<span class="k">return</span> <span class="kc">None</span></div></div>
|
|
|
|
|
|
<span class="c1"># ------------------------------------------------------------</span>
|
|
<span class="c1"># RP Commands</span>
|
|
<span class="c1"># ------------------------------------------------------------</span>
|
|
|
|
|
|
<div class="viewcode-block" id="RPCommand"><a class="viewcode-back" href="../../../api/evennia.contrib.rpsystem.html#evennia.contrib.rpsystem.RPCommand">[docs]</a><span class="k">class</span> <span class="nc">RPCommand</span><span class="p">(</span><span class="n">Command</span><span class="p">):</span>
|
|
<span class="s2">"simple parent"</span>
|
|
|
|
<div class="viewcode-block" id="RPCommand.parse"><a class="viewcode-back" href="../../../api/evennia.contrib.rpsystem.html#evennia.contrib.rpsystem.RPCommand.parse">[docs]</a> <span class="k">def</span> <span class="nf">parse</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
|
|
<span class="s2">"strip extra whitespace"</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">args</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">args</span><span class="o">.</span><span class="n">strip</span><span class="p">()</span></div></div>
|
|
|
|
|
|
<div class="viewcode-block" id="CmdEmote"><a class="viewcode-back" href="../../../api/evennia.contrib.rpsystem.html#evennia.contrib.rpsystem.CmdEmote">[docs]</a><span class="k">class</span> <span class="nc">CmdEmote</span><span class="p">(</span><span class="n">RPCommand</span><span class="p">):</span> <span class="c1"># replaces the main emote</span>
|
|
<span class="sd">"""</span>
|
|
<span class="sd"> Emote an action, allowing dynamic replacement of</span>
|
|
<span class="sd"> text in the emote.</span>
|
|
|
|
<span class="sd"> Usage:</span>
|
|
<span class="sd"> emote text</span>
|
|
|
|
<span class="sd"> Example:</span>
|
|
<span class="sd"> emote /me looks around.</span>
|
|
<span class="sd"> emote With a flurry /me attacks /tall man with his sword.</span>
|
|
<span class="sd"> emote "Hello", /me says.</span>
|
|
|
|
<span class="sd"> Describes an event in the world. This allows the use of /ref</span>
|
|
<span class="sd"> markers to replace with the short descriptions or recognized</span>
|
|
<span class="sd"> strings of objects in the same room. These will be translated to</span>
|
|
<span class="sd"> emotes to match each person seeing it. Use "..." for saying</span>
|
|
<span class="sd"> things and langcode"..." without spaces to say something in</span>
|
|
<span class="sd"> a different language.</span>
|
|
|
|
<span class="sd"> """</span>
|
|
|
|
<span class="n">key</span> <span class="o">=</span> <span class="s2">"emote"</span>
|
|
<span class="n">aliases</span> <span class="o">=</span> <span class="p">[</span><span class="s2">":"</span><span class="p">]</span>
|
|
<span class="n">locks</span> <span class="o">=</span> <span class="s2">"cmd:all()"</span>
|
|
|
|
<div class="viewcode-block" id="CmdEmote.func"><a class="viewcode-back" href="../../../api/evennia.contrib.rpsystem.html#evennia.contrib.rpsystem.CmdEmote.func">[docs]</a> <span class="k">def</span> <span class="nf">func</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
|
|
<span class="s2">"Perform the emote."</span>
|
|
<span class="k">if</span> <span class="ow">not</span> <span class="bp">self</span><span class="o">.</span><span class="n">args</span><span class="p">:</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">caller</span><span class="o">.</span><span class="n">msg</span><span class="p">(</span><span class="s2">"What do you want to do?"</span><span class="p">)</span>
|
|
<span class="k">else</span><span class="p">:</span>
|
|
<span class="c1"># we also include ourselves here.</span>
|
|
<span class="n">emote</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">args</span>
|
|
<span class="n">targets</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">caller</span><span class="o">.</span><span class="n">location</span><span class="o">.</span><span class="n">contents</span>
|
|
<span class="k">if</span> <span class="ow">not</span> <span class="n">emote</span><span class="o">.</span><span class="n">endswith</span><span class="p">((</span><span class="s2">"."</span><span class="p">,</span> <span class="s2">"?"</span><span class="p">,</span> <span class="s2">"!"</span><span class="p">)):</span> <span class="c1"># If emote is not punctuated,</span>
|
|
<span class="n">emote</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">emote</span> <span class="c1"># add a full-stop for good measure.</span>
|
|
<span class="n">send_emote</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">caller</span><span class="p">,</span> <span class="n">targets</span><span class="p">,</span> <span class="n">emote</span><span class="p">,</span> <span class="n">anonymous_add</span><span class="o">=</span><span class="s2">"first"</span><span class="p">)</span></div></div>
|
|
|
|
|
|
<div class="viewcode-block" id="CmdSay"><a class="viewcode-back" href="../../../api/evennia.contrib.rpsystem.html#evennia.contrib.rpsystem.CmdSay">[docs]</a><span class="k">class</span> <span class="nc">CmdSay</span><span class="p">(</span><span class="n">RPCommand</span><span class="p">):</span> <span class="c1"># replaces standard say</span>
|
|
<span class="sd">"""</span>
|
|
<span class="sd"> speak as your character</span>
|
|
|
|
<span class="sd"> Usage:</span>
|
|
<span class="sd"> say <message></span>
|
|
|
|
<span class="sd"> Talk to those in your current location.</span>
|
|
<span class="sd"> """</span>
|
|
|
|
<span class="n">key</span> <span class="o">=</span> <span class="s2">"say"</span>
|
|
<span class="n">aliases</span> <span class="o">=</span> <span class="p">[</span><span class="s1">'"'</span><span class="p">,</span> <span class="s2">"'"</span><span class="p">]</span>
|
|
<span class="n">locks</span> <span class="o">=</span> <span class="s2">"cmd:all()"</span>
|
|
|
|
<div class="viewcode-block" id="CmdSay.func"><a class="viewcode-back" href="../../../api/evennia.contrib.rpsystem.html#evennia.contrib.rpsystem.CmdSay.func">[docs]</a> <span class="k">def</span> <span class="nf">func</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
|
|
<span class="s2">"Run the say command"</span>
|
|
|
|
<span class="n">caller</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">caller</span>
|
|
|
|
<span class="k">if</span> <span class="ow">not</span> <span class="bp">self</span><span class="o">.</span><span class="n">args</span><span class="p">:</span>
|
|
<span class="n">caller</span><span class="o">.</span><span class="n">msg</span><span class="p">(</span><span class="s2">"Say what?"</span><span class="p">)</span>
|
|
<span class="k">return</span>
|
|
|
|
<span class="c1"># calling the speech modifying hook</span>
|
|
<span class="n">speech</span> <span class="o">=</span> <span class="n">caller</span><span class="o">.</span><span class="n">at_before_say</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">args</span><span class="p">)</span>
|
|
<span class="c1"># preparing the speech with sdesc/speech parsing.</span>
|
|
<span class="n">targets</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">caller</span><span class="o">.</span><span class="n">location</span><span class="o">.</span><span class="n">contents</span>
|
|
<span class="n">send_emote</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">caller</span><span class="p">,</span> <span class="n">targets</span><span class="p">,</span> <span class="n">speech</span><span class="p">,</span> <span class="n">anonymous_add</span><span class="o">=</span><span class="kc">None</span><span class="p">)</span></div></div>
|
|
|
|
|
|
<div class="viewcode-block" id="CmdSdesc"><a class="viewcode-back" href="../../../api/evennia.contrib.rpsystem.html#evennia.contrib.rpsystem.CmdSdesc">[docs]</a><span class="k">class</span> <span class="nc">CmdSdesc</span><span class="p">(</span><span class="n">RPCommand</span><span class="p">):</span> <span class="c1"># set/look at own sdesc</span>
|
|
<span class="sd">"""</span>
|
|
<span class="sd"> Assign yourself a short description (sdesc).</span>
|
|
|
|
<span class="sd"> Usage:</span>
|
|
<span class="sd"> sdesc <short description></span>
|
|
|
|
<span class="sd"> Assigns a short description to yourself.</span>
|
|
|
|
<span class="sd"> """</span>
|
|
|
|
<span class="n">key</span> <span class="o">=</span> <span class="s2">"sdesc"</span>
|
|
<span class="n">locks</span> <span class="o">=</span> <span class="s2">"cmd:all()"</span>
|
|
|
|
<div class="viewcode-block" id="CmdSdesc.func"><a class="viewcode-back" href="../../../api/evennia.contrib.rpsystem.html#evennia.contrib.rpsystem.CmdSdesc.func">[docs]</a> <span class="k">def</span> <span class="nf">func</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
|
|
<span class="s2">"Assign the sdesc"</span>
|
|
<span class="n">caller</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">caller</span>
|
|
<span class="k">if</span> <span class="ow">not</span> <span class="bp">self</span><span class="o">.</span><span class="n">args</span><span class="p">:</span>
|
|
<span class="n">caller</span><span class="o">.</span><span class="n">msg</span><span class="p">(</span><span class="s2">"Usage: sdesc <sdesc-text>"</span><span class="p">)</span>
|
|
<span class="k">return</span>
|
|
<span class="k">else</span><span class="p">:</span>
|
|
<span class="c1"># strip non-alfanum chars from end of sdesc</span>
|
|
<span class="n">sdesc</span> <span class="o">=</span> <span class="n">_RE_CHAREND</span><span class="o">.</span><span class="n">sub</span><span class="p">(</span><span class="s2">""</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">args</span><span class="p">)</span>
|
|
<span class="k">try</span><span class="p">:</span>
|
|
<span class="n">sdesc</span> <span class="o">=</span> <span class="n">caller</span><span class="o">.</span><span class="n">sdesc</span><span class="o">.</span><span class="n">add</span><span class="p">(</span><span class="n">sdesc</span><span class="p">)</span>
|
|
<span class="k">except</span> <span class="n">SdescError</span> <span class="k">as</span> <span class="n">err</span><span class="p">:</span>
|
|
<span class="n">caller</span><span class="o">.</span><span class="n">msg</span><span class="p">(</span><span class="n">err</span><span class="p">)</span>
|
|
<span class="k">return</span>
|
|
<span class="k">except</span> <span class="ne">AttributeError</span><span class="p">:</span>
|
|
<span class="n">caller</span><span class="o">.</span><span class="n">msg</span><span class="p">(</span><span class="n">f</span><span class="s2">"Cannot set sdesc on </span><span class="si">{caller.key}</span><span class="s2">."</span><span class="p">)</span>
|
|
<span class="k">return</span>
|
|
<span class="n">caller</span><span class="o">.</span><span class="n">msg</span><span class="p">(</span><span class="s2">"</span><span class="si">%s</span><span class="s2">'s sdesc was set to '</span><span class="si">%s</span><span class="s2">'."</span> <span class="o">%</span> <span class="p">(</span><span class="n">caller</span><span class="o">.</span><span class="n">key</span><span class="p">,</span> <span class="n">sdesc</span><span class="p">))</span></div></div>
|
|
|
|
|
|
<div class="viewcode-block" id="CmdPose"><a class="viewcode-back" href="../../../api/evennia.contrib.rpsystem.html#evennia.contrib.rpsystem.CmdPose">[docs]</a><span class="k">class</span> <span class="nc">CmdPose</span><span class="p">(</span><span class="n">RPCommand</span><span class="p">):</span> <span class="c1"># set current pose and default pose</span>
|
|
<span class="sd">"""</span>
|
|
<span class="sd"> Set a static pose</span>
|
|
|
|
<span class="sd"> Usage:</span>
|
|
<span class="sd"> pose <pose></span>
|
|
<span class="sd"> pose default <pose></span>
|
|
<span class="sd"> pose reset</span>
|
|
<span class="sd"> pose obj = <pose></span>
|
|
<span class="sd"> pose default obj = <pose></span>
|
|
<span class="sd"> pose reset obj =</span>
|
|
|
|
<span class="sd"> Examples:</span>
|
|
<span class="sd"> pose leans against the tree</span>
|
|
<span class="sd"> pose is talking to the barkeep.</span>
|
|
<span class="sd"> pose box = is sitting on the floor.</span>
|
|
|
|
<span class="sd"> Set a static pose. This is the end of a full sentence that starts</span>
|
|
<span class="sd"> with your sdesc. If no full stop is given, it will be added</span>
|
|
<span class="sd"> automatically. The default pose is the pose you get when using</span>
|
|
<span class="sd"> pose reset. Note that you can use sdescs/recogs to reference</span>
|
|
<span class="sd"> people in your pose, but these always appear as that person's</span>
|
|
<span class="sd"> sdesc in the emote, regardless of who is seeing it.</span>
|
|
|
|
<span class="sd"> """</span>
|
|
|
|
<span class="n">key</span> <span class="o">=</span> <span class="s2">"pose"</span>
|
|
|
|
<div class="viewcode-block" id="CmdPose.parse"><a class="viewcode-back" href="../../../api/evennia.contrib.rpsystem.html#evennia.contrib.rpsystem.CmdPose.parse">[docs]</a> <span class="k">def</span> <span class="nf">parse</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
|
|
<span class="sd">"""</span>
|
|
<span class="sd"> Extract the "default" alternative to the pose.</span>
|
|
<span class="sd"> """</span>
|
|
<span class="n">args</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">args</span><span class="o">.</span><span class="n">strip</span><span class="p">()</span>
|
|
<span class="n">default</span> <span class="o">=</span> <span class="n">args</span><span class="o">.</span><span class="n">startswith</span><span class="p">(</span><span class="s2">"default"</span><span class="p">)</span>
|
|
<span class="n">reset</span> <span class="o">=</span> <span class="n">args</span><span class="o">.</span><span class="n">startswith</span><span class="p">(</span><span class="s2">"reset"</span><span class="p">)</span>
|
|
<span class="k">if</span> <span class="n">default</span><span class="p">:</span>
|
|
<span class="n">args</span> <span class="o">=</span> <span class="n">re</span><span class="o">.</span><span class="n">sub</span><span class="p">(</span><span class="sa">r</span><span class="s2">"^default"</span><span class="p">,</span> <span class="s2">""</span><span class="p">,</span> <span class="n">args</span><span class="p">)</span>
|
|
<span class="k">if</span> <span class="n">reset</span><span class="p">:</span>
|
|
<span class="n">args</span> <span class="o">=</span> <span class="n">re</span><span class="o">.</span><span class="n">sub</span><span class="p">(</span><span class="sa">r</span><span class="s2">"^reset"</span><span class="p">,</span> <span class="s2">""</span><span class="p">,</span> <span class="n">args</span><span class="p">)</span>
|
|
<span class="n">target</span> <span class="o">=</span> <span class="kc">None</span>
|
|
<span class="k">if</span> <span class="s2">"="</span> <span class="ow">in</span> <span class="n">args</span><span class="p">:</span>
|
|
<span class="n">target</span><span class="p">,</span> <span class="n">args</span> <span class="o">=</span> <span class="p">[</span><span class="n">part</span><span class="o">.</span><span class="n">strip</span><span class="p">()</span> <span class="k">for</span> <span class="n">part</span> <span class="ow">in</span> <span class="n">args</span><span class="o">.</span><span class="n">split</span><span class="p">(</span><span class="s2">"="</span><span class="p">,</span> <span class="mi">1</span><span class="p">)]</span>
|
|
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">target</span> <span class="o">=</span> <span class="n">target</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">reset</span> <span class="o">=</span> <span class="n">reset</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">default</span> <span class="o">=</span> <span class="n">default</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">args</span> <span class="o">=</span> <span class="n">args</span><span class="o">.</span><span class="n">strip</span><span class="p">()</span></div>
|
|
|
|
<div class="viewcode-block" id="CmdPose.func"><a class="viewcode-back" href="../../../api/evennia.contrib.rpsystem.html#evennia.contrib.rpsystem.CmdPose.func">[docs]</a> <span class="k">def</span> <span class="nf">func</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
|
|
<span class="s2">"Create the pose"</span>
|
|
<span class="n">caller</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">caller</span>
|
|
<span class="n">pose</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">args</span>
|
|
<span class="n">target</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">target</span>
|
|
<span class="k">if</span> <span class="ow">not</span> <span class="n">pose</span> <span class="ow">and</span> <span class="ow">not</span> <span class="bp">self</span><span class="o">.</span><span class="n">reset</span><span class="p">:</span>
|
|
<span class="n">caller</span><span class="o">.</span><span class="n">msg</span><span class="p">(</span><span class="s2">"Usage: pose <pose-text> OR pose obj = <pose-text>"</span><span class="p">)</span>
|
|
<span class="k">return</span>
|
|
|
|
<span class="k">if</span> <span class="ow">not</span> <span class="n">pose</span><span class="o">.</span><span class="n">endswith</span><span class="p">(</span><span class="s2">"."</span><span class="p">):</span>
|
|
<span class="n">pose</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">pose</span>
|
|
<span class="k">if</span> <span class="n">target</span><span class="p">:</span>
|
|
<span class="c1"># affect something else</span>
|
|
<span class="n">target</span> <span class="o">=</span> <span class="n">caller</span><span class="o">.</span><span class="n">search</span><span class="p">(</span><span class="n">target</span><span class="p">)</span>
|
|
<span class="k">if</span> <span class="ow">not</span> <span class="n">target</span><span class="p">:</span>
|
|
<span class="k">return</span>
|
|
<span class="k">if</span> <span class="ow">not</span> <span class="n">target</span><span class="o">.</span><span class="n">access</span><span class="p">(</span><span class="n">caller</span><span class="p">,</span> <span class="s2">"edit"</span><span class="p">):</span>
|
|
<span class="n">caller</span><span class="o">.</span><span class="n">msg</span><span class="p">(</span><span class="s2">"You can't pose that."</span><span class="p">)</span>
|
|
<span class="k">return</span>
|
|
<span class="k">else</span><span class="p">:</span>
|
|
<span class="n">target</span> <span class="o">=</span> <span class="n">caller</span>
|
|
|
|
<span class="k">if</span> <span class="ow">not</span> <span class="n">target</span><span class="o">.</span><span class="n">attributes</span><span class="o">.</span><span class="n">has</span><span class="p">(</span><span class="s2">"pose"</span><span class="p">):</span>
|
|
<span class="n">caller</span><span class="o">.</span><span class="n">msg</span><span class="p">(</span><span class="s2">"</span><span class="si">%s</span><span class="s2"> cannot be posed."</span> <span class="o">%</span> <span class="n">target</span><span class="o">.</span><span class="n">key</span><span class="p">)</span>
|
|
<span class="k">return</span>
|
|
|
|
<span class="n">target_name</span> <span class="o">=</span> <span class="n">target</span><span class="o">.</span><span class="n">sdesc</span><span class="o">.</span><span class="n">get</span><span class="p">()</span> <span class="k">if</span> <span class="nb">hasattr</span><span class="p">(</span><span class="n">target</span><span class="p">,</span> <span class="s2">"sdesc"</span><span class="p">)</span> <span class="k">else</span> <span class="n">target</span><span class="o">.</span><span class="n">key</span>
|
|
<span class="c1"># set the pose</span>
|
|
<span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">reset</span><span class="p">:</span>
|
|
<span class="n">pose</span> <span class="o">=</span> <span class="n">target</span><span class="o">.</span><span class="n">db</span><span class="o">.</span><span class="n">pose_default</span>
|
|
<span class="n">target</span><span class="o">.</span><span class="n">db</span><span class="o">.</span><span class="n">pose</span> <span class="o">=</span> <span class="n">pose</span>
|
|
<span class="k">elif</span> <span class="bp">self</span><span class="o">.</span><span class="n">default</span><span class="p">:</span>
|
|
<span class="n">target</span><span class="o">.</span><span class="n">db</span><span class="o">.</span><span class="n">pose_default</span> <span class="o">=</span> <span class="n">pose</span>
|
|
<span class="n">caller</span><span class="o">.</span><span class="n">msg</span><span class="p">(</span><span class="s2">"Default pose is now '</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">target_name</span><span class="p">,</span> <span class="n">pose</span><span class="p">))</span>
|
|
<span class="k">return</span>
|
|
<span class="k">else</span><span class="p">:</span>
|
|
<span class="c1"># set the pose. We do one-time ref->sdesc mapping here.</span>
|
|
<span class="n">parsed</span><span class="p">,</span> <span class="n">mapping</span> <span class="o">=</span> <span class="n">parse_sdescs_and_recogs</span><span class="p">(</span><span class="n">caller</span><span class="p">,</span> <span class="n">caller</span><span class="o">.</span><span class="n">location</span><span class="o">.</span><span class="n">contents</span><span class="p">,</span> <span class="n">pose</span><span class="p">)</span>
|
|
<span class="n">mapping</span> <span class="o">=</span> <span class="nb">dict</span><span class="p">(</span>
|
|
<span class="p">(</span><span class="n">ref</span><span class="p">,</span> <span class="n">obj</span><span class="o">.</span><span class="n">sdesc</span><span class="o">.</span><span class="n">get</span><span class="p">()</span> <span class="k">if</span> <span class="nb">hasattr</span><span class="p">(</span><span class="n">obj</span><span class="p">,</span> <span class="s2">"sdesc"</span><span class="p">)</span> <span class="k">else</span> <span class="n">obj</span><span class="o">.</span><span class="n">key</span><span class="p">)</span>
|
|
<span class="k">for</span> <span class="n">ref</span><span class="p">,</span> <span class="n">obj</span> <span class="ow">in</span> <span class="n">mapping</span><span class="o">.</span><span class="n">items</span><span class="p">()</span>
|
|
<span class="p">)</span>
|
|
<span class="n">pose</span> <span class="o">=</span> <span class="n">parsed</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="o">**</span><span class="n">mapping</span><span class="p">)</span>
|
|
|
|
<span class="k">if</span> <span class="nb">len</span><span class="p">(</span><span class="n">target_name</span><span class="p">)</span> <span class="o">+</span> <span class="nb">len</span><span class="p">(</span><span class="n">pose</span><span class="p">)</span> <span class="o">></span> <span class="mi">60</span><span class="p">:</span>
|
|
<span class="n">caller</span><span class="o">.</span><span class="n">msg</span><span class="p">(</span><span class="s2">"Your pose '</span><span class="si">%s</span><span class="s2">' is too long."</span> <span class="o">%</span> <span class="n">pose</span><span class="p">)</span>
|
|
<span class="k">return</span>
|
|
|
|
<span class="n">target</span><span class="o">.</span><span class="n">db</span><span class="o">.</span><span class="n">pose</span> <span class="o">=</span> <span class="n">pose</span>
|
|
|
|
<span class="n">caller</span><span class="o">.</span><span class="n">msg</span><span class="p">(</span><span class="s2">"Pose will read '</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">target_name</span><span class="p">,</span> <span class="n">pose</span><span class="p">))</span></div></div>
|
|
|
|
|
|
<div class="viewcode-block" id="CmdRecog"><a class="viewcode-back" href="../../../api/evennia.contrib.rpsystem.html#evennia.contrib.rpsystem.CmdRecog">[docs]</a><span class="k">class</span> <span class="nc">CmdRecog</span><span class="p">(</span><span class="n">RPCommand</span><span class="p">):</span> <span class="c1"># assign personal alias to object in room</span>
|
|
<span class="sd">"""</span>
|
|
<span class="sd"> Recognize another person in the same room.</span>
|
|
|
|
<span class="sd"> Usage:</span>
|
|
<span class="sd"> recog</span>
|
|
<span class="sd"> recog sdesc as alias</span>
|
|
<span class="sd"> forget alias</span>
|
|
|
|
<span class="sd"> Example:</span>
|
|
<span class="sd"> recog tall man as Griatch</span>
|
|
<span class="sd"> forget griatch</span>
|
|
|
|
<span class="sd"> This will assign a personal alias for a person, or forget said alias.</span>
|
|
<span class="sd"> Using the command without arguments will list all current recogs.</span>
|
|
|
|
<span class="sd"> """</span>
|
|
|
|
<span class="n">key</span> <span class="o">=</span> <span class="s2">"recog"</span>
|
|
<span class="n">aliases</span> <span class="o">=</span> <span class="p">[</span><span class="s2">"recognize"</span><span class="p">,</span> <span class="s2">"forget"</span><span class="p">]</span>
|
|
|
|
<div class="viewcode-block" id="CmdRecog.parse"><a class="viewcode-back" href="../../../api/evennia.contrib.rpsystem.html#evennia.contrib.rpsystem.CmdRecog.parse">[docs]</a> <span class="k">def</span> <span class="nf">parse</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
|
|
<span class="s2">"Parse for the sdesc as alias structure"</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">sdesc</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">alias</span> <span class="o">=</span> <span class="s2">""</span><span class="p">,</span> <span class="s2">""</span>
|
|
<span class="k">if</span> <span class="s2">" as "</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">args</span><span class="p">:</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">sdesc</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">alias</span> <span class="o">=</span> <span class="p">[</span><span class="n">part</span><span class="o">.</span><span class="n">strip</span><span class="p">()</span> <span class="k">for</span> <span class="n">part</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">args</span><span class="o">.</span><span class="n">split</span><span class="p">(</span><span class="s2">" as "</span><span class="p">,</span> <span class="mi">2</span><span class="p">)]</span>
|
|
<span class="k">elif</span> <span class="bp">self</span><span class="o">.</span><span class="n">args</span><span class="p">:</span>
|
|
<span class="c1"># try to split by space instead</span>
|
|
<span class="k">try</span><span class="p">:</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">sdesc</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">alias</span> <span class="o">=</span> <span class="p">[</span><span class="n">part</span><span class="o">.</span><span class="n">strip</span><span class="p">()</span> <span class="k">for</span> <span class="n">part</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">args</span><span class="o">.</span><span class="n">split</span><span class="p">(</span><span class="kc">None</span><span class="p">,</span> <span class="mi">1</span><span class="p">)]</span>
|
|
<span class="k">except</span> <span class="ne">ValueError</span><span class="p">:</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">sdesc</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">alias</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">args</span><span class="o">.</span><span class="n">strip</span><span class="p">(),</span> <span class="s2">""</span></div>
|
|
|
|
<div class="viewcode-block" id="CmdRecog.func"><a class="viewcode-back" href="../../../api/evennia.contrib.rpsystem.html#evennia.contrib.rpsystem.CmdRecog.func">[docs]</a> <span class="k">def</span> <span class="nf">func</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
|
|
<span class="s2">"Assign the recog"</span>
|
|
<span class="n">caller</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">caller</span>
|
|
<span class="n">alias</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">alias</span><span class="o">.</span><span class="n">rstrip</span><span class="p">(</span><span class="s2">".?!"</span><span class="p">)</span>
|
|
<span class="n">sdesc</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">sdesc</span>
|
|
|
|
<span class="n">recog_mode</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">cmdstring</span> <span class="o">!=</span> <span class="s2">"forget"</span> <span class="ow">and</span> <span class="n">alias</span> <span class="ow">and</span> <span class="n">sdesc</span>
|
|
<span class="n">forget_mode</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">cmdstring</span> <span class="o">==</span> <span class="s2">"forget"</span> <span class="ow">and</span> <span class="n">sdesc</span>
|
|
<span class="n">list_mode</span> <span class="o">=</span> <span class="ow">not</span> <span class="bp">self</span><span class="o">.</span><span class="n">args</span>
|
|
|
|
<span class="k">if</span> <span class="ow">not</span> <span class="p">(</span><span class="n">recog_mode</span> <span class="ow">or</span> <span class="n">forget_mode</span> <span class="ow">or</span> <span class="n">list_mode</span><span class="p">):</span>
|
|
<span class="n">caller</span><span class="o">.</span><span class="n">msg</span><span class="p">(</span><span class="s2">"Usage: recog, recog <sdesc> as <alias> or forget <alias>"</span><span class="p">)</span>
|
|
<span class="k">return</span>
|
|
|
|
<span class="k">if</span> <span class="n">list_mode</span><span class="p">:</span>
|
|
<span class="c1"># list all previously set recogs</span>
|
|
<span class="n">all_recogs</span> <span class="o">=</span> <span class="n">caller</span><span class="o">.</span><span class="n">recog</span><span class="o">.</span><span class="n">all</span><span class="p">()</span>
|
|
<span class="k">if</span> <span class="ow">not</span> <span class="n">all_recogs</span><span class="p">:</span>
|
|
<span class="n">caller</span><span class="o">.</span><span class="n">msg</span><span class="p">(</span>
|
|
<span class="s2">"You recognize no-one. "</span> <span class="s2">"(Use 'recog <sdesc> as <alias>' to recognize people."</span>
|
|
<span class="p">)</span>
|
|
<span class="k">else</span><span class="p">:</span>
|
|
<span class="c1"># note that we don't skip those failing enable_recog lock here,</span>
|
|
<span class="c1"># because that would actually reveal more than we want.</span>
|
|
<span class="n">lst</span> <span class="o">=</span> <span class="s2">"</span><span class="se">\n</span><span class="s2">"</span><span class="o">.</span><span class="n">join</span><span class="p">(</span>
|
|
<span class="s2">" </span><span class="si">{}</span><span class="s2"> (</span><span class="si">{}</span><span class="s2">)"</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">key</span><span class="p">,</span> <span class="n">obj</span><span class="o">.</span><span class="n">sdesc</span><span class="o">.</span><span class="n">get</span><span class="p">()</span> <span class="k">if</span> <span class="nb">hasattr</span><span class="p">(</span><span class="n">obj</span><span class="p">,</span> <span class="s2">"sdesc"</span><span class="p">)</span> <span class="k">else</span> <span class="n">obj</span><span class="o">.</span><span class="n">key</span><span class="p">)</span>
|
|
<span class="k">for</span> <span class="n">key</span><span class="p">,</span> <span class="n">obj</span> <span class="ow">in</span> <span class="n">all_recogs</span><span class="o">.</span><span class="n">items</span><span class="p">()</span>
|
|
<span class="p">)</span>
|
|
<span class="n">caller</span><span class="o">.</span><span class="n">msg</span><span class="p">(</span>
|
|
<span class="n">f</span><span class="s2">"Currently recognized (use 'recog <sdesc> as <alias>' to add "</span>
|
|
<span class="n">f</span><span class="s2">"new and 'forget <alias>' to remove):</span><span class="se">\n</span><span class="si">{lst}</span><span class="s2">"</span>
|
|
<span class="p">)</span>
|
|
<span class="k">return</span>
|
|
|
|
<span class="n">prefixed_sdesc</span> <span class="o">=</span> <span class="n">sdesc</span> <span class="k">if</span> <span class="n">sdesc</span><span class="o">.</span><span class="n">startswith</span><span class="p">(</span><span class="n">_PREFIX</span><span class="p">)</span> <span class="k">else</span> <span class="n">_PREFIX</span> <span class="o">+</span> <span class="n">sdesc</span>
|
|
<span class="n">candidates</span> <span class="o">=</span> <span class="n">caller</span><span class="o">.</span><span class="n">location</span><span class="o">.</span><span class="n">contents</span>
|
|
<span class="n">matches</span> <span class="o">=</span> <span class="n">parse_sdescs_and_recogs</span><span class="p">(</span><span class="n">caller</span><span class="p">,</span> <span class="n">candidates</span><span class="p">,</span> <span class="n">prefixed_sdesc</span><span class="p">,</span> <span class="n">search_mode</span><span class="o">=</span><span class="kc">True</span><span class="p">)</span>
|
|
<span class="n">nmatches</span> <span class="o">=</span> <span class="nb">len</span><span class="p">(</span><span class="n">matches</span><span class="p">)</span>
|
|
<span class="c1"># handle 0 and >1 matches</span>
|
|
<span class="k">if</span> <span class="n">nmatches</span> <span class="o">==</span> <span class="mi">0</span><span class="p">:</span>
|
|
<span class="n">caller</span><span class="o">.</span><span class="n">msg</span><span class="p">(</span><span class="n">_EMOTE_NOMATCH_ERROR</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">ref</span><span class="o">=</span><span class="n">sdesc</span><span class="p">))</span>
|
|
<span class="k">elif</span> <span class="n">nmatches</span> <span class="o">></span> <span class="mi">1</span><span class="p">:</span>
|
|
<span class="n">reflist</span> <span class="o">=</span> <span class="p">[</span>
|
|
<span class="s2">"</span><span class="si">{}{}{}</span><span class="s2"> (</span><span class="si">{}{}</span><span class="s2">)"</span><span class="o">.</span><span class="n">format</span><span class="p">(</span>
|
|
<span class="n">inum</span> <span class="o">+</span> <span class="mi">1</span><span class="p">,</span>
|
|
<span class="n">_NUM_SEP</span><span class="p">,</span>
|
|
<span class="n">_RE_PREFIX</span><span class="o">.</span><span class="n">sub</span><span class="p">(</span><span class="s2">""</span><span class="p">,</span> <span class="n">sdesc</span><span class="p">),</span>
|
|
<span class="n">caller</span><span class="o">.</span><span class="n">recog</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="n">obj</span><span class="p">),</span>
|
|
<span class="s2">" (</span><span class="si">%s</span><span class="s2">)"</span> <span class="o">%</span> <span class="n">caller</span><span class="o">.</span><span class="n">key</span> <span class="k">if</span> <span class="n">caller</span> <span class="o">==</span> <span class="n">obj</span> <span class="k">else</span> <span class="s2">""</span><span class="p">,</span>
|
|
<span class="p">)</span>
|
|
<span class="k">for</span> <span class="n">inum</span><span class="p">,</span> <span class="n">obj</span> <span class="ow">in</span> <span class="nb">enumerate</span><span class="p">(</span><span class="n">matches</span><span class="p">)</span>
|
|
<span class="p">]</span>
|
|
<span class="n">caller</span><span class="o">.</span><span class="n">msg</span><span class="p">(</span><span class="n">_EMOTE_MULTIMATCH_ERROR</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">ref</span><span class="o">=</span><span class="n">sdesc</span><span class="p">,</span> <span class="n">reflist</span><span class="o">=</span><span class="s2">"</span><span class="se">\n</span><span class="s2"> "</span><span class="o">.</span><span class="n">join</span><span class="p">(</span><span class="n">reflist</span><span class="p">)))</span>
|
|
|
|
<span class="k">else</span><span class="p">:</span>
|
|
<span class="c1"># one single match</span>
|
|
<span class="n">obj</span> <span class="o">=</span> <span class="n">matches</span><span class="p">[</span><span class="mi">0</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">access</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">obj</span><span class="p">,</span> <span class="s2">"enable_recog"</span><span class="p">,</span> <span class="n">default</span><span class="o">=</span><span class="kc">True</span><span class="p">):</span>
|
|
<span class="c1"># don't apply recog if object doesn't allow it (e.g. by being masked).</span>
|
|
<span class="n">caller</span><span class="o">.</span><span class="n">msg</span><span class="p">(</span><span class="s2">"It's impossible to recognize them."</span><span class="p">)</span>
|
|
<span class="k">return</span>
|
|
<span class="k">if</span> <span class="n">forget_mode</span><span class="p">:</span>
|
|
<span class="c1"># remove existing recog</span>
|
|
<span class="n">caller</span><span class="o">.</span><span class="n">recog</span><span class="o">.</span><span class="n">remove</span><span class="p">(</span><span class="n">obj</span><span class="p">)</span>
|
|
<span class="n">caller</span><span class="o">.</span><span class="n">msg</span><span class="p">(</span><span class="s2">"</span><span class="si">%s</span><span class="s2"> will now know them only as '</span><span class="si">%s</span><span class="s2">'."</span> <span class="o">%</span> <span class="p">(</span><span class="n">caller</span><span class="o">.</span><span class="n">key</span><span class="p">,</span> <span class="n">obj</span><span class="o">.</span><span class="n">recog</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="n">obj</span><span class="p">)))</span>
|
|
<span class="k">else</span><span class="p">:</span>
|
|
<span class="c1"># set recog</span>
|
|
<span class="n">sdesc</span> <span class="o">=</span> <span class="n">obj</span><span class="o">.</span><span class="n">sdesc</span><span class="o">.</span><span class="n">get</span><span class="p">()</span> <span class="k">if</span> <span class="nb">hasattr</span><span class="p">(</span><span class="n">obj</span><span class="p">,</span> <span class="s2">"sdesc"</span><span class="p">)</span> <span class="k">else</span> <span class="n">obj</span><span class="o">.</span><span class="n">key</span>
|
|
<span class="k">try</span><span class="p">:</span>
|
|
<span class="n">alias</span> <span class="o">=</span> <span class="n">caller</span><span class="o">.</span><span class="n">recog</span><span class="o">.</span><span class="n">add</span><span class="p">(</span><span class="n">obj</span><span class="p">,</span> <span class="n">alias</span><span class="p">)</span>
|
|
<span class="k">except</span> <span class="n">RecogError</span> <span class="k">as</span> <span class="n">err</span><span class="p">:</span>
|
|
<span class="n">caller</span><span class="o">.</span><span class="n">msg</span><span class="p">(</span><span class="n">err</span><span class="p">)</span>
|
|
<span class="k">return</span>
|
|
<span class="n">caller</span><span class="o">.</span><span class="n">msg</span><span class="p">(</span><span class="s2">"</span><span class="si">%s</span><span class="s2"> will now remember |w</span><span class="si">%s</span><span class="s2">|n as |w</span><span class="si">%s</span><span class="s2">|n."</span> <span class="o">%</span> <span class="p">(</span><span class="n">caller</span><span class="o">.</span><span class="n">key</span><span class="p">,</span> <span class="n">sdesc</span><span class="p">,</span> <span class="n">alias</span><span class="p">))</span></div></div>
|
|
|
|
|
|
<div class="viewcode-block" id="CmdMask"><a class="viewcode-back" href="../../../api/evennia.contrib.rpsystem.html#evennia.contrib.rpsystem.CmdMask">[docs]</a><span class="k">class</span> <span class="nc">CmdMask</span><span class="p">(</span><span class="n">RPCommand</span><span class="p">):</span>
|
|
<span class="sd">"""</span>
|
|
<span class="sd"> Wear a mask</span>
|
|
|
|
<span class="sd"> Usage:</span>
|
|
<span class="sd"> mask <new sdesc></span>
|
|
<span class="sd"> unmask</span>
|
|
|
|
<span class="sd"> This will put on a mask to hide your identity. When wearing</span>
|
|
<span class="sd"> a mask, your sdesc will be replaced by the sdesc you pick and</span>
|
|
<span class="sd"> people's recognitions of you will be disabled.</span>
|
|
|
|
<span class="sd"> """</span>
|
|
|
|
<span class="n">key</span> <span class="o">=</span> <span class="s2">"mask"</span>
|
|
<span class="n">aliases</span> <span class="o">=</span> <span class="p">[</span><span class="s2">"unmask"</span><span class="p">]</span>
|
|
|
|
<div class="viewcode-block" id="CmdMask.func"><a class="viewcode-back" href="../../../api/evennia.contrib.rpsystem.html#evennia.contrib.rpsystem.CmdMask.func">[docs]</a> <span class="k">def</span> <span class="nf">func</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
|
|
<span class="n">caller</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">caller</span>
|
|
<span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">cmdstring</span> <span class="o">==</span> <span class="s2">"mask"</span><span class="p">:</span>
|
|
<span class="c1"># wear a mask</span>
|
|
<span class="k">if</span> <span class="ow">not</span> <span class="bp">self</span><span class="o">.</span><span class="n">args</span><span class="p">:</span>
|
|
<span class="n">caller</span><span class="o">.</span><span class="n">msg</span><span class="p">(</span><span class="s2">"Usage: (un)mask sdesc"</span><span class="p">)</span>
|
|
<span class="k">return</span>
|
|
<span class="k">if</span> <span class="n">caller</span><span class="o">.</span><span class="n">db</span><span class="o">.</span><span class="n">unmasked_sdesc</span><span class="p">:</span>
|
|
<span class="n">caller</span><span class="o">.</span><span class="n">msg</span><span class="p">(</span><span class="s2">"You are already wearing a mask."</span><span class="p">)</span>
|
|
<span class="k">return</span>
|
|
<span class="n">sdesc</span> <span class="o">=</span> <span class="n">_RE_CHAREND</span><span class="o">.</span><span class="n">sub</span><span class="p">(</span><span class="s2">""</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">args</span><span class="p">)</span>
|
|
<span class="n">sdesc</span> <span class="o">=</span> <span class="s2">"</span><span class="si">%s</span><span class="s2"> |H[masked]|n"</span> <span class="o">%</span> <span class="n">sdesc</span>
|
|
<span class="k">if</span> <span class="nb">len</span><span class="p">(</span><span class="n">sdesc</span><span class="p">)</span> <span class="o">></span> <span class="mi">60</span><span class="p">:</span>
|
|
<span class="n">caller</span><span class="o">.</span><span class="n">msg</span><span class="p">(</span><span class="s2">"Your masked sdesc is too long."</span><span class="p">)</span>
|
|
<span class="k">return</span>
|
|
<span class="n">caller</span><span class="o">.</span><span class="n">db</span><span class="o">.</span><span class="n">unmasked_sdesc</span> <span class="o">=</span> <span class="n">caller</span><span class="o">.</span><span class="n">sdesc</span><span class="o">.</span><span class="n">get</span><span class="p">()</span>
|
|
<span class="n">caller</span><span class="o">.</span><span class="n">locks</span><span class="o">.</span><span class="n">add</span><span class="p">(</span><span class="s2">"enable_recog:false()"</span><span class="p">)</span>
|
|
<span class="n">caller</span><span class="o">.</span><span class="n">sdesc</span><span class="o">.</span><span class="n">add</span><span class="p">(</span><span class="n">sdesc</span><span class="p">)</span>
|
|
<span class="n">caller</span><span class="o">.</span><span class="n">msg</span><span class="p">(</span><span class="s2">"You wear a mask as '</span><span class="si">%s</span><span class="s2">'."</span> <span class="o">%</span> <span class="n">sdesc</span><span class="p">)</span>
|
|
<span class="k">else</span><span class="p">:</span>
|
|
<span class="c1"># unmask</span>
|
|
<span class="n">old_sdesc</span> <span class="o">=</span> <span class="n">caller</span><span class="o">.</span><span class="n">db</span><span class="o">.</span><span class="n">unmasked_sdesc</span>
|
|
<span class="k">if</span> <span class="ow">not</span> <span class="n">old_sdesc</span><span class="p">:</span>
|
|
<span class="n">caller</span><span class="o">.</span><span class="n">msg</span><span class="p">(</span><span class="s2">"You are not wearing a mask."</span><span class="p">)</span>
|
|
<span class="k">return</span>
|
|
<span class="k">del</span> <span class="n">caller</span><span class="o">.</span><span class="n">db</span><span class="o">.</span><span class="n">unmasked_sdesc</span>
|
|
<span class="n">caller</span><span class="o">.</span><span class="n">locks</span><span class="o">.</span><span class="n">remove</span><span class="p">(</span><span class="s2">"enable_recog"</span><span class="p">)</span>
|
|
<span class="n">caller</span><span class="o">.</span><span class="n">sdesc</span><span class="o">.</span><span class="n">add</span><span class="p">(</span><span class="n">old_sdesc</span><span class="p">)</span>
|
|
<span class="n">caller</span><span class="o">.</span><span class="n">msg</span><span class="p">(</span><span class="s2">"You remove your mask and are again '</span><span class="si">%s</span><span class="s2">'."</span> <span class="o">%</span> <span class="n">old_sdesc</span><span class="p">)</span></div></div>
|
|
|
|
|
|
<div class="viewcode-block" id="RPSystemCmdSet"><a class="viewcode-back" href="../../../api/evennia.contrib.rpsystem.html#evennia.contrib.rpsystem.RPSystemCmdSet">[docs]</a><span class="k">class</span> <span class="nc">RPSystemCmdSet</span><span class="p">(</span><span class="n">CmdSet</span><span class="p">):</span>
|
|
<span class="sd">"""</span>
|
|
<span class="sd"> Mix-in for adding rp-commands to default cmdset.</span>
|
|
<span class="sd"> """</span>
|
|
|
|
<div class="viewcode-block" id="RPSystemCmdSet.at_cmdset_creation"><a class="viewcode-back" href="../../../api/evennia.contrib.rpsystem.html#evennia.contrib.rpsystem.RPSystemCmdSet.at_cmdset_creation">[docs]</a> <span class="k">def</span> <span class="nf">at_cmdset_creation</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">add</span><span class="p">(</span><span class="n">CmdEmote</span><span class="p">())</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">add</span><span class="p">(</span><span class="n">CmdSay</span><span class="p">())</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">add</span><span class="p">(</span><span class="n">CmdSdesc</span><span class="p">())</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">add</span><span class="p">(</span><span class="n">CmdPose</span><span class="p">())</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">add</span><span class="p">(</span><span class="n">CmdRecog</span><span class="p">())</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">add</span><span class="p">(</span><span class="n">CmdMask</span><span class="p">())</span></div></div>
|
|
|
|
|
|
<span class="c1"># ------------------------------------------------------------</span>
|
|
<span class="c1"># RP typeclasses</span>
|
|
<span class="c1"># ------------------------------------------------------------</span>
|
|
|
|
|
|
<div class="viewcode-block" id="ContribRPObject"><a class="viewcode-back" href="../../../api/evennia.contrib.rpsystem.html#evennia.contrib.rpsystem.ContribRPObject">[docs]</a><span class="k">class</span> <span class="nc">ContribRPObject</span><span class="p">(</span><span class="n">DefaultObject</span><span class="p">):</span>
|
|
<span class="sd">"""</span>
|
|
<span class="sd"> This class is meant as a mix-in or parent for objects in an</span>
|
|
<span class="sd"> rp-heavy game. It implements the base functionality for poses.</span>
|
|
<span class="sd"> """</span>
|
|
|
|
<div class="viewcode-block" id="ContribRPObject.at_object_creation"><a class="viewcode-back" href="../../../api/evennia.contrib.rpsystem.html#evennia.contrib.rpsystem.ContribRPObject.at_object_creation">[docs]</a> <span class="k">def</span> <span class="nf">at_object_creation</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
|
|
<span class="sd">"""</span>
|
|
<span class="sd"> Called at initial creation.</span>
|
|
<span class="sd"> """</span>
|
|
<span class="nb">super</span><span class="p">()</span><span class="o">.</span><span class="n">at_object_creation</span><span class="p">()</span>
|
|
|
|
<span class="c1"># emoting/recog data</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">db</span><span class="o">.</span><span class="n">pose</span> <span class="o">=</span> <span class="s2">""</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">db</span><span class="o">.</span><span class="n">pose_default</span> <span class="o">=</span> <span class="s2">"is here."</span></div>
|
|
|
|
<div class="viewcode-block" id="ContribRPObject.search"><a class="viewcode-back" href="../../../api/evennia.contrib.rpsystem.html#evennia.contrib.rpsystem.ContribRPObject.search">[docs]</a> <span class="k">def</span> <span class="nf">search</span><span class="p">(</span>
|
|
<span class="bp">self</span><span class="p">,</span>
|
|
<span class="n">searchdata</span><span class="p">,</span>
|
|
<span class="n">global_search</span><span class="o">=</span><span class="kc">False</span><span class="p">,</span>
|
|
<span class="n">use_nicks</span><span class="o">=</span><span class="kc">True</span><span class="p">,</span>
|
|
<span class="n">typeclass</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span>
|
|
<span class="n">location</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span>
|
|
<span class="n">attribute_name</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span>
|
|
<span class="n">quiet</span><span class="o">=</span><span class="kc">False</span><span class="p">,</span>
|
|
<span class="n">exact</span><span class="o">=</span><span class="kc">False</span><span class="p">,</span>
|
|
<span class="n">candidates</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span>
|
|
<span class="n">nofound_string</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span>
|
|
<span class="n">multimatch_string</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span>
|
|
<span class="n">use_dbref</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span>
|
|
<span class="p">):</span>
|
|
<span class="sd">"""</span>
|
|
<span class="sd"> Returns an Object matching a search string/condition, taking</span>
|
|
<span class="sd"> sdescs into account.</span>
|
|
|
|
<span class="sd"> Perform a standard object search in the database, handling</span>
|
|
<span class="sd"> multiple results and lack thereof gracefully. By default, only</span>
|
|
<span class="sd"> objects in the current `location` of `self` or its inventory are searched for.</span>
|
|
|
|
<span class="sd"> Args:</span>
|
|
<span class="sd"> searchdata (str or obj): Primary search criterion. Will be matched</span>
|
|
<span class="sd"> against `object.key` (with `object.aliases` second) unless</span>
|
|
<span class="sd"> the keyword attribute_name specifies otherwise.</span>
|
|
<span class="sd"> **Special strings:**</span>
|
|
<span class="sd"> - `#<num>`: search by unique dbref. This is always</span>
|
|
<span class="sd"> a global search.</span>
|
|
<span class="sd"> - `me,self`: self-reference to this object</span>
|
|
<span class="sd"> - `<num>-<string>` - can be used to differentiate</span>
|
|
<span class="sd"> between multiple same-named matches</span>
|
|
<span class="sd"> global_search (bool): Search all objects globally. This is overruled</span>
|
|
<span class="sd"> by `location` keyword.</span>
|
|
<span class="sd"> use_nicks (bool): Use nickname-replace (nicktype "object") on `searchdata`.</span>
|
|
<span class="sd"> typeclass (str or Typeclass, or list of either): Limit search only</span>
|
|
<span class="sd"> to `Objects` with this typeclass. May be a list of typeclasses</span>
|
|
<span class="sd"> for a broader search.</span>
|
|
<span class="sd"> location (Object or list): Specify a location or multiple locations</span>
|
|
<span class="sd"> to search. Note that this is used to query the *contents* of a</span>
|
|
<span class="sd"> location and will not match for the location itself -</span>
|
|
<span class="sd"> if you want that, don't set this or use `candidates` to specify</span>
|
|
<span class="sd"> exactly which objects should be searched.</span>
|
|
<span class="sd"> attribute_name (str): Define which property to search. If set, no</span>
|
|
<span class="sd"> key+alias search will be performed. This can be used</span>
|
|
<span class="sd"> to search database fields (db_ will be automatically</span>
|
|
<span class="sd"> appended), and if that fails, it will try to return</span>
|
|
<span class="sd"> objects having Attributes with this name and value</span>
|
|
<span class="sd"> equal to searchdata. A special use is to search for</span>
|
|
<span class="sd"> "key" here if you want to do a key-search without</span>
|
|
<span class="sd"> including aliases.</span>
|
|
<span class="sd"> quiet (bool): don't display default error messages - this tells the</span>
|
|
<span class="sd"> search method that the user wants to handle all errors</span>
|
|
<span class="sd"> themselves. It also changes the return value type, see</span>
|
|
<span class="sd"> below.</span>
|
|
<span class="sd"> exact (bool): if unset (default) - prefers to match to beginning of</span>
|
|
<span class="sd"> string rather than not matching at all. If set, requires</span>
|
|
<span class="sd"> exact matching of entire string.</span>
|
|
<span class="sd"> candidates (list of objects): this is an optional custom list of objects</span>
|
|
<span class="sd"> to search (filter) between. It is ignored if `global_search`</span>
|
|
<span class="sd"> is given. If not set, this list will automatically be defined</span>
|
|
<span class="sd"> to include the location, the contents of location and the</span>
|
|
<span class="sd"> caller's contents (inventory).</span>
|
|
<span class="sd"> nofound_string (str): optional custom string for not-found error message.</span>
|
|
<span class="sd"> multimatch_string (str): optional custom string for multimatch error header.</span>
|
|
<span class="sd"> use_dbref (bool or None): If None, only turn off use_dbref if we are of a lower</span>
|
|
<span class="sd"> permission than Builder. Otherwise, honor the True/False value.</span>
|
|
|
|
<span class="sd"> Returns:</span>
|
|
<span class="sd"> match (Object, None or list): will return an Object/None if `quiet=False`,</span>
|
|
<span class="sd"> otherwise it will return a list of 0, 1 or more matches.</span>
|
|
|
|
<span class="sd"> Notes:</span>
|
|
<span class="sd"> To find Accounts, use eg. `evennia.account_search`. If</span>
|
|
<span class="sd"> `quiet=False`, error messages will be handled by</span>
|
|
<span class="sd"> `settings.SEARCH_AT_RESULT` and echoed automatically (on</span>
|
|
<span class="sd"> error, return will be `None`). If `quiet=True`, the error</span>
|
|
<span class="sd"> messaging is assumed to be handled by the caller.</span>
|
|
|
|
<span class="sd"> """</span>
|
|
<span class="n">is_string</span> <span class="o">=</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">searchdata</span><span class="p">,</span> <span class="nb">str</span><span class="p">)</span>
|
|
|
|
<span class="k">if</span> <span class="n">is_string</span><span class="p">:</span>
|
|
<span class="c1"># searchdata is a string; wrap some common self-references</span>
|
|
<span class="k">if</span> <span class="n">searchdata</span><span class="o">.</span><span class="n">lower</span><span class="p">()</span> <span class="ow">in</span> <span class="p">(</span><span class="s2">"here"</span><span class="p">,):</span>
|
|
<span class="k">return</span> <span class="p">[</span><span class="bp">self</span><span class="o">.</span><span class="n">location</span><span class="p">]</span> <span class="k">if</span> <span class="n">quiet</span> <span class="k">else</span> <span class="bp">self</span><span class="o">.</span><span class="n">location</span>
|
|
<span class="k">if</span> <span class="n">searchdata</span><span class="o">.</span><span class="n">lower</span><span class="p">()</span> <span class="ow">in</span> <span class="p">(</span><span class="s2">"me"</span><span class="p">,</span> <span class="s2">"self"</span><span class="p">):</span>
|
|
<span class="k">return</span> <span class="p">[</span><span class="bp">self</span><span class="p">]</span> <span class="k">if</span> <span class="n">quiet</span> <span class="k">else</span> <span class="bp">self</span>
|
|
|
|
<span class="k">if</span> <span class="n">use_nicks</span><span class="p">:</span>
|
|
<span class="c1"># do nick-replacement on search</span>
|
|
<span class="n">searchdata</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">nicks</span><span class="o">.</span><span class="n">nickreplace</span><span class="p">(</span>
|
|
<span class="n">searchdata</span><span class="p">,</span> <span class="n">categories</span><span class="o">=</span><span class="p">(</span><span class="s2">"object"</span><span class="p">,</span> <span class="s2">"account"</span><span class="p">),</span> <span class="n">include_account</span><span class="o">=</span><span class="kc">True</span>
|
|
<span class="p">)</span>
|
|
|
|
<span class="k">if</span> <span class="n">global_search</span> <span class="ow">or</span> <span class="p">(</span>
|
|
<span class="n">is_string</span>
|
|
<span class="ow">and</span> <span class="n">searchdata</span><span class="o">.</span><span class="n">startswith</span><span class="p">(</span><span class="s2">"#"</span><span class="p">)</span>
|
|
<span class="ow">and</span> <span class="nb">len</span><span class="p">(</span><span class="n">searchdata</span><span class="p">)</span> <span class="o">></span> <span class="mi">1</span>
|
|
<span class="ow">and</span> <span class="n">searchdata</span><span class="p">[</span><span class="mi">1</span><span class="p">:]</span><span class="o">.</span><span class="n">isdigit</span><span class="p">()</span>
|
|
<span class="p">):</span>
|
|
<span class="c1"># only allow exact matching if searching the entire database</span>
|
|
<span class="c1"># or unique #dbrefs</span>
|
|
<span class="n">exact</span> <span class="o">=</span> <span class="kc">True</span>
|
|
<span class="k">elif</span> <span class="n">candidates</span> <span class="ow">is</span> <span class="kc">None</span><span class="p">:</span>
|
|
<span class="c1"># no custom candidates given - get them automatically</span>
|
|
<span class="k">if</span> <span class="n">location</span><span class="p">:</span>
|
|
<span class="c1"># location(s) were given</span>
|
|
<span class="n">candidates</span> <span class="o">=</span> <span class="p">[]</span>
|
|
<span class="k">for</span> <span class="n">obj</span> <span class="ow">in</span> <span class="n">make_iter</span><span class="p">(</span><span class="n">location</span><span class="p">):</span>
|
|
<span class="n">candidates</span><span class="o">.</span><span class="n">extend</span><span class="p">(</span><span class="n">obj</span><span class="o">.</span><span class="n">contents</span><span class="p">)</span>
|
|
<span class="k">else</span><span class="p">:</span>
|
|
<span class="c1"># local search. Candidates are taken from</span>
|
|
<span class="c1"># self.contents, self.location and</span>
|
|
<span class="c1"># self.location.contents</span>
|
|
<span class="n">location</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">location</span>
|
|
<span class="n">candidates</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">contents</span>
|
|
<span class="k">if</span> <span class="n">location</span><span class="p">:</span>
|
|
<span class="n">candidates</span> <span class="o">=</span> <span class="n">candidates</span> <span class="o">+</span> <span class="p">[</span><span class="n">location</span><span class="p">]</span> <span class="o">+</span> <span class="n">location</span><span class="o">.</span><span class="n">contents</span>
|
|
<span class="k">else</span><span class="p">:</span>
|
|
<span class="c1"># normally we don't need this since we are</span>
|
|
<span class="c1"># included in location.contents</span>
|
|
<span class="n">candidates</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="bp">self</span><span class="p">)</span>
|
|
|
|
<span class="c1"># the sdesc-related substitution</span>
|
|
<span class="n">is_builder</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">locks</span><span class="o">.</span><span class="n">check_lockstring</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="s2">"perm(Builder)"</span><span class="p">)</span>
|
|
<span class="n">use_dbref</span> <span class="o">=</span> <span class="n">is_builder</span> <span class="k">if</span> <span class="n">use_dbref</span> <span class="ow">is</span> <span class="kc">None</span> <span class="k">else</span> <span class="n">use_dbref</span>
|
|
|
|
<span class="k">def</span> <span class="nf">search_obj</span><span class="p">(</span><span class="n">string</span><span class="p">):</span>
|
|
<span class="s2">"helper wrapper for searching"</span>
|
|
<span class="k">return</span> <span class="n">ObjectDB</span><span class="o">.</span><span class="n">objects</span><span class="o">.</span><span class="n">object_search</span><span class="p">(</span>
|
|
<span class="n">string</span><span class="p">,</span>
|
|
<span class="n">attribute_name</span><span class="o">=</span><span class="n">attribute_name</span><span class="p">,</span>
|
|
<span class="n">typeclass</span><span class="o">=</span><span class="n">typeclass</span><span class="p">,</span>
|
|
<span class="n">candidates</span><span class="o">=</span><span class="n">candidates</span><span class="p">,</span>
|
|
<span class="n">exact</span><span class="o">=</span><span class="n">exact</span><span class="p">,</span>
|
|
<span class="n">use_dbref</span><span class="o">=</span><span class="n">use_dbref</span><span class="p">,</span>
|
|
<span class="p">)</span>
|
|
|
|
<span class="k">if</span> <span class="n">candidates</span><span class="p">:</span>
|
|
<span class="n">candidates</span> <span class="o">=</span> <span class="n">parse_sdescs_and_recogs</span><span class="p">(</span>
|
|
<span class="bp">self</span><span class="p">,</span> <span class="n">candidates</span><span class="p">,</span> <span class="n">_PREFIX</span> <span class="o">+</span> <span class="n">searchdata</span><span class="p">,</span> <span class="n">search_mode</span><span class="o">=</span><span class="kc">True</span>
|
|
<span class="p">)</span>
|
|
<span class="n">results</span> <span class="o">=</span> <span class="p">[]</span>
|
|
<span class="k">for</span> <span class="n">candidate</span> <span class="ow">in</span> <span class="n">candidates</span><span class="p">:</span>
|
|
<span class="c1"># we search by candidate keys here; this allows full error</span>
|
|
<span class="c1"># management and use of all kwargs - we will use searchdata</span>
|
|
<span class="c1"># in eventual error reporting later (not their keys). Doing</span>
|
|
<span class="c1"># it like this e.g. allows for use of the typeclass kwarg</span>
|
|
<span class="c1"># limiter.</span>
|
|
<span class="n">results</span><span class="o">.</span><span class="n">extend</span><span class="p">([</span><span class="n">obj</span> <span class="k">for</span> <span class="n">obj</span> <span class="ow">in</span> <span class="n">search_obj</span><span class="p">(</span><span class="n">candidate</span><span class="o">.</span><span class="n">key</span><span class="p">)</span> <span class="k">if</span> <span class="n">obj</span> <span class="ow">not</span> <span class="ow">in</span> <span class="n">results</span><span class="p">])</span>
|
|
|
|
<span class="k">if</span> <span class="ow">not</span> <span class="n">results</span> <span class="ow">and</span> <span class="n">is_builder</span><span class="p">:</span>
|
|
<span class="c1"># builders get a chance to search only by key+alias</span>
|
|
<span class="n">results</span> <span class="o">=</span> <span class="n">search_obj</span><span class="p">(</span><span class="n">searchdata</span><span class="p">)</span>
|
|
<span class="k">else</span><span class="p">:</span>
|
|
<span class="c1"># global searches / #drefs end up here. Global searches are</span>
|
|
<span class="c1"># only done in code, so is controlled, #dbrefs are turned off</span>
|
|
<span class="c1"># for non-Builders.</span>
|
|
<span class="n">results</span> <span class="o">=</span> <span class="n">search_obj</span><span class="p">(</span><span class="n">searchdata</span><span class="p">)</span>
|
|
|
|
<span class="k">if</span> <span class="n">quiet</span><span class="p">:</span>
|
|
<span class="k">return</span> <span class="n">results</span>
|
|
<span class="k">return</span> <span class="n">_AT_SEARCH_RESULT</span><span class="p">(</span>
|
|
<span class="n">results</span><span class="p">,</span>
|
|
<span class="bp">self</span><span class="p">,</span>
|
|
<span class="n">query</span><span class="o">=</span><span class="n">searchdata</span><span class="p">,</span>
|
|
<span class="n">nofound_string</span><span class="o">=</span><span class="n">nofound_string</span><span class="p">,</span>
|
|
<span class="n">multimatch_string</span><span class="o">=</span><span class="n">multimatch_string</span><span class="p">,</span>
|
|
<span class="p">)</span></div>
|
|
|
|
<div class="viewcode-block" id="ContribRPObject.get_display_name"><a class="viewcode-back" href="../../../api/evennia.contrib.rpsystem.html#evennia.contrib.rpsystem.ContribRPObject.get_display_name">[docs]</a> <span class="k">def</span> <span class="nf">get_display_name</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">looker</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">):</span>
|
|
<span class="sd">"""</span>
|
|
<span class="sd"> Displays the name of the object in a viewer-aware manner.</span>
|
|
|
|
<span class="sd"> Args:</span>
|
|
<span class="sd"> looker (TypedObject): The object or account that is looking</span>
|
|
<span class="sd"> at/getting inforamtion for this object.</span>
|
|
|
|
<span class="sd"> Keyword Args:</span>
|
|
<span class="sd"> pose (bool): Include the pose (if available) in the return.</span>
|
|
|
|
<span class="sd"> Returns:</span>
|
|
<span class="sd"> name (str): A string of the sdesc containing the name of the object,</span>
|
|
<span class="sd"> if this is defined.</span>
|
|
<span class="sd"> including the DBREF if this user is privileged to control</span>
|
|
<span class="sd"> said object.</span>
|
|
|
|
<span class="sd"> Notes:</span>
|
|
<span class="sd"> The RPObject version doesn't add color to its display.</span>
|
|
|
|
<span class="sd"> """</span>
|
|
<span class="n">idstr</span> <span class="o">=</span> <span class="s2">"(#</span><span class="si">%s</span><span class="s2">)"</span> <span class="o">%</span> <span class="bp">self</span><span class="o">.</span><span class="n">id</span> <span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">access</span><span class="p">(</span><span class="n">looker</span><span class="p">,</span> <span class="n">access_type</span><span class="o">=</span><span class="s2">"control"</span><span class="p">)</span> <span class="k">else</span> <span class="s2">""</span>
|
|
<span class="k">if</span> <span class="n">looker</span> <span class="o">==</span> <span class="bp">self</span><span class="p">:</span>
|
|
<span class="n">sdesc</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">key</span>
|
|
<span class="k">else</span><span class="p">:</span>
|
|
<span class="k">try</span><span class="p">:</span>
|
|
<span class="n">recog</span> <span class="o">=</span> <span class="n">looker</span><span class="o">.</span><span class="n">recog</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="bp">self</span><span class="p">)</span>
|
|
<span class="k">except</span> <span class="ne">AttributeError</span><span class="p">:</span>
|
|
<span class="n">recog</span> <span class="o">=</span> <span class="kc">None</span>
|
|
<span class="n">sdesc</span> <span class="o">=</span> <span class="n">recog</span> <span class="ow">or</span> <span class="p">(</span><span class="nb">hasattr</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="s2">"sdesc"</span><span class="p">)</span> <span class="ow">and</span> <span class="bp">self</span><span class="o">.</span><span class="n">sdesc</span><span class="o">.</span><span class="n">get</span><span class="p">())</span> <span class="ow">or</span> <span class="bp">self</span><span class="o">.</span><span class="n">key</span>
|
|
<span class="n">pose</span> <span class="o">=</span> <span class="s2">" </span><span class="si">%s</span><span class="s2">"</span> <span class="o">%</span> <span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">db</span><span class="o">.</span><span class="n">pose</span> <span class="ow">or</span> <span class="s2">""</span><span class="p">)</span> <span class="k">if</span> <span class="n">kwargs</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s2">"pose"</span><span class="p">,</span> <span class="kc">False</span><span class="p">)</span> <span class="k">else</span> <span class="s2">""</span>
|
|
<span class="k">return</span> <span class="s2">"</span><span class="si">%s%s%s</span><span class="s2">"</span> <span class="o">%</span> <span class="p">(</span><span class="n">sdesc</span><span class="p">,</span> <span class="n">idstr</span><span class="p">,</span> <span class="n">pose</span><span class="p">)</span></div>
|
|
|
|
<div class="viewcode-block" id="ContribRPObject.return_appearance"><a class="viewcode-back" href="../../../api/evennia.contrib.rpsystem.html#evennia.contrib.rpsystem.ContribRPObject.return_appearance">[docs]</a> <span class="k">def</span> <span class="nf">return_appearance</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">looker</span><span class="p">):</span>
|
|
<span class="sd">"""</span>
|
|
<span class="sd"> This formats a description. It is the hook a 'look' command</span>
|
|
<span class="sd"> should call.</span>
|
|
|
|
<span class="sd"> Args:</span>
|
|
<span class="sd"> looker (Object): Object doing the looking.</span>
|
|
<span class="sd"> """</span>
|
|
<span class="k">if</span> <span class="ow">not</span> <span class="n">looker</span><span class="p">:</span>
|
|
<span class="k">return</span> <span class="s2">""</span>
|
|
<span class="c1"># get and identify all objects</span>
|
|
<span class="n">visible</span> <span class="o">=</span> <span class="p">(</span><span class="n">con</span> <span class="k">for</span> <span class="n">con</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">contents</span> <span class="k">if</span> <span class="n">con</span> <span class="o">!=</span> <span class="n">looker</span> <span class="ow">and</span> <span class="n">con</span><span class="o">.</span><span class="n">access</span><span class="p">(</span><span class="n">looker</span><span class="p">,</span> <span class="s2">"view"</span><span class="p">))</span>
|
|
<span class="n">exits</span><span class="p">,</span> <span class="n">users</span><span class="p">,</span> <span class="n">things</span> <span class="o">=</span> <span class="p">[],</span> <span class="p">[],</span> <span class="p">[]</span>
|
|
<span class="k">for</span> <span class="n">con</span> <span class="ow">in</span> <span class="n">visible</span><span class="p">:</span>
|
|
<span class="n">key</span> <span class="o">=</span> <span class="n">con</span><span class="o">.</span><span class="n">get_display_name</span><span class="p">(</span><span class="n">looker</span><span class="p">,</span> <span class="n">pose</span><span class="o">=</span><span class="kc">True</span><span class="p">)</span>
|
|
<span class="k">if</span> <span class="n">con</span><span class="o">.</span><span class="n">destination</span><span class="p">:</span>
|
|
<span class="n">exits</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">key</span><span class="p">)</span>
|
|
<span class="k">elif</span> <span class="n">con</span><span class="o">.</span><span class="n">has_account</span><span class="p">:</span>
|
|
<span class="n">users</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">key</span><span class="p">)</span>
|
|
<span class="k">else</span><span class="p">:</span>
|
|
<span class="n">things</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">key</span><span class="p">)</span>
|
|
<span class="c1"># get description, build string</span>
|
|
<span class="n">string</span> <span class="o">=</span> <span class="s2">"|c</span><span class="si">%s</span><span class="s2">|n</span><span class="se">\n</span><span class="s2">"</span> <span class="o">%</span> <span class="bp">self</span><span class="o">.</span><span class="n">get_display_name</span><span class="p">(</span><span class="n">looker</span><span class="p">,</span> <span class="n">pose</span><span class="o">=</span><span class="kc">True</span><span class="p">)</span>
|
|
<span class="n">desc</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">db</span><span class="o">.</span><span class="n">desc</span>
|
|
<span class="k">if</span> <span class="n">desc</span><span class="p">:</span>
|
|
<span class="n">string</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">desc</span>
|
|
<span class="k">if</span> <span class="n">exits</span><span class="p">:</span>
|
|
<span class="n">string</span> <span class="o">+=</span> <span class="s2">"</span><span class="se">\n</span><span class="s2">|wExits:|n "</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">exits</span><span class="p">)</span>
|
|
<span class="k">if</span> <span class="n">users</span> <span class="ow">or</span> <span class="n">things</span><span class="p">:</span>
|
|
<span class="n">string</span> <span class="o">+=</span> <span class="s2">"</span><span class="se">\n</span><span class="s2"> "</span> <span class="o">+</span> <span class="s2">"</span><span class="se">\n</span><span class="s2"> "</span><span class="o">.</span><span class="n">join</span><span class="p">(</span><span class="n">users</span> <span class="o">+</span> <span class="n">things</span><span class="p">)</span>
|
|
<span class="k">return</span> <span class="n">string</span></div></div>
|
|
|
|
|
|
<div class="viewcode-block" id="ContribRPRoom"><a class="viewcode-back" href="../../../api/evennia.contrib.rpsystem.html#evennia.contrib.rpsystem.ContribRPRoom">[docs]</a><span class="k">class</span> <span class="nc">ContribRPRoom</span><span class="p">(</span><span class="n">ContribRPObject</span><span class="p">):</span>
|
|
<span class="sd">"""</span>
|
|
<span class="sd"> Dummy inheritance for rooms.</span>
|
|
<span class="sd"> """</span>
|
|
|
|
<span class="k">pass</span></div>
|
|
|
|
|
|
<div class="viewcode-block" id="ContribRPCharacter"><a class="viewcode-back" href="../../../api/evennia.contrib.rpsystem.html#evennia.contrib.rpsystem.ContribRPCharacter">[docs]</a><span class="k">class</span> <span class="nc">ContribRPCharacter</span><span class="p">(</span><span class="n">DefaultCharacter</span><span class="p">,</span> <span class="n">ContribRPObject</span><span class="p">):</span>
|
|
<span class="sd">"""</span>
|
|
<span class="sd"> This is a character class that has poses, sdesc and recog.</span>
|
|
<span class="sd"> """</span>
|
|
|
|
<span class="c1"># Handlers</span>
|
|
<div class="viewcode-block" id="ContribRPCharacter.sdesc"><a class="viewcode-back" href="../../../api/evennia.contrib.rpsystem.html#evennia.contrib.rpsystem.ContribRPCharacter.sdesc">[docs]</a> <span class="nd">@lazy_property</span>
|
|
<span class="k">def</span> <span class="nf">sdesc</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
|
|
<span class="k">return</span> <span class="n">SdescHandler</span><span class="p">(</span><span class="bp">self</span><span class="p">)</span></div>
|
|
|
|
<div class="viewcode-block" id="ContribRPCharacter.recog"><a class="viewcode-back" href="../../../api/evennia.contrib.rpsystem.html#evennia.contrib.rpsystem.ContribRPCharacter.recog">[docs]</a> <span class="nd">@lazy_property</span>
|
|
<span class="k">def</span> <span class="nf">recog</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
|
|
<span class="k">return</span> <span class="n">RecogHandler</span><span class="p">(</span><span class="bp">self</span><span class="p">)</span></div>
|
|
|
|
<div class="viewcode-block" id="ContribRPCharacter.get_display_name"><a class="viewcode-back" href="../../../api/evennia.contrib.rpsystem.html#evennia.contrib.rpsystem.ContribRPCharacter.get_display_name">[docs]</a> <span class="k">def</span> <span class="nf">get_display_name</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">looker</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">):</span>
|
|
<span class="sd">"""</span>
|
|
<span class="sd"> Displays the name of the object in a viewer-aware manner.</span>
|
|
|
|
<span class="sd"> Args:</span>
|
|
<span class="sd"> looker (TypedObject): The object or account that is looking</span>
|
|
<span class="sd"> at/getting inforamtion for this object.</span>
|
|
|
|
<span class="sd"> Keyword Args:</span>
|
|
<span class="sd"> pose (bool): Include the pose (if available) in the return.</span>
|
|
|
|
<span class="sd"> Returns:</span>
|
|
<span class="sd"> name (str): A string of the sdesc containing the name of the object,</span>
|
|
<span class="sd"> if this is defined.</span>
|
|
<span class="sd"> including the DBREF if this user is privileged to control</span>
|
|
<span class="sd"> said object.</span>
|
|
|
|
<span class="sd"> Notes:</span>
|
|
<span class="sd"> The RPCharacter version of this method colors its display to make</span>
|
|
<span class="sd"> characters stand out from other objects.</span>
|
|
|
|
<span class="sd"> """</span>
|
|
<span class="n">idstr</span> <span class="o">=</span> <span class="s2">"(#</span><span class="si">%s</span><span class="s2">)"</span> <span class="o">%</span> <span class="bp">self</span><span class="o">.</span><span class="n">id</span> <span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">access</span><span class="p">(</span><span class="n">looker</span><span class="p">,</span> <span class="n">access_type</span><span class="o">=</span><span class="s2">"control"</span><span class="p">)</span> <span class="k">else</span> <span class="s2">""</span>
|
|
<span class="k">if</span> <span class="n">looker</span> <span class="o">==</span> <span class="bp">self</span><span class="p">:</span>
|
|
<span class="n">sdesc</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">key</span>
|
|
<span class="k">else</span><span class="p">:</span>
|
|
<span class="k">try</span><span class="p">:</span>
|
|
<span class="n">recog</span> <span class="o">=</span> <span class="n">looker</span><span class="o">.</span><span class="n">recog</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="bp">self</span><span class="p">)</span>
|
|
<span class="k">except</span> <span class="ne">AttributeError</span><span class="p">:</span>
|
|
<span class="n">recog</span> <span class="o">=</span> <span class="kc">None</span>
|
|
<span class="n">sdesc</span> <span class="o">=</span> <span class="n">recog</span> <span class="ow">or</span> <span class="p">(</span><span class="nb">hasattr</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="s2">"sdesc"</span><span class="p">)</span> <span class="ow">and</span> <span class="bp">self</span><span class="o">.</span><span class="n">sdesc</span><span class="o">.</span><span class="n">get</span><span class="p">())</span> <span class="ow">or</span> <span class="bp">self</span><span class="o">.</span><span class="n">key</span>
|
|
<span class="n">pose</span> <span class="o">=</span> <span class="s2">" </span><span class="si">%s</span><span class="s2">"</span> <span class="o">%</span> <span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">db</span><span class="o">.</span><span class="n">pose</span> <span class="ow">or</span> <span class="s2">"is here."</span><span class="p">)</span> <span class="k">if</span> <span class="n">kwargs</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s2">"pose"</span><span class="p">,</span> <span class="kc">False</span><span class="p">)</span> <span class="k">else</span> <span class="s2">""</span>
|
|
<span class="k">return</span> <span class="s2">"|c</span><span class="si">%s</span><span class="s2">|n</span><span class="si">%s%s</span><span class="s2">"</span> <span class="o">%</span> <span class="p">(</span><span class="n">sdesc</span><span class="p">,</span> <span class="n">idstr</span><span class="p">,</span> <span class="n">pose</span><span class="p">)</span></div>
|
|
|
|
<div class="viewcode-block" id="ContribRPCharacter.at_object_creation"><a class="viewcode-back" href="../../../api/evennia.contrib.rpsystem.html#evennia.contrib.rpsystem.ContribRPCharacter.at_object_creation">[docs]</a> <span class="k">def</span> <span class="nf">at_object_creation</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
|
|
<span class="sd">"""</span>
|
|
<span class="sd"> Called at initial creation.</span>
|
|
<span class="sd"> """</span>
|
|
<span class="nb">super</span><span class="p">()</span><span class="o">.</span><span class="n">at_object_creation</span><span class="p">()</span>
|
|
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">db</span><span class="o">.</span><span class="n">_sdesc</span> <span class="o">=</span> <span class="s2">""</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">db</span><span class="o">.</span><span class="n">_sdesc_regex</span> <span class="o">=</span> <span class="s2">""</span>
|
|
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">db</span><span class="o">.</span><span class="n">_recog_ref2recog</span> <span class="o">=</span> <span class="p">{}</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">db</span><span class="o">.</span><span class="n">_recog_obj2regex</span> <span class="o">=</span> <span class="p">{}</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">db</span><span class="o">.</span><span class="n">_recog_obj2recog</span> <span class="o">=</span> <span class="p">{}</span>
|
|
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">cmdset</span><span class="o">.</span><span class="n">add</span><span class="p">(</span><span class="n">RPSystemCmdSet</span><span class="p">,</span> <span class="n">permanent</span><span class="o">=</span><span class="kc">True</span><span class="p">)</span>
|
|
<span class="c1"># initializing sdesc</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">sdesc</span><span class="o">.</span><span class="n">add</span><span class="p">(</span><span class="s2">"A normal person"</span><span class="p">)</span></div>
|
|
|
|
<div class="viewcode-block" id="ContribRPCharacter.at_before_say"><a class="viewcode-back" href="../../../api/evennia.contrib.rpsystem.html#evennia.contrib.rpsystem.ContribRPCharacter.at_before_say">[docs]</a> <span class="k">def</span> <span class="nf">at_before_say</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">message</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">):</span>
|
|
<span class="sd">"""</span>
|
|
<span class="sd"> Called before the object says or whispers anything, return modified message.</span>
|
|
|
|
<span class="sd"> Args:</span>
|
|
<span class="sd"> message (str): The suggested say/whisper text spoken by self.</span>
|
|
<span class="sd"> Keyword Args:</span>
|
|
<span class="sd"> whisper (bool): If True, this is a whisper rather than a say.</span>
|
|
|
|
<span class="sd"> """</span>
|
|
<span class="k">if</span> <span class="n">kwargs</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s2">"whisper"</span><span class="p">):</span>
|
|
<span class="k">return</span> <span class="n">f</span><span class="s1">'/me whispers "</span><span class="si">{message}</span><span class="s1">"'</span>
|
|
<span class="k">return</span> <span class="n">f</span><span class="s1">'/me says, "</span><span class="si">{message}</span><span class="s1">"'</span></div>
|
|
|
|
<div class="viewcode-block" id="ContribRPCharacter.process_sdesc"><a class="viewcode-back" href="../../../api/evennia.contrib.rpsystem.html#evennia.contrib.rpsystem.ContribRPCharacter.process_sdesc">[docs]</a> <span class="k">def</span> <span class="nf">process_sdesc</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">sdesc</span><span class="p">,</span> <span class="n">obj</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">):</span>
|
|
<span class="sd">"""</span>
|
|
<span class="sd"> Allows to customize how your sdesc is displayed (primarily by</span>
|
|
<span class="sd"> changing colors).</span>
|
|
|
|
<span class="sd"> Args:</span>
|
|
<span class="sd"> sdesc (str): The sdesc to display.</span>
|
|
<span class="sd"> obj (Object): The object to which the adjoining sdesc</span>
|
|
<span class="sd"> belongs. If this object is equal to yourself, then</span>
|
|
<span class="sd"> you are viewing yourself (and sdesc is your key).</span>
|
|
<span class="sd"> This is not used by default.</span>
|
|
|
|
<span class="sd"> Returns:</span>
|
|
<span class="sd"> sdesc (str): The processed sdesc ready</span>
|
|
<span class="sd"> for display.</span>
|
|
|
|
<span class="sd"> """</span>
|
|
<span class="k">return</span> <span class="s2">"|b</span><span class="si">%s</span><span class="s2">|n"</span> <span class="o">%</span> <span class="n">sdesc</span></div>
|
|
|
|
<div class="viewcode-block" id="ContribRPCharacter.process_recog"><a class="viewcode-back" href="../../../api/evennia.contrib.rpsystem.html#evennia.contrib.rpsystem.ContribRPCharacter.process_recog">[docs]</a> <span class="k">def</span> <span class="nf">process_recog</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">recog</span><span class="p">,</span> <span class="n">obj</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">):</span>
|
|
<span class="sd">"""</span>
|
|
<span class="sd"> Allows to customize how a recog string is displayed.</span>
|
|
|
|
<span class="sd"> Args:</span>
|
|
<span class="sd"> recog (str): The recog string. It has already been</span>
|
|
<span class="sd"> translated from the original sdesc at this point.</span>
|
|
<span class="sd"> obj (Object): The object the recog:ed string belongs to.</span>
|
|
<span class="sd"> This is not used by default.</span>
|
|
|
|
<span class="sd"> Returns:</span>
|
|
<span class="sd"> recog (str): The modified recog string.</span>
|
|
|
|
<span class="sd"> """</span>
|
|
<span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">process_sdesc</span><span class="p">(</span><span class="n">recog</span><span class="p">,</span> <span class="n">obj</span><span class="p">)</span></div>
|
|
|
|
<div class="viewcode-block" id="ContribRPCharacter.process_language"><a class="viewcode-back" href="../../../api/evennia.contrib.rpsystem.html#evennia.contrib.rpsystem.ContribRPCharacter.process_language">[docs]</a> <span class="k">def</span> <span class="nf">process_language</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">text</span><span class="p">,</span> <span class="n">speaker</span><span class="p">,</span> <span class="n">language</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">):</span>
|
|
<span class="sd">"""</span>
|
|
<span class="sd"> Allows to process the spoken text, for example</span>
|
|
<span class="sd"> by obfuscating language based on your and the</span>
|
|
<span class="sd"> speaker's language skills. Also a good place to</span>
|
|
<span class="sd"> put coloring.</span>
|
|
|
|
<span class="sd"> Args:</span>
|
|
<span class="sd"> text (str): The text to process.</span>
|
|
<span class="sd"> speaker (Object): The object delivering the text.</span>
|
|
<span class="sd"> language (str): An identifier string for the language.</span>
|
|
|
|
<span class="sd"> Return:</span>
|
|
<span class="sd"> text (str): The optionally processed text.</span>
|
|
|
|
<span class="sd"> Notes:</span>
|
|
<span class="sd"> This is designed to work together with a string obfuscator</span>
|
|
<span class="sd"> such as the `obfuscate_language` or `obfuscate_whisper` in</span>
|
|
<span class="sd"> the evennia.contrib.rplanguage module.</span>
|
|
|
|
<span class="sd"> """</span>
|
|
<span class="k">return</span> <span class="s2">"</span><span class="si">%s</span><span class="s2">|w</span><span class="si">%s</span><span class="s2">|n"</span> <span class="o">%</span> <span class="p">(</span><span class="s2">"|W(</span><span class="si">%s</span><span class="s2">)"</span> <span class="o">%</span> <span class="n">language</span> <span class="k">if</span> <span class="n">language</span> <span class="k">else</span> <span class="s2">""</span><span class="p">,</span> <span class="n">text</span><span class="p">)</span></div></div>
|
|
</pre></div>
|
|
|
|
<div class="clearer"></div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
<div class="sphinxsidebar" role="navigation" aria-label="main navigation">
|
|
<div class="sphinxsidebarwrapper">
|
|
<p class="logo"><a href="../../../index.html">
|
|
<img class="logo" src="../../../_static/evennia_logo.png" alt="Logo"/>
|
|
</a></p>
|
|
<div id="searchbox" style="display: none" role="search">
|
|
<h3 id="searchlabel">Quick search</h3>
|
|
<div class="searchformwrapper">
|
|
<form class="search" action="../../../search.html" method="get">
|
|
<input type="text" name="q" aria-labelledby="searchlabel" />
|
|
<input type="submit" value="Go" />
|
|
</form>
|
|
</div>
|
|
</div>
|
|
<script>$('#searchbox').show(0);</script>
|
|
<h3>Versions</h3>
|
|
<ul>
|
|
<li><a href="../../../../1.0-dev/index.html">1.0-dev (develop branch)</a></li>
|
|
<li><a href="rpsystem.html">0.9.5 (master branch)</a></li>
|
|
</ul>
|
|
|
|
</div>
|
|
</div>
|
|
<div class="clearer"></div>
|
|
</div>
|
|
<div class="related" role="navigation" aria-label="related navigation">
|
|
<h3>Navigation</h3>
|
|
<ul>
|
|
<li class="right" style="margin-right: 10px">
|
|
<a href="../../../genindex.html" title="General Index"
|
|
>index</a></li>
|
|
<li class="right" >
|
|
<a href="../../../py-modindex.html" title="Python Module Index"
|
|
>modules</a> |</li>
|
|
<li class="nav-item nav-item-0"><a href="../../../index.html">Evennia 0.9.5</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.contrib.rpsystem</a></li>
|
|
</ul>
|
|
<div class="develop">develop branch</div>
|
|
</div>
|
|
<div class="footer" role="contentinfo">
|
|
© Copyright 2020, The Evennia developer community.
|
|
Created using <a href="https://www.sphinx-doc.org/">Sphinx</a> 3.2.1.
|
|
</div>
|
|
</body>
|
|
</html> |