minimum supported versions of MariaDB, MySQL and PostgreSQL,
see <aclass="reference external"href="https://docs.djangoproject.com/en/4.2/releases/4.2/#backwards-incompatible-changes-in-4-2">django release nodes</a></p></li>
<li><p><aclass="reference external"href="https://github.com/evennia/evennia/pull/3313">Feature</a> (Backwards incompatible): <codeclass="docutils literal notranslate"><spanclass="pre">OptionHandler.set</span></code> now returns
<codeclass="docutils literal notranslate"><spanclass="pre">BaseOption</span></code> rather than its <codeclass="docutils literal notranslate"><spanclass="pre">.value</span></code>. Instead access <codeclass="docutils literal notranslate"><spanclass="pre">.value</span></code> or <codeclass="docutils literal notranslate"><spanclass="pre">.display()</span></code>
on this return for more control. (Volund)</p></li>
<li><p><aclass="reference external"href="https://github.com/evennia/evennia/pull/3278">Feature</a>: (Backwards incompatible): Refactor home page into multiple sub-parts for easier
<li><p><aclass="reference external"href="https://github.com/evennia/evennia/issues/3273">Feature</a>: Allow passing <codeclass="docutils literal notranslate"><spanclass="pre">text_kwargs</span></code> kwarg to <codeclass="docutils literal notranslate"><spanclass="pre">EvMore.msg</span></code> in order to expand
the outputfunc used for every evmore page.</p></li>
<li><p><aclass="reference external"href="https://github.com/evennia/evennia/pull/3286">Feature</a>: Allow Discord bot to change user’s nickname and assign
roles for a user on a given server (holl0wstar).</p></li>
<li><p><aclass="reference external"href="https://github.com/evennia/evennia/pull/3301">Feature</a>: Make EvenniaAdminSite include custom models better; adds
<codeclass="docutils literal notranslate"><spanclass="pre">DJANGO_ADMIN_APP_ORDER</span></code> and <codeclass="docutils literal notranslate"><spanclass="pre">DJANGO_ADMIN_APP_EXCLUDE</span></code> as modifable
settings.(Volund)</p></li>
<li><p><aclass="reference external"href="https://github.com/evennia/evennia/pull/3179">Feature</a>: Handling of the <codeclass="docutils literal notranslate"><spanclass="pre">.db._playable_characters</span></code> helper
<li><p><aclass="reference external"href="https://github.com/evennia/evennia/pull/3281">Feature</a>: Add <codeclass="docutils literal notranslate"><spanclass="pre">$your()</span></code> and <codeclass="docutils literal notranslate"><spanclass="pre">$Your()</span></code> for actor stance emoting (Volund)</p></li>
<codeclass="docutils literal notranslate"><spanclass="pre">.get_available_character_slots()</span></code>, <codeclass="docutils literal notranslate"><spanclass="pre">.check_available_slots</span></code> and
<codeclass="docutils literal notranslate"><spanclass="pre">at_post_create_character</span></code> methods to allow better customization of character creation (Volund)</p></li>
<li><p><aclass="reference external"href="https://github.com/evennia/evennia/pull/3319">Feature</a>: Refactor/cleanup of Evennia server/portal startup files
into services for easier overriding (Volund)</p></li>
<li><p><aclass="reference external"href="https://github.com/evennia/evennia/pull/3342">Feature</a>: Add <codeclass="docutils literal notranslate"><spanclass="pre">Command.cmdset_source</span></code>, referring to the cmdset each
command was originally pulled from (Volund)</p></li>
<li><p><aclass="reference external"href="https://github.com/evennia/evennia/pull/3343">Feature</a>: Add <codeclass="docutils literal notranslate"><spanclass="pre">access_type</span></code> as optional kwarg to lockfuncs (Volund)</p></li>
<li><p><aclass="reference external"href="https://github.com/evennia/evennia/pull/3344">Feature</a>: New middleware for checking IP/subnets from requests. New
tools <codeclass="docutils literal notranslate"><spanclass="pre">evennia.utils.match_ip</span></code> and <codeclass="docutils literal notranslate"><spanclass="pre">utils.ip_from_request</span></code> to help. (Volund)</p></li>
<li><p><aclass="reference external"href="https://github.com/evennia/evennia/pull/3349">Feature</a>: Refactored almost all default commands to use
<codeclass="docutils literal notranslate"><spanclass="pre">Command.msg</span></code> over the <codeclass="docutils literal notranslate"><spanclass="pre">command.caller.msg</span></code> direct call (more flexible) (Volund)</p></li>
<codeclass="docutils literal notranslate"><spanclass="pre">settings.TEST_ENVIRONMENT</span></code> to address issues during refactored startup sequence.</p></li>
<li><p><aclass="reference external"href="https://github.com/evennia/evennia/pull/3197">Fix</a>: Make sure Global scripts only start in one place,</p></li>
<li><p><aclass="reference external"href="https://github.com/evennia/evennia/pull/3324">Fix</a>: Make account-post-login-fail signal fire properly. Add
<codeclass="docutils literal notranslate"><spanclass="pre">CUSTOM_SIGNAL</span></code> for adding one’s own signals (Volund)</p></li>
<li><p><aclass="reference external"href="https://github.com/evennia/evennia/pull/3267">Fix</a>: Missing recache step in ObjectSessionHandler (InspectorCaracal)</p></li>
<li><p><aclass="reference external"href="https://github.com/evennia/evennia/pull/3270">Fix</a>: Evennia is its own MSSP family now, so we should return that
instead of ‘Custom’ (InspectorCaracal)</p></li>
<li><p><aclass="reference external"href="https://github.com/evennia/evennia/pull/3274">Fix</a>: Traceback when creating objects with initial nattributes
(InspectorCaracal)</p></li>
<li><p><aclass="reference external"href="https://github.com/evennia/evennia/issues/3272">Fix</a>: Make sure <codeclass="docutils literal notranslate"><spanclass="pre">ScriptHandler.add</span></code> does not fail if passed an
<li><p><aclass="reference external"href="https://github.com/evennia/evennia/pull/3350">Fix</a>: <codeclass="docutils literal notranslate"><spanclass="pre">CmdHelp</span></code> was using the wrong protocol-key identifier when
<li><p><aclass="reference external"href="https://github.com/evennia/evennia/issues/3331">fix</a>: Made XYZGrid query zcoords in a case-insensitive manner.</p></li>
<h2>Evennia 2.3.0<aclass="headerlink"href="#evennia-2-3-0"title="Permalink to this headline">¶</a></h2>
<p>Sept 3, 2023</p>
<ulclass="simple">
<li><p>Feat: EvMenu tooltips for multiple help categories in a node (Seannio).</p></li>
<li><p>Feat: Default <codeclass="docutils literal notranslate"><spanclass="pre">examine</span></code> command now also shows an account’s <codeclass="docutils literal notranslate"><spanclass="pre">last_login</span></code>
(michaelfaith84)</p></li>
<li><p>Fix: Portal would accidentally start global scripts. (blongden)</p></li>
<li><p>Fix: Traceback when printing CounterTrait contrib objects. (InspectorCaracal)</p></li>
<li><p>Fix: Typo in evadventure twitch combat’s call of <codeclass="docutils literal notranslate"><spanclass="pre">create_combathandler</span></code>.</p></li>
<li><p>Docs: Fix bug in evadventure equipmenthandler blocking creation of npcs.
in-game.</p></li>
<li><p>Docs: Plenty of typo fixes (iLPDev, moldikins, others)</p></li>
</ul>
</section>
<sectionid="evennia-2-2-0">
<h2>Evennia 2.2.0<aclass="headerlink"href="#evennia-2-2-0"title="Permalink to this headline">¶</a></h2>
<p>Aug 6, 2023</p>
<ulclass="simple">
<li><p>Contrib: Large-language-model (LLM) AI integration; allows NPCs to talk using
responses from an LLM server.</p></li>
<li><p>Fix: Make sure <codeclass="docutils literal notranslate"><spanclass="pre">at_server_reload</span></code> is called also on non-repeating Scripts.</p></li>
<li><p>Fix: Webclient was not giving a proper error when sending an unknown outputfunc to it.</p></li>
<li><p>Fix: Make <codeclass="docutils literal notranslate"><spanclass="pre">py</span></code> command always send strings unless <codeclass="docutils literal notranslate"><spanclass="pre">client_raw</span></code> flag is set.</p></li>
<li><p>Fix: <codeclass="docutils literal notranslate"><spanclass="pre">Script.start</span></code> with an integer <codeclass="docutils literal notranslate"><spanclass="pre">start_delay</span></code> caused a traceback.</p></li>
<li><p>Fix: Removing “Guest” from the permission-hierarchy setting messed up access.</p></li>
<li><p>Docs: Remove doc pages for Travis/TeamCity CI tools, they were both very much
out of date, and Travis is not free for OSS anymore.</p></li>
<li><p>Docs: A lot fixes of typos and bugs in tutorials.</p></li>
</ul>
</section>
<sectionid="evennia-2-1-0">
<h2>Evennia 2.1.0<aclass="headerlink"href="#evennia-2-1-0"title="Permalink to this headline">¶</a></h2>
<p>July 14, 2023</p>
<ulclass="simple">
<li><p>Fix: The new <codeclass="docutils literal notranslate"><spanclass="pre">ExtendedRoom</span></code> contrib has a bug when dug with no descriptions.</p></li>
<li><p>Fix: Clean up <codeclass="docutils literal notranslate"><spanclass="pre">get_sides</span></code> function in evadventure tutorial to return also
the calling combatant with its <codeclass="docutils literal notranslate"><spanclass="pre">allies</span></code> return, to make it easier to reason around.</p></li>
<li><p>Feature: Add <codeclass="docutils literal notranslate"><spanclass="pre">SSL_CERTIFICATE_ISSUERS</span></code> setting for customizing Telnet+SSL.</p></li>
<li><p>Contrib: Refactored <codeclass="docutils literal notranslate"><spanclass="pre">dice.roll</span></code> contrib function to use <codeclass="docutils literal notranslate"><spanclass="pre">safe_eval</span></code>. Can now
optionally be used as <codeclass="docutils literal notranslate"><spanclass="pre">dice.roll("2d10</span><spanclass="pre">+</span><spanclass="pre">4</span><spanclass="pre">></span><spanclass="pre">10")</span></code>. Old way works too.</p></li>
<li><p>Lots of doc updates.</p></li>
</ul>
</section>
<sectionid="evennia-2-0-1">
<h2>Evennia 2.0.1<aclass="headerlink"href="#evennia-2-0-1"title="Permalink to this headline">¶</a></h2>
<p>June 17, 2023</p>
<ulclass="simple">
<li><p>Fix: A look-bug in the <codeclass="docutils literal notranslate"><spanclass="pre">ExtendedRoom</span></code> contrib (InspectorCaracal)</p></li>
</ul>
</section>
<sectionid="evennia-2-0-0">
<h2>Evennia 2.0.0<aclass="headerlink"href="#evennia-2-0-0"title="Permalink to this headline">¶</a></h2>
<p>June 10, 2023</p>
<ulclass="simple">
<li><p><strong>Possible backwards incompatibility</strong>: Updated contrib <codeclass="docutils literal notranslate"><spanclass="pre">ExtendedRoom</span></code> now
tags, details and random messages. While this feature is made to be as
backwards-compatible as possible, so many people depend on this contrib class
that we are updating the major Evennia version to indicate the big changes.</p></li>
<li><p>New Contrib: <codeclass="docutils literal notranslate"><spanclass="pre">Container</span></code> typeclass with new commands for storing and retrieving
things inside them (InspectorCaracal)</p></li>
<li><p>Feature: Add <codeclass="docutils literal notranslate"><spanclass="pre">TagCategoryProperty</span></code> for setting categories with multiple tags
as properties directly on objects. Complements <codeclass="docutils literal notranslate"><spanclass="pre">TagProperty</span></code>.</p></li>
<li><p>Feature: Attribute-support for saving/loading <codeclass="docutils literal notranslate"><spanclass="pre">deques</span></code> with <codeclass="docutils literal notranslate"><spanclass="pre">maxlen=</span></code> set.</p></li>
<li><p>Feature: Refactor to provide <codeclass="docutils literal notranslate"><spanclass="pre">evennia.SESSION_HANDLER</span></code> for easier overloading
and less risks of circular import problems (Volund)</p></li>
<codeclass="docutils literal notranslate"><spanclass="pre">cls</span></code> kwarg for customizing the CSS class for every resulting <codeclass="docutils literal notranslate"><spanclass="pre">div</span></code> (friarzen)</p></li>
<li><p>Fix: The <codeclass="docutils literal notranslate"><spanclass="pre">AttributeHandler.all()</span></code> now actually accepts <codeclass="docutils literal notranslate"><spanclass="pre">category=</span></code> as
keyword arg, like our docs already claimed it should (Volund)</p></li>
<li><p>Fix: <codeclass="docutils literal notranslate"><spanclass="pre">TickerHandler</span></code> store key updating was refactored, fixing an issue with
updating intervals (InspectorCaracal)</p></li>
<li><p>Docs: Removed warning about Python3.11 on Windows; upstream Twistd now
supports 3.11 on Windows.</p></li>
<li><p>Docs: New Beginner-Tutorial lessons for NPCs, Base-Combat Twitch-Combat and
Turnbased-combat (note that the Beginner tutorial is still WIP).</p></li>
<li><p>Stabilize how to make the major update in the docs.</p></li>
<li><p>Fix: A lot of other minor bug fixes.</p></li>
</ul>
</section>
<sectionid="evennia-1-3-0">
<h2>Evennia 1.3.0<aclass="headerlink"href="#evennia-1-3-0"title="Permalink to this headline">¶</a></h2>
<p>Apr 29, 2023</p>
<ulclass="simple">
<li><p>Feature: Better ANSI color fallbacks (InspectorCaracal).</p></li>
<li><p>Feature: Add support for saving <codeclass="docutils literal notranslate"><spanclass="pre">deque</span></code> with <codeclass="docutils literal notranslate"><spanclass="pre">maxlen</span></code> to Attributes (before
<codeclass="docutils literal notranslate"><spanclass="pre">maxlen</span></code> was ignored).</p></li>
<li><p>Fix: The username validator did not display errors correctly in web
registration form.</p></li>
<li><p>Fix: Components contrib had issues with inherited typeclasses (ChrisLR)</p></li>
<li><p>Fix: f-string fix in clothing contrib (aMiss-aWry)</p></li>
<li><p>Fix: Have <codeclass="docutils literal notranslate"><spanclass="pre">EvenniaTestCase</span></code> properly flush idmapper cache (bradleymarques)</p></li>
<li><p>Tools: More unit tests for scripts (Storsorken)</p></li>
<li><p>Docs: Made separate doc pages for Exits, Characters and Rooms. Expanded on how
to change the description of an in-game object with templating.</p></li>
<li><p>Docs: A multitude of doc issues and typos fixed.</p></li>
</ul>
</section>
<sectionid="evennia-1-2-1">
<h2>Evennia 1.2.1<aclass="headerlink"href="#evennia-1-2-1"title="Permalink to this headline">¶</a></h2>
<p>Feb 26, 2023</p>
<ulclass="simple">
<li><p>Bug fix: Make sure command parser gives precedence to longer cmd-aliases. So
if sending <codeclass="docutils literal notranslate"><spanclass="pre">smile</span><spanclass="pre">at</span></code> and the cmd <codeclass="docutils literal notranslate"><spanclass="pre">smile</span></code> has alias <codeclass="docutils literal notranslate"><spanclass="pre">smile</span><spanclass="pre">at</span></code>, the match is
ordered so the result is never interpreted as <codeclass="docutils literal notranslate"><spanclass="pre">smile</span></code> with an argument <codeclass="docutils literal notranslate"><spanclass="pre">at</span></code>.</p></li>
<li><p>Bug fix: || (escaped color tags) were parsed too early in help entries,
leading to colors when wanting a | separator</p></li>
<li><p>Bug fix: Make sure spawned objects get <codeclass="docutils literal notranslate"><spanclass="pre">typeclass_path</span></code> pointing to the true
location rather than alias (in line with <codeclass="docutils literal notranslate"><spanclass="pre">create_object</span></code>).</p></li>
<li><p>Bug fix: Building Menu contrib menu no using Replace over Union mergetype to
avoid clashing with in-game commands while building</p></li>
<li><p>Feature: RPSystem contrib <codeclass="docutils literal notranslate"><spanclass="pre">sdesc</span></code> command can now view/delete your sdesc.</p></li>
<li><p>Bug fix: Change so <codeclass="docutils literal notranslate"><spanclass="pre">script</span><spanclass="pre">obj</span><spanclass="pre">=</span><spanclass="pre">[scriptname|id]</span></code> is required to manipulate
scripts on objects; <codeclass="docutils literal notranslate"><spanclass="pre">script</span><spanclass="pre">scriptname|id</span></code> only works on global scripts.</p></li>
<li><p>Doc: Add warning about <codeclass="docutils literal notranslate"><spanclass="pre">Django-wiki</span></code> (in wiki tutorial) only supporting
Django <4.0.</p></li>
<li><p>Doc: Expanded <codeclass="docutils literal notranslate"><spanclass="pre">XYZGrid</span></code> docstring to clarify <codeclass="docutils literal notranslate"><spanclass="pre">MapLink</span></code> class will not itself
spawn anything, children must define their prototypes explicitly.</p></li>
<li><p>Doc: Explained why <codeclass="docutils literal notranslate"><spanclass="pre">AttributeProperty.at_get/set</span></code> will not be called if
accessing the Attribute from the <codeclass="docutils literal notranslate"><spanclass="pre">AttributeHandler</span></code> (bypassing the property)</p></li>
<li><p>Bug fix: Evtable options showed spurious empty lines if set without desc</p></li>
<li><p>Usage fix: The <codeclass="docutils literal notranslate"><spanclass="pre">teleport:</span></code> and <codeclass="docutils literal notranslate"><spanclass="pre">teleport_here:</span></code> locks where checked in
<codeclass="docutils literal notranslate"><spanclass="pre">CmdTeleport</span></code>, but not actually set on any entities. These locks are now
set with defaults on all objects,characters,rooms and exits.</p></li>
</ul>
</section>
<sectionid="evennia-1-2-0">
<h2>Evennia 1.2.0<aclass="headerlink"href="#evennia-1-2-0"title="Permalink to this headline">¶</a></h2>
<p>Feb 25, 2023</p>
<ulclass="simple">
<li><p>Bug fix: <codeclass="docutils literal notranslate"><spanclass="pre">TagHandler.get</span></code> did not consistently cast to string (aMiss-aWry)</p></li>
<li><p>Bug fix: Channels hard to manage if given in different case (aMiss-aWry)</p></li>
<li><p>Feature: <codeclass="docutils literal notranslate"><spanclass="pre">logger.delete_log</span></code> function for deleting custom logs from inside the
<li><p>Feature: Add <codeclass="docutils literal notranslate"><spanclass="pre">fly/dive</span></code> commands to <codeclass="docutils literal notranslate"><spanclass="pre">XYZGrid</span></code> contrib to showcase treating its
Z-axis as a full 3D grid. Also fixed minor bug in <codeclass="docutils literal notranslate"><spanclass="pre">XYZGrid</span></code> contrib when using
a Z axis named using an integer rather than a string.</p></li>
<li><p>Bug fix: <codeclass="docutils literal notranslate"><spanclass="pre">$an()</span></code> inlinefunc didn’t understand to use ‘an’ words starting with a
capital vowel</p></li>
<li><p>Bug fix: Another case of the ‘duplicate Discord bot connections’ bug
(InspectorCaracal)</p></li>
<li><p>Fix: Make XYZGrid contrib’s MapParserErrors more succinct</p></li>
</ul>
</section>
<sectionid="evennia-1-1-1">
<h2>Evennia 1.1.1<aclass="headerlink"href="#evennia-1-1-1"title="Permalink to this headline">¶</a></h2>
<p>Jan 15, 2023</p>
<ulclass="simple">
<li><p>Bug fix: Better handler malformed alias-regex given to nickhandler. A
regex-relevant character in a channel alias could cause server to not restart.</p></li>
<li><p>Feature: Add <codeclass="docutils literal notranslate"><spanclass="pre">attr</span></code> keyword to <codeclass="docutils literal notranslate"><spanclass="pre">create_channel</span></code>. This allows setting
attributes on channels at creation, also from <codeclass="docutils literal notranslate"><spanclass="pre">DEFAULT_CHANNELS</span></code> definitions.</p></li>
</ul>
</section>
<sectionid="evennia-1-1-0">
<h2>Evennia 1.1.0<aclass="headerlink"href="#evennia-1-1-0"title="Permalink to this headline">¶</a></h2>
<p>Jan 7, 2023</p>
<ulclass="simple">
<li><p>Stop new registrations with <codeclass="docutils literal notranslate"><spanclass="pre">settings.NEW_ACCOUNT_REGISTRATION_ENABLED</span></code>
(inspectorcaracal)</p></li>
<li><p>Bug fixes.</p></li>
</ul>
</section>
<sectionid="evennia-1-0-2">
<h2>Evennia 1.0.2<aclass="headerlink"href="#evennia-1-0-2"title="Permalink to this headline">¶</a></h2>
<p>Dec 21, 2022</p>
<ulclass="simple">
<li><p>Bug fix release. Fix more issues with discord bot reconnecting. Some doc
updates.</p></li>
</ul>
</section>
<sectionid="evennia-1-0-1">
<h2>Evennia 1.0.1<aclass="headerlink"href="#evennia-1-0-1"title="Permalink to this headline">¶</a></h2>
<p>Dec 7, 2022</p>
<ulclass="simple">
<li><p>Bug fix release. Main issue was reconnect bug for discord bot.</p></li>
</ul>
</section>
<sectionid="evennia-1-0-0">
<h2>Evennia 1.0.0<aclass="headerlink"href="#evennia-1-0-0"title="Permalink to this headline">¶</a></h2>
<p>2019-2022</p>
<p><em>Changed to using <codeclass="docutils literal notranslate"><spanclass="pre">main</span></code> branch to follow github standard. Old <codeclass="docutils literal notranslate"><spanclass="pre">master</span></code> branch remains
for now but will not be used anymore, so as to not break installs during transition.</em></p>
<p>Also changing to using semantic versioning with this version.</p>
defaults to True for backwards-compatibility in 0.9, will be False in 1.0</p></li>
<li><p>REST API allows you external access to db objects through HTTP requests (Tehom)</p></li>
<li><p><codeclass="docutils literal notranslate"><spanclass="pre">Object.normalize_name</span></code> and <codeclass="docutils literal notranslate"><spanclass="pre">.validate_name</span></code> added to (by default) enforce latinify
on character name and avoid potential exploits using clever Unicode chars (trhr)</p></li>
<li><p>New <codeclass="docutils literal notranslate"><spanclass="pre">utils.format_grid</span></code> for easily displaying long lists of items in a block.</p></li>
<li><p>Using <codeclass="docutils literal notranslate"><spanclass="pre">lunr</span></code> search indexing for better <codeclass="docutils literal notranslate"><spanclass="pre">help</span></code> matching and suggestions. Also improve
the main help command’s default listing output.</p></li>
<li><p>Added <codeclass="docutils literal notranslate"><spanclass="pre">content_types</span></code> indexing to DefaultObject’s ContentsHandler. (volund)</p></li>
<li><p>Made most of the networking classes such as Protocols and the SessionHandlers
replaceable via <codeclass="docutils literal notranslate"><spanclass="pre">settings.py</span></code> for modding enthusiasts. (volund)</p></li>
<li><p>The <codeclass="docutils literal notranslate"><spanclass="pre">initial_setup.py</span></code> file can now be substituted in <codeclass="docutils literal notranslate"><spanclass="pre">settings.py</span></code> to customize
initial game database state. (volund)</p></li>
<li><p>Added new Traits contrib, converted and expanded from Ainneve project.</p></li>
<li><p>Added new <codeclass="docutils literal notranslate"><spanclass="pre">requirements_extra.txt</span></code> file for easily getting all optional dependencies.</p></li>
<li><p>Change default multi-match syntax from 1-obj, 2-obj to obj-1, obj-2.</p></li>
<li><p>Make <codeclass="docutils literal notranslate"><spanclass="pre">object.search</span></code> support ‘stacks=0’ keyword - if <codeclass="docutils literal notranslate"><spanclass="pre">>0</span></code>, the method will return
N identical matches instead of triggering a multi-match error.</p></li>
<li><p>Add <codeclass="docutils literal notranslate"><spanclass="pre">tags.has()</span></code> method for checking if an object has a tag or tags (PR by ChrisLR)</p></li>
<li><p>Make IP throttle use Django-based cache system for optional persistence (PR by strikaco)</p></li>
<li><p>Renamed Tutorial classes “Weapon” and “WeaponRack” to “TutorialWeapon” and
“TutorialWeaponRack” to prevent collisions with classes in mygame</p></li>
<li><p>New <codeclass="docutils literal notranslate"><spanclass="pre">crafting</span></code> contrib, adding a full crafting subsystem (Griatch 2020)</p></li>
<li><p>The <codeclass="docutils literal notranslate"><spanclass="pre">rplanguage</span></code> contrib now auto-capitalizes sentences and retains ellipsis (…). This
change means that proper nouns at the start of sentences will not be treated as nouns.</p></li>
<li><p>Make MuxCommand <codeclass="docutils literal notranslate"><spanclass="pre">lhs/rhslist</span></code> always be lists, also if empty (used to be the empty string)</p></li>
<li><p>Fix typo in UnixCommand contrib, where <codeclass="docutils literal notranslate"><spanclass="pre">help</span></code> was given as <codeclass="docutils literal notranslate"><spanclass="pre">--hel</span></code>.</p></li>
<li><p>Made the <codeclass="docutils literal notranslate"><spanclass="pre">evennia</span></code> dir possible to use without gamedir for purpose of doc generation.</p></li>
<li><p>Make Scripts’ timer component independent from script object deletion; can now start/stop
timer without deleting Script. The <codeclass="docutils literal notranslate"><spanclass="pre">.persistent</span></code> flag now only controls if timer survives
reload - Script has to be removed with <codeclass="docutils literal notranslate"><spanclass="pre">.delete()</span></code> like other typeclassed entities.</p></li>
<li><p>Add <codeclass="docutils literal notranslate"><spanclass="pre">utils.repeat</span></code> and <codeclass="docutils literal notranslate"><spanclass="pre">utils.unrepeat</span></code> as shortcuts to TickerHandler add/remove, similar
to how <codeclass="docutils literal notranslate"><spanclass="pre">utils.delay</span></code> is a shortcut for TaskHandler add.</p></li>
<li><p>Refactor the classic <codeclass="docutils literal notranslate"><spanclass="pre">red_button</span></code> example to use <codeclass="docutils literal notranslate"><spanclass="pre">utils.delay/repeat</span></code> and modern recommended
code style and paradigms instead of relying on <codeclass="docutils literal notranslate"><spanclass="pre">Scripts</span></code> for everything.</p></li>
<li><p>Expand <codeclass="docutils literal notranslate"><spanclass="pre">CommandTest</span></code> with ability to check multiple message-receivers; inspired by PR by
user davewiththenicehat. Also add new doc string.</p></li>
<li><p>Add central <codeclass="docutils literal notranslate"><spanclass="pre">FuncParser</span></code> as a much more powerful replacement for the old <codeclass="docutils literal notranslate"><spanclass="pre">parse_inlinefunc</span></code>
function.</p></li>
<li><p>Attribute/NAttribute got a homogenous representation, using intefaces, both
<codeclass="docutils literal notranslate"><spanclass="pre">AttributeHandler</span></code> and <codeclass="docutils literal notranslate"><spanclass="pre">NAttributeHandler</span></code> has same api now.</p></li>
<li><p>Add <codeclass="docutils literal notranslate"><spanclass="pre">evennia/utils/verb_conjugation</span></code> for automatic verb conjugation (English only). This
is useful for implementing actor-stance emoting for sending a string to different targets.</p></li>
<li><p>New version of Italian translation (rpolve)</p></li>
<li><p><codeclass="docutils literal notranslate"><spanclass="pre">utils.evmenu.ask_yes_no</span></code> is a helper function that makes it easy to ask a yes/no question
to the user and respond to their input. This complements the existing <codeclass="docutils literal notranslate"><spanclass="pre">get_input</span></code> helper.</p></li>
<li><p>Allow sending messages with <codeclass="docutils literal notranslate"><spanclass="pre">page/tell</span></code> without a <codeclass="docutils literal notranslate"><spanclass="pre">=</span></code> if target name contains no spaces.</p></li>
<li><p>New FileHelpStorage system allows adding help entries via external files.</p></li>
<li><p><codeclass="docutils literal notranslate"><spanclass="pre">sethelp</span></code> command now warns if shadowing other help-types when creating a new
entry.</p></li>
<li><p>Help command now uses <codeclass="docutils literal notranslate"><spanclass="pre">view</span></code> lock to determine if cmd/entry shows in index and
<codeclass="docutils literal notranslate"><spanclass="pre">read</span></code> lock to determine if it can be read. It used to be <codeclass="docutils literal notranslate"><spanclass="pre">view</span></code> in the role
of the latter. Migration swaps these around.</p></li>
<li><p>In modules given by <codeclass="docutils literal notranslate"><spanclass="pre">settings.PROTOTYPE_MODULES</span></code>, spawner will now first look for a global
list <codeclass="docutils literal notranslate"><spanclass="pre">PROTOTYPE_LIST</span></code> of dicts before loading all dicts in the module as prototypes.</p></li>
<li><p>New Channel-System using the <codeclass="docutils literal notranslate"><spanclass="pre">channel</span></code> command and nicks. Removed the <codeclass="docutils literal notranslate"><spanclass="pre">ChannelHandler</span></code> and the
concept of a dynamically created <codeclass="docutils literal notranslate"><spanclass="pre">ChannelCmdSet</span></code>.</p></li>
<li><p>Add <codeclass="docutils literal notranslate"><spanclass="pre">Msg.db_receiver_external</span></code> field to allowe external, string-id message-receivers.</p></li>
<li><p>Renamed <codeclass="docutils literal notranslate"><spanclass="pre">app.css</span></code> to <codeclass="docutils literal notranslate"><spanclass="pre">website.css</span></code> for consistency. Removed old prosimii-css files.</p></li>
<li><p>Remove <codeclass="docutils literal notranslate"><spanclass="pre">mygame/web/static_overrides</span></code> and -<codeclass="docutils literal notranslate"><spanclass="pre">template_overrides</span></code>, reorganize website/admin/client/api
into a more consistent structure for overriding. Expanded webpage documentation considerably.</p></li>
<li><p>REST API list-view was shortened (#2401). New CSS/HTML. Add ReDoc for API autodoc page.</p></li>
<li><p>Update and fix dummyrunner with cleaner code and setup.</p></li>
<li><p>Made <codeclass="docutils literal notranslate"><spanclass="pre">iter_to_str</span></code> format prettier strings, using Oxford comma.</p></li>
<li><p>Added an MXP anchor tag to also support clickable web links.</p></li>
<li><p>New <codeclass="docutils literal notranslate"><spanclass="pre">tasks</span></code> command for managing tasks started with <codeclass="docutils literal notranslate"><spanclass="pre">utils.delay</span></code> (PR by davewiththenicehat)</p></li>
<li><p>Make <codeclass="docutils literal notranslate"><spanclass="pre">help</span></code> index output clickable for webclient/clients with MXP (PR by davewiththenicehat)</p></li>
<li><p>Custom <codeclass="docutils literal notranslate"><spanclass="pre">evennia</span></code> launcher commands (e.g. <codeclass="docutils literal notranslate"><spanclass="pre">evennia</span><spanclass="pre">mycmd</span><spanclass="pre">foo</span><spanclass="pre">bar</span></code>). Add new commands as callables
accepting <codeclass="docutils literal notranslate"><spanclass="pre">*args</span></code>, as <codeclass="docutils literal notranslate"><spanclass="pre">settings.EXTRA_LAUNCHER_COMMANDS</span><spanclass="pre">=</span><spanclass="pre">{'mycmd':</span><spanclass="pre">'path.to.callable',</span><spanclass="pre">...}</span></code>.</p></li>
<li><p>New <codeclass="docutils literal notranslate"><spanclass="pre">XYZGrid</span></code> contrib, adding x,y,z grid coordinates with in-game map and
pathfinding. Controlled outside of the game via custom evennia launcher command.</p></li>
<li><p><codeclass="docutils literal notranslate"><spanclass="pre">Script.delete</span></code> has new kwarg <codeclass="docutils literal notranslate"><spanclass="pre">stop_task=True</span></code>, that can be used to avoid
infinite recursion when wanting to set up Script to delete-on-stop.</p></li>
<li><p>Command executions now done on copies to make sure <codeclass="docutils literal notranslate"><spanclass="pre">yield</span></code> don’t cause crossovers. Add
<codeclass="docutils literal notranslate"><spanclass="pre">Command.retain_instance</span></code> flag for reusing the same command instance.</p></li>
<li><p>The <codeclass="docutils literal notranslate"><spanclass="pre">typeclass</span></code> command will now correctly search the correct database-table for the target
obj (avoids mistakenly assigning an AccountDB-typeclass to a Character etc).</p></li>
<li><p>Merged <codeclass="docutils literal notranslate"><spanclass="pre">script</span></code> and <codeclass="docutils literal notranslate"><spanclass="pre">scripts</span></code> commands into one, for both managing global- and
on-object Scripts. Moved <codeclass="docutils literal notranslate"><spanclass="pre">CmdScripts</span></code> and <codeclass="docutils literal notranslate"><spanclass="pre">CmdObjects</span></code> to <codeclass="docutils literal notranslate"><spanclass="pre">commands/default/building.py</span></code>.</p></li>
<li><p>Keep GMCP function case if outputfunc starts with capital letter (so <codeclass="docutils literal notranslate"><spanclass="pre">cmd_name</span></code> -><codeclass="docutils literal notranslate"><spanclass="pre">Cmd.Name</span></code>
but <codeclass="docutils literal notranslate"><spanclass="pre">Cmd_nAmE</span></code> -><codeclass="docutils literal notranslate"><spanclass="pre">Cmd.nAmE</span></code>). This helps e.g Mudlet’s legacy <codeclass="docutils literal notranslate"><spanclass="pre">Client_GUI</span></code> implementation)</p></li>
<li><p>Prototypes now allow setting <codeclass="docutils literal notranslate"><spanclass="pre">prototype_parent</span></code> directly to a prototype-dict.
This makes it easier when dynamically building in-module prototypes.</p></li>
<li><p><codeclass="docutils literal notranslate"><spanclass="pre">RPSystem</span><spanclass="pre">contrib</span></code> was expanded to support case, so /tall becomes ‘tall man’
while /Tall becomes ‘Tall man’. One can turn this off if wanting the old style.</p></li>
<li><p>Change <codeclass="docutils literal notranslate"><spanclass="pre">EvTable</span></code> fixed-height rebalance algorithm to fill with empty lines at end of
column instead of inserting rows based on cell-size (could be mistaken for a bug).</p></li>
<li><p>Split <codeclass="docutils literal notranslate"><spanclass="pre">return_appearance</span></code> hook with helper methods and have it use a template
string in order to make it easier to override.</p></li>
<li><p>Add validation question to default account creation.</p></li>
<li><p>Add <codeclass="docutils literal notranslate"><spanclass="pre">LOCALECHO</span></code> client option to add server-side echo for clients that does
not support this (useful for getting a complete log).</p></li>
<li><p>Make <codeclass="docutils literal notranslate"><spanclass="pre">@lazy_property</span></code> decorator create read/delete-protected properties. This is
because it’s used for handlers, and e.g. self.locks=[] is a common beginner mistake.</p></li>
<li><p>Add <codeclass="docutils literal notranslate"><spanclass="pre">$pron()</span></code> inlinefunc for pronoun parsing in actor-stance strings using
<li><p>Update defauklt website to show Telnet/SSL/SSH connect info. Added new
<codeclass="docutils literal notranslate"><spanclass="pre">SERVER_HOSTNAME</span></code> setting for use in the server:port stanza.</p></li>
<li><p>Changed all <codeclass="docutils literal notranslate"><spanclass="pre">at_before/after_*</span></code> hooks to <codeclass="docutils literal notranslate"><spanclass="pre">at_pre/post_*</span></code> for consistency
across Evennia (the old names still work but are deprecated)</p></li>
<li><p>Change <codeclass="docutils literal notranslate"><spanclass="pre">settings.COMMAND_DEFAULT_ARG_REGEX</span></code> default from <codeclass="docutils literal notranslate"><spanclass="pre">None</span></code> to a regex meaning that
a space or <codeclass="docutils literal notranslate"><spanclass="pre">/</span></code> must separate the cmdname and args. This better fits common expectations.</p></li>
<li><p>Add confirmation question to <codeclass="docutils literal notranslate"><spanclass="pre">ban</span></code>/<codeclass="docutils literal notranslate"><spanclass="pre">unban</span></code> commands.</p></li>
<li><p>Check new <codeclass="docutils literal notranslate"><spanclass="pre">teleport</span></code> and <codeclass="docutils literal notranslate"><spanclass="pre">teleport_here</span></code> lock-types in <codeclass="docutils literal notranslate"><spanclass="pre">teleport</span></code> command to optionally
allow to limit teleportation of an object or to a specific destination.</p></li>
<li><p>Add <codeclass="docutils literal notranslate"><spanclass="pre">settings.MXP_ENABLED=True</span></code> and <codeclass="docutils literal notranslate"><spanclass="pre">settings.MXP_OUTGOING_ONLY=True</span></code> as sane defaults,
to avoid known security issues with players entering MXP links.</p></li>
<li><p>Add browser name to webclient <codeclass="docutils literal notranslate"><spanclass="pre">CLIENT_NAME</span></code> in <codeclass="docutils literal notranslate"><spanclass="pre">session.protocol_flags</span></code>, e.g.
<codeclass="docutils literal notranslate"><spanclass="pre">"Evennia</span><spanclass="pre">webclient</span><spanclass="pre">(websocket:firefox)"</span></code> or <codeclass="docutils literal notranslate"><spanclass="pre">"evennia</span><spanclass="pre">webclient</span><spanclass="pre">(ajax:chrome)"</span></code>.</p></li>
<li><p><codeclass="docutils literal notranslate"><spanclass="pre">TagHandler.add/has(tag=...)</span></code> kwarg changed to <codeclass="docutils literal notranslate"><spanclass="pre">add/has(key=...)</span></code> for consistency
bool True/False if deletion was successful (like <codeclass="docutils literal notranslate"><spanclass="pre">DefaultObject.delete</span></code> before them)</p></li>
<li><p><codeclass="docutils literal notranslate"><spanclass="pre">contrib.custom_gametime</span></code> days/weeks/months now always starts from 1 (to match
the standard calendar form … there is no month 0 every year after all).</p></li>
<li><p><codeclass="docutils literal notranslate"><spanclass="pre">AttributeProperty</span></code>/<codeclass="docutils literal notranslate"><spanclass="pre">NAttributeProperty</span></code> to allow managing Attributes/NAttributes
on typeclasses in the same way as Django fields.</p></li>
<li><p>Give build/system commands a <codeclass="docutils literal notranslate"><spanclass="pre">@name</span></code> to fall back to if the non-@ name is used
by another command (like <codeclass="docutils literal notranslate"><spanclass="pre">open</span></code> and <codeclass="docutils literal notranslate"><spanclass="pre">@open</span></code>. If no duplicate, @ is optional.</p></li>
<li><p>Move legacy channel-management commands (<codeclass="docutils literal notranslate"><spanclass="pre">ccreate</span></code>, <codeclass="docutils literal notranslate"><spanclass="pre">addcom</span></code> etc) to a contrib
since their work is now fully handled by the single <codeclass="docutils literal notranslate"><spanclass="pre">channel</span></code> command.</p></li>
<li><p>Expand <codeclass="docutils literal notranslate"><spanclass="pre">examine</span></code> command’s code to much more extensible and modular. Show
attribute categories and value types (when not strings).</p></li>
to <codeclass="docutils literal notranslate"><spanclass="pre">.remove(key,</span><spanclass="pre">category=None,</span><spanclass="pre">return_exception=False,</span><spanclass="pre">...)</span></code> for consistency.</p></li>
<li><p>New <codeclass="docutils literal notranslate"><spanclass="pre">command</span><spanclass="pre">cooldown</span></code> contrib for making it easier to manage commands using
dynamic cooldowns between uses (owllex)</p></li>
<li><p>Restructured <codeclass="docutils literal notranslate"><spanclass="pre">contrib/</span></code> folder, placing all contribs as separate packages under
subfolders. All imports will need to be updated.</p></li>
<li><p>Made <codeclass="docutils literal notranslate"><spanclass="pre">MonitorHandler.add/remove</span></code> support <codeclass="docutils literal notranslate"><spanclass="pre">category</span></code> for monitoring Attributes
with a category (before only key was used, ignoring category entirely).</p></li>
<li><p>Move <codeclass="docutils literal notranslate"><spanclass="pre">create_*</span></code> functions into db managers, leaving <codeclass="docutils literal notranslate"><spanclass="pre">utils.create</span></code> only being
wrapper functions (consistent with <codeclass="docutils literal notranslate"><spanclass="pre">utils.search</span></code>). No change of api otherwise.</p></li>
<li><p>Add support for <codeclass="docutils literal notranslate"><spanclass="pre">$dbref()</span></code> and <codeclass="docutils literal notranslate"><spanclass="pre">$search</span></code> when assigning an Attribute value
with the <codeclass="docutils literal notranslate"><spanclass="pre">set</span></code> command. This allows assigning real objects from in-game.</p></li>
<li><p>Add ability to examine <codeclass="docutils literal notranslate"><spanclass="pre">/script</span></code> and <codeclass="docutils literal notranslate"><spanclass="pre">/channel</span></code> entities with <codeclass="docutils literal notranslate"><spanclass="pre">examine</span></code> command.</p></li>
<li><p>Homogenize manager search methods to return querysets and not lists.</p></li>
<li><p>Restructure unit tests to always honor default settings; make new parents in
on location for easy use in game dir.</p></li>
<li><p>The <codeclass="docutils literal notranslate"><spanclass="pre">Lunr</span></code> search engine used by help excludes common words; the settings-list
<codeclass="docutils literal notranslate"><spanclass="pre">LUNR_STOP_WORD_FILTER_EXCEPTIONS</span></code> can be extended to make sure common names are included.</p></li>
<li><p>Add <codeclass="docutils literal notranslate"><spanclass="pre">.deserialize()</span></code> method to <codeclass="docutils literal notranslate"><spanclass="pre">_Saver*</span></code> structures to help completely
decouple structures from database without needing separate import.</p></li>
<li><p>Add <codeclass="docutils literal notranslate"><spanclass="pre">run_in_main_thread</span></code> as a helper for those wanting to code server code
from a web view.</p></li>
<li><p>Update <codeclass="docutils literal notranslate"><spanclass="pre">evennia.utils.logger</span></code> to use Twisted’s new logging API. No change in Evennia API
except more standard aliases logger.error/info/exception/debug etc can now be used.</p></li>
<li><p>Have <codeclass="docutils literal notranslate"><spanclass="pre">type/force</span></code> default to <codeclass="docutils literal notranslate"><spanclass="pre">update</span></code>-mode rather than <codeclass="docutils literal notranslate"><spanclass="pre">reset</span></code>mode and add more verbose
warning when using reset mode.</p></li>
<li><p>Attribute storage support defaultdics (Hendher)</p></li>
<li><p>Add ObjectParent mixin to default game folder template as an easy, ready-made
way to override features on all ObjectDB-inheriting objects easily.
source location, mimicking behavior of <codeclass="docutils literal notranslate"><spanclass="pre">at_pre_move</span></code> hook - returning False will abort move.</p></li>
<li><p>Add <codeclass="docutils literal notranslate"><spanclass="pre">TagProperty</span></code>, <codeclass="docutils literal notranslate"><spanclass="pre">AliasProperty</span></code> and <codeclass="docutils literal notranslate"><spanclass="pre">PermissionProperty</span></code> to assign these
data in a similar way to django fields.</p></li>
<li><p>New <codeclass="docutils literal notranslate"><spanclass="pre">at_pre_object_receive(obj,</span><spanclass="pre">source_location)</span></code> method on Objects. Called on
destination, mimicking behavior of <codeclass="docutils literal notranslate"><spanclass="pre">at_pre_move</span></code> hook - returning False will abort move.</p></li>
<li><p>New <codeclass="docutils literal notranslate"><spanclass="pre">at_pre_object_leave(obj,</span><spanclass="pre">destination)</span></code> method on Objects. Called on</p></li>
<li><p>The db pickle-serializer now checks for methods <codeclass="docutils literal notranslate"><spanclass="pre">__serialize_dbobjs__</span></code> and <codeclass="docutils literal notranslate"><spanclass="pre">__deserialize_dbobjs__</span></code>
to allow custom packing/unpacking of nested dbobjs, to allow storing in Attribute.</p></li>
<li><p>Optimizations to rpsystem contrib performance. Breaking change: <codeclass="docutils literal notranslate"><spanclass="pre">.get_sdesc()</span></code> will
now return <codeclass="docutils literal notranslate"><spanclass="pre">None</span></code> instead of <codeclass="docutils literal notranslate"><spanclass="pre">.db.desc</span></code> if no sdesc is set; fallback in hook (inspectorCaracal)</p></li>
<li><p>Reworked text2html parser to avoid problems with stateful color tags (inspectorCaracal)</p></li>
<li><p>Simplified <codeclass="docutils literal notranslate"><spanclass="pre">EvMenu.options_formatter</span></code> hook to use <codeclass="docutils literal notranslate"><spanclass="pre">EvColumn</span></code> and f-strings (inspectorcaracal)</p></li>
<li><p>Allow <codeclass="docutils literal notranslate"><spanclass="pre">#</span><spanclass="pre">CODE</span></code>, <codeclass="docutils literal notranslate"><spanclass="pre">#</span><spanclass="pre">HEADER</span></code> etc as well as <codeclass="docutils literal notranslate"><spanclass="pre">#CODE</span></code>/<codeclass="docutils literal notranslate"><spanclass="pre">#HEADER</span></code> in batchcode
files - this works better with black linting.</p></li>
<li><p>Added <codeclass="docutils literal notranslate"><spanclass="pre">move_type</span></code> str kwarg to <codeclass="docutils literal notranslate"><spanclass="pre">move_to()</span></code> calls, optionally identifying the type of
move being done (‘teleport’, ‘disembark’, ‘give’ etc). (volund)</p></li>
<li><p>Made RPSystem contrib msg calls pass <codeclass="docutils literal notranslate"><spanclass="pre">pose</span></code> or <codeclass="docutils literal notranslate"><spanclass="pre">say</span></code> as msg-<codeclass="docutils literal notranslate"><spanclass="pre">type</span></code> for use in
e.g. webclient pane filtering where desired. (volund)</p></li>
<li><p>Added <codeclass="docutils literal notranslate"><spanclass="pre">Account.uses_screenreader(session=None)</span></code> as a quick shortcut for
finding if a user uses a screenreader (and adjust display accordingly).</p></li>
<li><p>Fixed bug in <codeclass="docutils literal notranslate"><spanclass="pre">cmdset.remove()</span></code> where a command could not be deleted by <codeclass="docutils literal notranslate"><spanclass="pre">key</span></code>,
even though doc suggested one could (ChrisLR)</p></li>
<li><p>New contrib <codeclass="docutils literal notranslate"><spanclass="pre">name_generator</span></code> for building random real-world based or fantasy-names
based on phonetic rules.</p></li>
<li><p>Enable proper serialization of dict subclasses in Attributes (aogier)</p></li>
<li><p><codeclass="docutils literal notranslate"><spanclass="pre">object.search</span></code> fuzzy-matching now uses <codeclass="docutils literal notranslate"><spanclass="pre">icontains</span></code> instead of <codeclass="docutils literal notranslate"><spanclass="pre">istartswith</span></code>
to better match how search works elsewhere (volund)</p></li>
<li><p>The <codeclass="docutils literal notranslate"><spanclass="pre">.at_traverse</span></code> hook now receives a <codeclass="docutils literal notranslate"><spanclass="pre">exit_obj</span></code> kwarg, linking back to the
exit triggering the hook (volund)</p></li>
<li><p>Contrib <codeclass="docutils literal notranslate"><spanclass="pre">buffs</span></code> for managing temporary and permanent RPG status buffs effects (tegiminis)</p></li>
<li><p>New <codeclass="docutils literal notranslate"><spanclass="pre">at_server_init()</span></code> hook called before all other startup hooks for all
startup modes. Used for more generic overriding (volund)</p></li>
<li><p>New <codeclass="docutils literal notranslate"><spanclass="pre">search</span></code> lock type used to completely hide an object from being found by
the <codeclass="docutils literal notranslate"><spanclass="pre">DefaultObject.search</span></code> (<codeclass="docutils literal notranslate"><spanclass="pre">caller.search</span></code>) method. (CloudKeeper)</p></li>
<li><p>Change setting <codeclass="docutils literal notranslate"><spanclass="pre">MULTISESSION_MODE</span></code> to now only control sessions, not how many
characters can be puppeted simultaneously. New settings now control that.</p></li>
<li><p>Add new setting <codeclass="docutils literal notranslate"><spanclass="pre">AUTO_CREATE_CHARACTER_WITH_ACCOUNT</span></code>, a boolean deciding if
the new account should also get a matching character (legacy MUD style).</p></li>
<li><p>Add new setting <codeclass="docutils literal notranslate"><spanclass="pre">AUTO_PUPPET_ON_LOGIN</span></code>, boolean deciding if one should
automatically puppet the last/available character on connection (legacy MUD style)</p></li>
<li><p>Add new setting <codeclass="docutils literal notranslate"><spanclass="pre">MAX_NR_SIMULTANEUS_PUPPETS</span></code> - how many puppets the account
can run at the same time. Used to limit multi-playing.</p></li>
<li><p>Make setting <codeclass="docutils literal notranslate"><spanclass="pre">MAX_NR_CHARACTERS</span></code> interact better with the new settings above.</p></li>
<li><p>Allow <codeclass="docutils literal notranslate"><spanclass="pre">$search</span></code> funcparser func to search tags and to accept kwargs for more
powerful searches passed into the regular search functions.</p></li>
<li><p><codeclass="docutils literal notranslate"><spanclass="pre">spawner.spawn</span></code> and linked methods now has a kwarg <codeclass="docutils literal notranslate"><spanclass="pre">protfunc_raise_errors</span></code>
(default True) to disable strict errors on malformed/not-found protfuncs</p></li>
<li><p>Improve search performance when having many DB-based prototypes via caching.</p></li>
<li><p>Remove the <codeclass="docutils literal notranslate"><spanclass="pre">return_parents</span></code> kwarg of <codeclass="docutils literal notranslate"><spanclass="pre">evennia.prototypes.spawner.spawn</span></code> since it
was inefficient and unused.</p></li>
<li><p>Made all id fields BigAutoField for all databases. (owllex)</p></li>
<li><p><codeclass="docutils literal notranslate"><spanclass="pre">EvForm</span></code> refactored. New <codeclass="docutils literal notranslate"><spanclass="pre">literals</span></code> mapping, for literal mappings into the
main template (e.g. for single-character replacements).</p></li>
<li><p><codeclass="docutils literal notranslate"><spanclass="pre">EvForm</span></code><codeclass="docutils literal notranslate"><spanclass="pre">cells</span></code> kwarg now accepts <codeclass="docutils literal notranslate"><spanclass="pre">EvCells</span></code> with custom formatting options
(mainly for custom align/valign). <codeclass="docutils literal notranslate"><spanclass="pre">EvCells</span></code> now makes use of <codeclass="docutils literal notranslate"><spanclass="pre">utils.justify</span></code>.</p></li>
<li><p><codeclass="docutils literal notranslate"><spanclass="pre">utils.justify</span></code> now supports <codeclass="docutils literal notranslate"><spanclass="pre">align="a"</span></code> (absolute alignments. This keeps
the given left indent but crops/fills to the width. Used in EvCells.</p></li>
<li><p><codeclass="docutils literal notranslate"><spanclass="pre">EvTable</span></code> now supports passing <codeclass="docutils literal notranslate"><spanclass="pre">EvColumn</span></code>s as a list directly, (<codeclass="docutils literal notranslate"><spanclass="pre">EvTable(table=[colA,colB])</span></code>)</p></li>
<li><p>Add <codeclass="docutils literal notranslate"><spanclass="pre">tags=</span></code> search criterion to <codeclass="docutils literal notranslate"><spanclass="pre">DefaultObject.search</span></code>.</p></li>
<li><p>Add <codeclass="docutils literal notranslate"><spanclass="pre">AT_EXIT_TRAVERSE</span></code> signal, firing when an exit is traversed.</p></li>
<li><p>Add integration between Evennia and Discord channels (PR by Inspector Cararacal)</p></li>
<li><p>Support for using a Godot-powered client with Evennia (PR by ChrisLR)</p></li>
<li><p>Added German translation (patch by Zhuraj)</p></li>
</ul>
</section>
<sectionid="evennia-0-9-5">
<h2>Evennia 0.9.5<aclass="headerlink"href="#evennia-0-9-5"title="Permalink to this headline">¶</a></h2>
<blockquote>
<div><p>2019-2020
Released 2020-11-14.
Transitional release, including new doc system.</p>
<li><p><codeclass="docutils literal notranslate"><spanclass="pre">is_typeclass(obj</span><spanclass="pre">(Object),</span><spanclass="pre">exact</span><spanclass="pre">(bool))</span></code> now defaults to exact=False</p></li>
<li><p><codeclass="docutils literal notranslate"><spanclass="pre">py</span></code> command now reroutes stdout to output results in-game client. <codeclass="docutils literal notranslate"><spanclass="pre">py</span></code>
without arguments starts a full interactive Python console.</p></li>
<li><p>Webclient default to a single input pane instead of two. Now defaults to no help-popup.</p></li>
<li><p>Webclient fix of prompt display</p></li>
<li><p>Webclient multimedia support for relaying images, video and sounds via
and <codeclass="docutils literal notranslate"><spanclass="pre">.msg(audio=URL)</span></code></p></li>
<li><p>Add Spanish translation (fermuch)</p></li>
<li><p>Expand <codeclass="docutils literal notranslate"><spanclass="pre">GLOBAL_SCRIPTS</span></code> container to always start scripts and to include all
global scripts regardless of how they were created.</p></li>
<li><p>Change settings to always use lists instead of tuples, to make mutable
settings easier to add to. (#1912)</p></li>
<li><p>Make new <codeclass="docutils literal notranslate"><spanclass="pre">CHANNEL_MUDINFO</span></code> setting for specifying the mudinfo channel</p></li>
<li><p>Make <codeclass="docutils literal notranslate"><spanclass="pre">CHANNEL_CONNECTINFO</span></code> take full channel definition</p></li>
<li><p>Make <codeclass="docutils literal notranslate"><spanclass="pre">DEFAULT_CHANNELS</span></code> list auto-create channels missing at reload</p></li>
<li><p>Webclient <codeclass="docutils literal notranslate"><spanclass="pre">ANSI->HTML</span></code> parser updated. Webclient line width changed from 1.6em to 1.1em
to better make ANSI graphics look the same as for third-party clients</p></li>
<li><p><codeclass="docutils literal notranslate"><spanclass="pre">AttributeHandler.get(return_list=True)</span></code> will return <codeclass="docutils literal notranslate"><spanclass="pre">[]</span></code> if there are no
Attributes instead of <codeclass="docutils literal notranslate"><spanclass="pre">[None]</span></code>.</p></li>
<li><p>Remove <codeclass="docutils literal notranslate"><spanclass="pre">pillow</span></code> requirement (install especially if using imagefield)</p></li>
<li><p>Add Simplified Korean translation (aceamro)</p></li>
<li><p>Show warning on <codeclass="docutils literal notranslate"><spanclass="pre">start</span><spanclass="pre">-l</span></code> if settings contains values unsafe for production.</p></li>
<li><p>Make code auto-formatted with Black.</p></li>
<li><p>Make default <codeclass="docutils literal notranslate"><spanclass="pre">set</span></code> command able to edit nested structures (PR by Aaron McMillan)</p></li>
<li><p>Allow running Evennia test suite from core repo with <codeclass="docutils literal notranslate"><spanclass="pre">make</span><spanclass="pre">test</span></code>.</p></li>
<li><p>Return <codeclass="docutils literal notranslate"><spanclass="pre">store_key</span></code> from <codeclass="docutils literal notranslate"><spanclass="pre">TickerHandler.add</span></code> and add <codeclass="docutils literal notranslate"><spanclass="pre">store_key</span></code> as a kwarg to
the <codeclass="docutils literal notranslate"><spanclass="pre">TickerHandler.remove</span></code> method. This makes it easier to manage tickers.</p></li>
<li><p>EvMore auto-justify now defaults to False since this works better with all types
of texts (such as tables). New <codeclass="docutils literal notranslate"><spanclass="pre">justify</span></code> bool. Old <codeclass="docutils literal notranslate"><spanclass="pre">justify_kwargs</span></code> remains
but is now only used to pass extra kwargs into the justify function.</p></li>
<li><p>EvMore <codeclass="docutils literal notranslate"><spanclass="pre">text</span></code> argument can now also be a list or a queryset. Querysets will be
sliced to only return the required data per page.</p></li>
<li><p>Improve performance of <codeclass="docutils literal notranslate"><spanclass="pre">find</span></code> and <codeclass="docutils literal notranslate"><spanclass="pre">objects</span></code> commands on large data sets (strikaco)</p></li>
<li><p>New <codeclass="docutils literal notranslate"><spanclass="pre">CHANNEL_HANDLER_CLASS</span></code> setting allows for replacing the ChannelHandler entirely.</p></li>
<li><p>Made <codeclass="docutils literal notranslate"><spanclass="pre">py</span></code> interactive mode support regular quit() and more verbose.</p></li>
<li><p>Made <codeclass="docutils literal notranslate"><spanclass="pre">Account.options.get</span></code> accept <codeclass="docutils literal notranslate"><spanclass="pre">default=None</span></code> kwarg to mimic other uses of get. Set
the new <codeclass="docutils literal notranslate"><spanclass="pre">raise_exception</span></code> boolean if ranting to raise KeyError on a missing key.</p></li>
<li><p>Moved behavior of unmodified <codeclass="docutils literal notranslate"><spanclass="pre">Command</span></code> and <codeclass="docutils literal notranslate"><spanclass="pre">MuxCommand</span></code><codeclass="docutils literal notranslate"><spanclass="pre">.func()</span></code> to new
<codeclass="docutils literal notranslate"><spanclass="pre">.get_command_info()</span></code> method for easier overloading and access. (Volund)</p></li>
and <codeclass="docutils literal notranslate"><spanclass="pre">SERVER_LOG_MAX_SIZE</span></code> (and equivalent for PORTAL) to control log rotation.</p></li>
<li><p>Addded <codeclass="docutils literal notranslate"><spanclass="pre">inside_rec</span></code> lockfunc - if room is locked, the normal <codeclass="docutils literal notranslate"><spanclass="pre">inside()</span></code> lockfunc will
fail e.g. for your inventory objs (since their loc is you), whereas this will pass.</p></li>
<li><p>RPSystem contrib’s CmdRecog will now list all recogs if no arg is given. Also multiple
bugfixes.</p></li>
<li><p>Remove <codeclass="docutils literal notranslate"><spanclass="pre">dummy@example.com</span></code> as a default account email when unset, a string is no longer
required by Django.</p></li>
<li><p>Fixes to <codeclass="docutils literal notranslate"><spanclass="pre">spawn</span></code>, make updating an existing prototype/object work better. Add <codeclass="docutils literal notranslate"><spanclass="pre">/raw</span></code> switch
to <codeclass="docutils literal notranslate"><spanclass="pre">spawn</span></code> command to extract the raw prototype dict for manual editing.</p></li>
<li><p><codeclass="docutils literal notranslate"><spanclass="pre">list_to_string</span></code> is now <codeclass="docutils literal notranslate"><spanclass="pre">iter_to_string</span></code> (but old name still works as legacy alias). It will
now accept any input, including generators and single values.</p></li>
<li><p>EvTable should now correctly handle columns with wider asian-characters in them.</p></li>
<li><p>Update Twisted requirement to >=2.3.0 to close security vulnerability</p></li>
<li><p>Add <codeclass="docutils literal notranslate"><spanclass="pre">$random</span></code> inlinefunc, supports minval,maxval arguments that can be ints and floats.</p></li>
<li><p>Add <codeclass="docutils literal notranslate"><spanclass="pre">evennia.utils.inlinefuncs.raw(<str>)</span></code> as a helper to escape inlinefuncs in a string.</p></li>
<li><p>Make CmdGet/Drop/Give give proper error if <codeclass="docutils literal notranslate"><spanclass="pre">obj.move_to</span></code> returns <codeclass="docutils literal notranslate"><spanclass="pre">False</span></code>.</p></li>
<li><p>Make <codeclass="docutils literal notranslate"><spanclass="pre">Object/Room/Exit.create</span></code>’s <codeclass="docutils literal notranslate"><spanclass="pre">account</span></code> argument optional. If not given, will set perms
to that of the object itself (along with normal Admin/Dev permission).</p></li>
<li><p>Make <codeclass="docutils literal notranslate"><spanclass="pre">INLINEFUNC_STACK_MAXSIZE</span></code> default visible in <codeclass="docutils literal notranslate"><spanclass="pre">settings_default.py</span></code>.</p></li>
<li><p>Change how <codeclass="docutils literal notranslate"><spanclass="pre">ic</span></code> finds puppets; non-priveleged users will use <codeclass="docutils literal notranslate"><spanclass="pre">_playable_characters</span></code> list as
candidates, Builders+ will use list, local search and only global search if no match found.</p></li>
<li><p>Make <codeclass="docutils literal notranslate"><spanclass="pre">cmd.at_post_cmd()</span></code> always run after <codeclass="docutils literal notranslate"><spanclass="pre">cmd.func()</span></code>, even when the latter uses delays
with yield.</p></li>
<li><p><codeclass="docutils literal notranslate"><spanclass="pre">EvMore</span></code> support for db queries and django paginators as well as easier to override for custom
pagination (e.g. to create EvTables for every page instead of splittine one table)</p></li>
<li><p>Using <codeclass="docutils literal notranslate"><spanclass="pre">EvMore</span><spanclass="pre">pagination</span></code>, dramatically improves performance of <codeclass="docutils literal notranslate"><spanclass="pre">spawn/list</span></code> and <codeclass="docutils literal notranslate"><spanclass="pre">scripts</span></code> listings
(100x speed increase for displaying 1000+ prototypes/scripts).</p></li>
<li><p><codeclass="docutils literal notranslate"><spanclass="pre">EvMenu</span></code> now uses the more logically named <codeclass="docutils literal notranslate"><spanclass="pre">.ndb._evmenu</span></code> instead of <codeclass="docutils literal notranslate"><spanclass="pre">.ndb._menutree</span></code> to store itself.
Both still work for backward compatibility, but <codeclass="docutils literal notranslate"><spanclass="pre">_menutree</span></code> is deprecated.</p></li>
<li><p><codeclass="docutils literal notranslate"><spanclass="pre">EvMenu.msg(txt)</span></code> added as a central place to send text to the user, makes it easier to override.
Default <codeclass="docutils literal notranslate"><spanclass="pre">EvMenu.msg</span></code> sends with OOB type=“menu” for use with OOB and webclient pane-redirects.</p></li>
<li><p>New EvMenu templating system for quickly building simpler EvMenus without as much code.</p></li>
<li><p>Add <codeclass="docutils literal notranslate"><spanclass="pre">Command.client_height()</span></code> method to match existing <codeclass="docutils literal notranslate"><spanclass="pre">.client_width</span></code> (stricako)</p></li>
<li><p>Include more Web-client info in <codeclass="docutils literal notranslate"><spanclass="pre">session.protocol_flags</span></code>.</p></li>
<li><p>Fixes in multi-match situations - don’t allow finding/listing multimatches for 3-box when
only two boxes in location.</p></li>
<li><p>Fix for TaskHandler with proper deferred returns/ability to cancel etc (PR by davewiththenicehat)</p></li>
<li><p>Add <codeclass="docutils literal notranslate"><spanclass="pre">PermissionHandler.check</span></code> method for straight string perm-checks without needing lockstrings.</p></li>
<li><p>Add <codeclass="docutils literal notranslate"><spanclass="pre">evennia.utils.utils.strip_unsafe_input</span></code> for removing html/newlines/tags from user input. The
<codeclass="docutils literal notranslate"><spanclass="pre">INPUT_CLEANUP_BYPASS_PERMISSIONS</span></code> is a list of perms that bypass this safety stripping.</p></li>
<li><p>Make default <codeclass="docutils literal notranslate"><spanclass="pre">set</span></code> and <codeclass="docutils literal notranslate"><spanclass="pre">examine</span></code> commands aware of Attribute categories.</p></li>
</ul>
</section>
<sectionid="evennia-0-9">
<h2>Evennia 0.9<aclass="headerlink"href="#evennia-0-9"title="Permalink to this headline">¶</a></h2>
<blockquote>
<div><p>2018-2019
Released Oct 2019</p>
</div></blockquote>
<sectionid="distribution">
<h3>Distribution<aclass="headerlink"href="#distribution"title="Permalink to this headline">¶</a></h3>
<ulclass="simple">
<li><p>New requirement: Python 3.7 (py2.7 support removed)</p></li>
<li><p>Django 2.1</p></li>
<li><p>Twisted 19.2.1</p></li>
<li><p>Autobahn websockets (removed old tmwx)</p></li>
<li><p>Docker image updated</p></li>
</ul>
</section>
<sectionid="commands">
<h3>Commands<aclass="headerlink"href="#commands"title="Permalink to this headline">¶</a></h3>
<ulclass="simple">
<li><p>Remove <codeclass="docutils literal notranslate"><spanclass="pre">@</span></code>-prefix from all default commands (prefixes still work, optional)</p></li>
<li><p>Add new <codeclass="docutils literal notranslate"><spanclass="pre">@force</span></code> command to have another object perform a command.</p></li>
<li><p>Add the Portal uptime to the <codeclass="docutils literal notranslate"><spanclass="pre">@time</span></code> command.</p></li>
<li><p>Make the <codeclass="docutils literal notranslate"><spanclass="pre">@link</span></code> command first make a local search before a global search.</p></li>
<li><p>Have the default Unloggedin-look command look for optional <codeclass="docutils literal notranslate"><spanclass="pre">connection_screen()</span></code> callable in
<codeclass="docutils literal notranslate"><spanclass="pre">mygame/server/conf/connection_screen.py</span></code>. This allows for more flexible welcome screens
that are calculated on the fly.</p></li>
<li><p><codeclass="docutils literal notranslate"><spanclass="pre">@py</span></code> command now defaults to escaping html tags in its output when viewing in the webclient.
Use new <codeclass="docutils literal notranslate"><spanclass="pre">/clientraw</span></code> switch to get old behavior (issue #1369).</p></li>
<li><p>Shorter and more informative, dynamic, listing of on-command vars if not
setting func() in child command class.</p></li>
<li><p>New Command helper methods</p>
<ul>
<li><p><codeclass="docutils literal notranslate"><spanclass="pre">.client_width()</span></code> returns client width of the session running the command.</p></li>
<li><p><codeclass="docutils literal notranslate"><spanclass="pre">.styled_table(*args,</span><spanclass="pre">**kwargs)</span></code> returns a formatted evtable styled by user’s options</p></li>
<h3>Web<aclass="headerlink"href="#web"title="Permalink to this headline">¶</a></h3>
<ulclass="simple">
<li><p>Change webclient from old txws version to use more supported/feature-rich Autobahn websocket library</p></li>
</ul>
<sectionid="evennia-game-index">
<h4>Evennia game index<aclass="headerlink"href="#evennia-game-index"title="Permalink to this headline">¶</a></h4>
<ulclass="simple">
<li><p>Made Evennia game index client a part of core - now configured from settings file (old configs
need to be moved)</p></li>
<li><p>The <codeclass="docutils literal notranslate"><spanclass="pre">evennia</span><spanclass="pre">connections</span></code> command starts a wizard that helps you connect your game to the game index.</p></li>
<li><p>The game index now accepts games with no public telnet/webclient info (for early prototypes).</p></li>
<h4>New golden-layout based Webclient UI (@friarzen)<aclass="headerlink"href="#new-golden-layout-based-webclient-ui-friarzen"title="Permalink to this headline">¶</a></h4>
<ulclass="simple">
<li><p>Features</p>
<ul>
<li><p>Much slicker behavior and more professional look</p></li>
<li><p>Allows tabbing as well as click and drag of panes in any grid position</p></li>
<li><p>Renaming tabs, assignments of data tags and output types are simple per-pane menus now</p></li>
<li><p>Any number of input panes, with separate histories</p></li>
<li><p>Button UI (disabled in JS by default)</p></li>
<h4>Web/Django standard initiative (@strikaco)<aclass="headerlink"href="#web-django-standard-initiative-strikaco"title="Permalink to this headline">¶</a></h4>
<ulclass="simple">
<li><p>Features</p>
<ul>
<li><p>Adds a series of web-based forms and generic class-based views</p>
<ul>
<li><p>Accounts</p>
<ul>
<li><p>Register - Enhances registration; allows optional collection of email address</p></li>
<li><p>Form - Adds a generic Django form for creating Accounts from the web</p></li>
</ul>
</li>
<li><p>Characters</p>
<ul>
<li><p>Create - Authenticated users can create new characters from the website (requires associated form)</p></li>
<li><p>Detail - Authenticated and authorized users can view select details about characters</p></li>
<li><p>List - Authenticated and authorized users can browse a list of all characters</p></li>
<li><p>Manage - Authenticated users can edit or delete owned characters from the web</p></li>
<li><p>Form - Adds a generic Django form for creating characters from the web</p></li>
</ul>
</li>
<li><p>Channels</p>
<ul>
<li><p>Detail - Authorized users can view channel logs from the web</p></li>
<li><p>List - Authorized users can browse a list of all channels</p></li>
</ul>
</li>
<li><p>Help Entries</p>
<ul>
<li><p>Detail - Authorized users can view help entries from the web</p></li>
<li><p>List - Authorized users can browse a list of all help entries from the web</p></li>
</ul>
</li>
</ul>
</li>
<li><p>Navbar changes</p>
<ul>
<li><p>Characters - Link to character list</p></li>
<li><p>Channels - Link to channel list</p></li>
<li><p>Help - Link to help entry list</p></li>
<li><p>Puppeting</p>
<ul>
<li><p>Users can puppet their own characters within the context of the website</p></li>
</ul>
</li>
<li><p>Dropdown</p>
<ul>
<li><p>Link to create characters</p></li>
<li><p>Link to manage characters</p></li>
<li><p>Link to quick-select puppets</p></li>
<li><p>Link to password change workflow</p></li>
</ul>
</li>
</ul>
</li>
</ul>
</li>
<li><p>Functions</p>
<ul>
<li><p>Updates Bootstrap to v4 stable</p></li>
<li><p>Enables use of Django Messages framework to communicate with users in browser</p></li>
<li><p>Implements webclient/website <codeclass="docutils literal notranslate"><spanclass="pre">_shared_login</span></code> functionality as Django middleware</p></li>
<li><p>‘account’ and ‘puppet’ are added to all request contexts for authenticated users</p></li>
<li><p>Adds unit tests for all web views</p></li>
</ul>
</li>
<li><p>Cosmetic</p>
<ul>
<li><p>Prettifies Django ‘forgot password’ workflow (requires SMTP to actually function)</p></li>
<li><p>Fixes bug on login page where error messages were not being displayed</p></li>
<li><p>Remove strvalue field from admin; it made no sense to have here, being an optimization field
for internal use.</p></li>
</ul>
</li>
</ul>
</section>
</section>
<sectionid="prototypes">
<h3>Prototypes<aclass="headerlink"href="#prototypes"title="Permalink to this headline">¶</a></h3>
<ulclass="simple">
<li><p><codeclass="docutils literal notranslate"><spanclass="pre">evennia.prototypes.save_prototype</span></code> now takes the prototype as a normal
argument (<codeclass="docutils literal notranslate"><spanclass="pre">prototype</span></code>) instead of having to give it as <codeclass="docutils literal notranslate"><spanclass="pre">**prototype</span></code>.</p></li>
<li><p><codeclass="docutils literal notranslate"><spanclass="pre">evennia.prototypes.search_prototype</span></code> has a new kwarg <codeclass="docutils literal notranslate"><spanclass="pre">require_single=False</span></code> that
raises a KeyError exception if query gave 0 or >1 results.</p></li>
<li><p><codeclass="docutils literal notranslate"><spanclass="pre">evennia.prototypes.spawner</span></code> can now spawn by passing a <codeclass="docutils literal notranslate"><spanclass="pre">prototype_key</span></code></p></li>
</ul>
</section>
<sectionid="typeclasses">
<h3>Typeclasses<aclass="headerlink"href="#typeclasses"title="Permalink to this headline">¶</a></h3>
<ulclass="simple">
<li><p>Add new methods on all typeclasses, useful specifically for object handling from the website/admin:</p>
<ul>
<li><p><codeclass="docutils literal notranslate"><spanclass="pre">web_get_admin_url()</span></code>: Returns the path to the object detail page in the Admin backend.</p></li>
<li><p><codeclass="docutils literal notranslate"><spanclass="pre">web_get_create_url()</span></code>: Returns the path to the typeclass’ creation page on the website, if implemented.</p></li>
<li><p><codeclass="docutils literal notranslate"><spanclass="pre">web_get_absolute_url()</span></code>: Returns the path to the object’s detail page on the website, if implemented.</p></li>
<li><p><codeclass="docutils literal notranslate"><spanclass="pre">web_get_update_url()</span></code>: Returns the path to the object’s update page on the website, if implemented.</p></li>
<li><p><codeclass="docutils literal notranslate"><spanclass="pre">web_get_delete_url()</span></code>: Returns the path to the object’s delete page on the website, if implemented.</p></li>
</ul>
</li>
<li><p>All typeclasses have new helper class method <codeclass="docutils literal notranslate"><spanclass="pre">create</span></code>, which encompasses useful functionality
that used to be embedded for example in the respective <codeclass="docutils literal notranslate"><spanclass="pre">@create</span></code> or <codeclass="docutils literal notranslate"><spanclass="pre">@connect</span></code> commands.</p></li>
<li><p>DefaultAccount now has new class methods implementing many things that used to be in unloggedin
commands (these can now be customized on the class instead):</p>
<ul>
<li><p><codeclass="docutils literal notranslate"><spanclass="pre">is_banned()</span></code>: Checks if a given username or IP is banned.</p></li>
<li><p><codeclass="docutils literal notranslate"><spanclass="pre">get_username_validators</span></code>: Return list of validators for username validation (see
<li><p><codeclass="docutils literal notranslate"><spanclass="pre">authenticate</span></code>: Method to check given username/password.</p></li>
<li><p><codeclass="docutils literal notranslate"><spanclass="pre">normalize_username</span></code>: Normalizes names so (for Unicode environments) users cannot mimic existing usernames by replacing select characters with visually-similar Unicode chars.</p></li>
<li><p><codeclass="docutils literal notranslate"><spanclass="pre">validate_username</span></code>: Mechanism for validating a username based on predefined Django validators.</p></li>
<li><p><codeclass="docutils literal notranslate"><spanclass="pre">validate_password</span></code>: Mechanism for validating a password based on predefined Django validators.</p></li>
<li><p><codeclass="docutils literal notranslate"><spanclass="pre">set_password</span></code>: Apply password to account, using validation checks.</p></li>
</ul>
</li>
<li><p><codeclass="docutils literal notranslate"><spanclass="pre">AttributeHandler.remove</span></code> and <codeclass="docutils literal notranslate"><spanclass="pre">TagHandler.remove</span></code> can now be used to delete by-category. If neither
key nor category is given, they now work the same as .clear().</p></li>
</ul>
</section>
<sectionid="protocols">
<h3>Protocols<aclass="headerlink"href="#protocols"title="Permalink to this headline">¶</a></h3>
<ulclass="simple">
<li><p>Support for <codeclass="docutils literal notranslate"><spanclass="pre">Grapevine</span></code> MUD-chat network (“channels” supported)</p></li>
</ul>
</section>
<sectionid="server">
<h3>Server<aclass="headerlink"href="#server"title="Permalink to this headline">¶</a></h3>
<ulclass="simple">
<li><p>Convert ServerConf model to store its values as a Picklefield (same as
Attributes) instead of using a custom solution.</p></li>
<li><p>OOB: Add support for MSDP LIST, REPORT, UNREPORT commands (re-mapped to <codeclass="docutils literal notranslate"><spanclass="pre">msdp_list</span></code>,
<li><p>Added <codeclass="docutils literal notranslate"><spanclass="pre">evennia.ANSIString</span></code> to flat API.</p></li>
<li><p>Server/Portal log files now cycle to names on the form <codeclass="docutils literal notranslate"><spanclass="pre">server_.log_19_03_08_</span></code> instead of <codeclass="docutils literal notranslate"><spanclass="pre">server.log___19.3.8</span></code>, retaining
unix file sorting order.</p></li>
<li><p>Django signals fire for important events: Puppet/Unpuppet, Object create/rename, Login,
<h3>Settings<aclass="headerlink"href="#settings"title="Permalink to this headline">¶</a></h3>
<ulclass="simple">
<li><p><codeclass="docutils literal notranslate"><spanclass="pre">GLOBAL_SCRIPTS</span></code> - dict defining typeclasses of global scripts to store on the new
<codeclass="docutils literal notranslate"><spanclass="pre">evennia.GLOBAL_SCRIPTS</span></code> container. These will auto-start when Evennia start and will always
exist.</p></li>
<li><p><codeclass="docutils literal notranslate"><spanclass="pre">OPTIONS_ACCOUNTS_DEFAULT</span></code> - option dict with option defaults and Option classes</p></li>
<li><p><codeclass="docutils literal notranslate"><spanclass="pre">OPTION_CLASS_MODULES</span></code> - classes representing an on-Account Option, on special form</p></li>
<li><p><codeclass="docutils literal notranslate"><spanclass="pre">VALIDATOR_FUNC_MODULES</span></code> - (general) text validator functions, for verifying an input
is on a specific form.</p></li>
</ul>
</section>
<sectionid="utils">
<h3>Utils<aclass="headerlink"href="#utils"title="Permalink to this headline">¶</a></h3>
<ulclass="simple">
<li><p><codeclass="docutils literal notranslate"><spanclass="pre">evennia</span></code> launcher now fully handles all django-admin commands, like running tests in parallel.</p></li>
<li><p><codeclass="docutils literal notranslate"><spanclass="pre">evennia.utils.create.account</span></code> now also takes <codeclass="docutils literal notranslate"><spanclass="pre">tags</span></code> and <codeclass="docutils literal notranslate"><spanclass="pre">attrs</span></code> keywords.</p></li>
<li><p><codeclass="docutils literal notranslate"><spanclass="pre">evennia.utils.interactive</span></code> decorator can now allow you to use yield(secs) to pause operation
in any function, not just in Command.func. Likewise, response = yield(question) will work
if the decorated function has an argument or kwarg <codeclass="docutils literal notranslate"><spanclass="pre">caller</span></code>.</p></li>
<li><p>Added many more unit tests.</p></li>
<li><p>Swap argument order of <codeclass="docutils literal notranslate"><spanclass="pre">evennia.set_trace</span></code> to <codeclass="docutils literal notranslate"><spanclass="pre">set_trace(term_size=(140,</span><spanclass="pre">40),</span><spanclass="pre">debugger='auto')</span></code>
since the size is more likely to be changed on the command line.</p></li>
<li><p><codeclass="docutils literal notranslate"><spanclass="pre">utils.to_str(text,</span><spanclass="pre">session=None)</span></code> now acts as the old <codeclass="docutils literal notranslate"><spanclass="pre">utils.to_unicode</span></code> (which was removed).
This converts to the str() type (not to a byte-string as in Evennia 0.8), trying different
encodings. This function will also force-convert any object passed to it into a string (so
<codeclass="docutils literal notranslate"><spanclass="pre">force_string</span></code> flag was removed and assumed always set).</p></li>
<li><p><codeclass="docutils literal notranslate"><spanclass="pre">utils.to_bytes(text,</span><spanclass="pre">session=None)</span></code> replaces the old <codeclass="docutils literal notranslate"><spanclass="pre">utils.to_str()</span></code> functionality and converts
str to bytes.</p></li>
<li><p><codeclass="docutils literal notranslate"><spanclass="pre">evennia.MONITOR_HANDLER.all</span></code> now takes keyword argument <codeclass="docutils literal notranslate"><spanclass="pre">obj</span></code> to only retrieve monitors from that specific
Object (rather than all monitors in the entire handler).</p></li>
<li><p>Support adding <codeclass="docutils literal notranslate"><spanclass="pre">\f</span></code> in command doc strings to force where EvMore puts page breaks.</p></li>
<li><p>Validation Functions now added with standard API to homogenize user input validation.</p></li>
<li><p>Option Classes added to make storing user-options easier and smoother.</p></li>
<li><p><codeclass="docutils literal notranslate"><spanclass="pre">evennia.VALIDATOR_CONTAINER</span></code> and <codeclass="docutils literal notranslate"><spanclass="pre">evennia.OPTION_CONTAINER</span></code> added to load these.</p></li>
</ul>
</section>
<sectionid="contribs">
<h3>Contribs<aclass="headerlink"href="#contribs"title="Permalink to this headline">¶</a></h3>
<ulclass="simple">
<li><p>Evscaperoom - a full puzzle engine for making multiplayer escape rooms in Evennia. Used to make
the entry for the MUD-Coder’s Guild’s 2019 Game Jam with the theme “One Room”, where it ranked #1.</p></li>
<li><p>Evennia game-index client no longer a contrib - moved into server core and configured with new
<li><p>The <codeclass="docutils literal notranslate"><spanclass="pre">extended_room</span></code> contrib saw some backwards-incompatible refactoring:</p>
<ul>
<li><p>All commands now begin with <codeclass="docutils literal notranslate"><spanclass="pre">CmdExtendedRoom</span></code>. So before it was <codeclass="docutils literal notranslate"><spanclass="pre">CmdExtendedLook</span></code>, now
<li><p>The <codeclass="docutils literal notranslate"><spanclass="pre">detail</span></code> command was broken out of the <codeclass="docutils literal notranslate"><spanclass="pre">desc</span></code> command and is now a new, stand-alone command
<codeclass="docutils literal notranslate"><spanclass="pre">CmdExtendedRoomDetail</span></code>. This was done to make things easier to extend and to mimic how the detail
command works in the tutorial-world.</p></li>
<li><p>The <codeclass="docutils literal notranslate"><spanclass="pre">detail</span></code> command now also supports deleting details (like the tutorial-world version).</p></li>
<li><p>The new <codeclass="docutils literal notranslate"><spanclass="pre">ExtendedRoomCmdSet</span></code> includes all the extended-room commands and is now the recommended way
to install the extended-room contrib.</p></li>
</ul>
</li>
<li><p>Reworked <codeclass="docutils literal notranslate"><spanclass="pre">menu_login</span></code> contrib to use latest EvMenu standards. Now also supports guest logins.</p></li>
<li><p>Mail contrib was refactored to have optional Command classes <codeclass="docutils literal notranslate"><spanclass="pre">CmdMail</span></code> for OOC+IC mail (added
to the CharacterCmdSet and <codeclass="docutils literal notranslate"><spanclass="pre">CmdMailCharacter</span></code> for IC-only mailing between chars (added to CharacterCmdSet)</p></li>
</ul>
</section>
<sectionid="translations">
<h3>Translations<aclass="headerlink"href="#translations"title="Permalink to this headline">¶</a></h3>
<ulclass="simple">
<li><p>Simplified chinese, courtesy of user MaxAlex.</p></li>
</ul>
</section>
</section>
<sectionid="evennia-0-8">
<h2>Evennia 0.8<aclass="headerlink"href="#evennia-0-8"title="Permalink to this headline">¶</a></h2>
<blockquote>
<div><p>2017-2018
Released Nov 2018</p>
</div></blockquote>
<sectionid="requirements">
<h3>Requirements<aclass="headerlink"href="#requirements"title="Permalink to this headline">¶</a></h3>
<ulclass="simple">
<li><p>Up requirements to Django 1.11.x, Twisted 18 and pillow 5.2.0</p></li>
<li><p>Add <codeclass="docutils literal notranslate"><spanclass="pre">inflect</span></code> dependency for automatic pluralization of object names.</p></li>
</ul>
</section>
<sectionid="server-portal">
<h3>Server/Portal<aclass="headerlink"href="#server-portal"title="Permalink to this headline">¶</a></h3>
<li><p>Both Portal/Server are now stand-alone processes (easy to run as daemon)</p></li>
<li><p>Made Portal the AMP Server for starting/restarting the Server (the AMP client)</p></li>
<li><p>Dynamic logging now happens using <codeclass="docutils literal notranslate"><spanclass="pre">evennia</span><spanclass="pre">-l</span></code> rather than by interactive mode.</p></li>
<li><p>Made AMP secure against erroneous HTTP requests on the wrong port (return error messages).</p></li>
<li><p>The <codeclass="docutils literal notranslate"><spanclass="pre">evennia</span><spanclass="pre">istart</span></code> option will start/switch the Server in foreground (interactive) mode, where it logs
to terminal and can be stopped with Ctrl-C. Using <codeclass="docutils literal notranslate"><spanclass="pre">evennia</span><spanclass="pre">reload</span></code>, or reloading in-game, will
return Server to normal daemon operation.</p></li>
<li><p>For validating passwords, use safe Django password-validation backend instead of custom Evennia one.</p></li>
<li><p>Alias <codeclass="docutils literal notranslate"><spanclass="pre">evennia</span><spanclass="pre">restart</span></code> to mean the same as <codeclass="docutils literal notranslate"><spanclass="pre">evennia</span><spanclass="pre">reload</span></code>.</p></li>
</ul>
</section>
<sectionid="prototype-changes">
<h3>Prototype changes<aclass="headerlink"href="#prototype-changes"title="Permalink to this headline">¶</a></h3>
<ulclass="simple">
<li><p>New OLC started from <codeclass="docutils literal notranslate"><spanclass="pre">olc</span></code> command for loading/saving/manipulating prototypes in a menu.</p></li>
<li><p>Moved evennia/utils/spawner.py into the new evennia/prototypes/ along with all new
functionality around prototypes.</p></li>
<li><p>A new form of prototype - database-stored prototypes, editable from in-game, was added. The old,
module-created prototypes remain as read-only prototypes.</p></li>
<li><p>All prototypes must have a key <codeclass="docutils literal notranslate"><spanclass="pre">prototype_key</span></code> identifying the prototype in listings. This is
checked to be server-unique. Prototypes created in a module will use the global variable name they
are assigned to if no <codeclass="docutils literal notranslate"><spanclass="pre">prototype_key</span></code> is given.</p></li>
<li><p>Prototype field <codeclass="docutils literal notranslate"><spanclass="pre">prototype</span></code> was renamed to <codeclass="docutils literal notranslate"><spanclass="pre">prototype_parent</span></code> to avoid mixing terms.</p></li>
<li><p>All prototypes must either have <codeclass="docutils literal notranslate"><spanclass="pre">typeclass</span></code> or <codeclass="docutils literal notranslate"><spanclass="pre">prototype_parent</span></code> defined. If using
<codeclass="docutils literal notranslate"><spanclass="pre">prototype_parent</span></code>, <codeclass="docutils literal notranslate"><spanclass="pre">typeclass</span></code> must be defined somewhere in the inheritance chain. This is a
change from Evennia 0.7 which allowed ‘mixin’ prototypes without <codeclass="docutils literal notranslate"><spanclass="pre">typeclass</span></code>/<codeclass="docutils literal notranslate"><spanclass="pre">prototype_key</span></code>. To
make a mixin now, give it a default typeclass, like <codeclass="docutils literal notranslate"><spanclass="pre">evennia.objects.objects.DefaultObject</span></code> and just
override in the child as needed.</p></li>
<li><p>Spawning an object using a prototype will automatically assign a new tag to it, named the same as
the <codeclass="docutils literal notranslate"><spanclass="pre">prototype_key</span></code> and with the category <codeclass="docutils literal notranslate"><spanclass="pre">from_prototype</span></code>.</p></li>
<li><p>The spawn command was extended to accept a full prototype on one line.</p></li>
<li><p>The spawn command got the /save switch to save the defined prototype and its key</p></li>
<li><p>The command spawn/menu will now start an OLC (OnLine Creation) menu to load/save/edit/spawn prototypes.</p></li>
</ul>
</section>
<sectionid="evmenu">
<h3>EvMenu<aclass="headerlink"href="#evmenu"title="Permalink to this headline">¶</a></h3>
<ulclass="simple">
<li><p>Added <codeclass="docutils literal notranslate"><spanclass="pre">EvMenu.helptext_formatter(helptext)</span></code> to allow custom formatting of per-node help.</p></li>
<li><p>Added <codeclass="docutils literal notranslate"><spanclass="pre">evennia.utils.evmenu.list_node</span></code> decorator for turning an EvMenu node into a multi-page listing.</p></li>
<li><p>A <codeclass="docutils literal notranslate"><spanclass="pre">goto</span></code> option callable returning None (rather than the name of the next node) will now rerun the
current node instead of failing.</p></li>
<li><p>Better error handling of in-node syntax errors.</p></li>
<li><p>Improve dedent of default text/helptext formatter. Right-strip whitespace.</p></li>
<li><p>Add <codeclass="docutils literal notranslate"><spanclass="pre">debug</span></code> option when creating menu - this turns off persistence and makes the <codeclass="docutils literal notranslate"><spanclass="pre">menudebug</span></code>
command available for examining the current menu state.</p></li>
</ul>
</section>
<sectionid="webclient">
<h3>Webclient<aclass="headerlink"href="#webclient"title="Permalink to this headline">¶</a></h3>
<ulclass="simple">
<li><p>Webclient now uses a plugin system to inject new components from the html file.</p></li>
<li><p>Split-windows - divide input field into any number of horizontal/vertical panes and
assign different types of server messages to them.</p></li>
<li><p>Lots of cleanup and bug fixes.</p></li>
<li><p>Hot buttons plugin (friarzen) (disabled by default).</p></li>
</ul>
</section>
<sectionid="locks">
<h3>Locks<aclass="headerlink"href="#locks"title="Permalink to this headline">¶</a></h3>
<ulclass="simple">
<li><p>New function <codeclass="docutils literal notranslate"><spanclass="pre">evennia.locks.lockhandler.check_lockstring</span></code>. This allows for checking an object
against an arbitrary lockstring without needing the lock to be stored on an object first.</p></li>
<li><p>New function <codeclass="docutils literal notranslate"><spanclass="pre">evennia.locks.lockhandler.validate_lockstring</span></code> allows for stand-alone validation
of a lockstring.</p></li>
<li><p>New function <codeclass="docutils literal notranslate"><spanclass="pre">evennia.locks.lockhandler.get_all_lockfuncs</span></code> gives a dict {“name”: lockfunc} for
all available lock funcs. This is useful for dynamic listings.</p></li>
</ul>
</section>
<sectionid="id1">
<h3>Utils<aclass="headerlink"href="#id1"title="Permalink to this headline">¶</a></h3>
<ulclass="simple">
<li><p>Added new <codeclass="docutils literal notranslate"><spanclass="pre">columnize</span></code> function for easily splitting text into multiple columns. At this point it
is not working too well with ansi-colored text however.</p></li>
<li><p>Extend the <codeclass="docutils literal notranslate"><spanclass="pre">dedent</span></code> function with a new <codeclass="docutils literal notranslate"><spanclass="pre">baseline_index</span></code> kwarg. This allows to force all lines to
the indentation given by the given line regardless of if other lines were already a 0 indentation.
This removes a problem with the original <codeclass="docutils literal notranslate"><spanclass="pre">textwrap.dedent</span></code> which will only dedent to the least
indented part of a text.</p></li>
<li><p>Added <codeclass="docutils literal notranslate"><spanclass="pre">exit_cmd</span></code> to EvMore pager, to allow for calling a command (e.g. ‘look’) when leaving the pager.</p></li>
<li><p><codeclass="docutils literal notranslate"><spanclass="pre">get_all_typeclasses</span></code> will return dict <codeclass="docutils literal notranslate"><spanclass="pre">{"path":</span><spanclass="pre">typeclass,</span><spanclass="pre">...}</span></code> for all typeclasses available
in the system. This is used by the new <codeclass="docutils literal notranslate"><spanclass="pre">@typeclass/list</span></code> subcommand (useful for builders etc).</p></li>
<li><p><codeclass="docutils literal notranslate"><spanclass="pre">evennia.utils.dbserialize.deserialize(obj)</span></code> is a new helper function to <em>completely</em> disconnect
a mutable recovered from an Attribute from the database. This will convert all nested <codeclass="docutils literal notranslate"><spanclass="pre">_Saver*</span></code>
classes to their plain-Python counterparts.</p></li>
</ul>
</section>
<sectionid="general">
<h3>General<aclass="headerlink"href="#general"title="Permalink to this headline">¶</a></h3>
<ulclass="simple">
<li><p>Start structuring the <codeclass="docutils literal notranslate"><spanclass="pre">CHANGELOG</span></code> to list features in more detail.</p></li>
<li><p>Docker image <codeclass="docutils literal notranslate"><spanclass="pre">evennia/evennia:develop</span></code> is now auto-built, tracking the develop branch.</p></li>
<li><p>Inflection and grouping of multiple objects in default room (an box, three boxes)</p></li>
<li><p><codeclass="docutils literal notranslate"><spanclass="pre">evennia.set_trace()</span></code> is now a shortcut for launching pdb/pudb on a line in the Evennia event loop.</p></li>
<li><p>Removed the enforcing of <codeclass="docutils literal notranslate"><spanclass="pre">MAX_NR_CHARACTERS=1</span></code> for <codeclass="docutils literal notranslate"><spanclass="pre">MULTISESSION_MODE</span></code><codeclass="docutils literal notranslate"><spanclass="pre">0</span></code> and <codeclass="docutils literal notranslate"><spanclass="pre">1</span></code> by default.</p></li>
<li><p>Add <codeclass="docutils literal notranslate"><spanclass="pre">evennia.utils.logger.log_sec</span></code> for logging security-related messages (marked SS in log).</p></li>
</ul>
</section>
<sectionid="id2">
<h3>Contribs<aclass="headerlink"href="#id2"title="Permalink to this headline">¶</a></h3>
<ulclass="simple">
<li><p><codeclass="docutils literal notranslate"><spanclass="pre">Auditing</span></code> (Johnny): Log and filter server input/output for security purposes</p></li>
<li><p><codeclass="docutils literal notranslate"><spanclass="pre">Build</span><spanclass="pre">Menu</span></code> (vincent-lg): New @edit command to edit object properties in a menu.</p></li>
<li><p><codeclass="docutils literal notranslate"><spanclass="pre">Tree</span><spanclass="pre">select</span></code> (Fluttersprite): Wrap EvMenu to create a common type of menu from a string.</p></li>
<li><p><codeclass="docutils literal notranslate"><spanclass="pre">Turnbattle</span><spanclass="pre">suite</span></code> (Tim Ashley Jenkins)- the old <codeclass="docutils literal notranslate"><spanclass="pre">turnbattle.py</span></code> was moved into its own
<codeclass="docutils literal notranslate"><spanclass="pre">turnbattle/</span></code> package and reworked with many different flavors of combat systems:</p></li>
<li><p><codeclass="docutils literal notranslate"><spanclass="pre">tb_basic</span></code> - The basic turnbattle system, with initiative/turn order attack/defense/damage.</p></li>
<li><p><codeclass="docutils literal notranslate"><spanclass="pre">tb_items</span></code> - Extends <codeclass="docutils literal notranslate"><spanclass="pre">tb_equip</span></code> with item use with conditions/status effects.</p></li>
<li><p><codeclass="docutils literal notranslate"><spanclass="pre">tb_magic</span></code> - Extends <codeclass="docutils literal notranslate"><spanclass="pre">tb_equip</span></code> with spellcasting.</p></li>
<li><p><codeclass="docutils literal notranslate"><spanclass="pre">tb_range</span></code> - Adds system for abstract positioning and movement.</p></li>
<li><p>The <codeclass="docutils literal notranslate"><spanclass="pre">extended_room</span></code> contrib saw some backwards-incompatible refactoring:</p>
<ul>
<li><p>All commands now begin with <codeclass="docutils literal notranslate"><spanclass="pre">CmdExtendedRoom</span></code>. So before it was <codeclass="docutils literal notranslate"><spanclass="pre">CmdExtendedLook</span></code>, now
<li><p>The <codeclass="docutils literal notranslate"><spanclass="pre">detail</span></code> command was broken out of the <codeclass="docutils literal notranslate"><spanclass="pre">desc</span></code> command and is now a new, stand-alone command
<codeclass="docutils literal notranslate"><spanclass="pre">CmdExtendedRoomDetail</span></code>. This was done to make things easier to extend and to mimic how the detail
command works in the tutorial-world.</p></li>
<li><p>The <codeclass="docutils literal notranslate"><spanclass="pre">detail</span></code> command now also supports deleting details (like the tutorial-world version).</p></li>
<li><p>The new <codeclass="docutils literal notranslate"><spanclass="pre">ExtendedRoomCmdSet</span></code> includes all the extended-room commands and is now the recommended way
to install the extended-room contrib.</p></li>
</ul>
</li>
<li><p>Updates and some cleanup of existing contribs.</p></li>
</ul>
</section>
<sectionid="internationalization">
<h3>Internationalization<aclass="headerlink"href="#internationalization"title="Permalink to this headline">¶</a></h3>