From fbd151ea7e6bac730bf638bbf4a2b5b7ea4cb88d Mon Sep 17 00:00:00 2001 From: Griatch Date: Sat, 14 Nov 2020 11:55:52 +0100 Subject: [PATCH] Updated HTML docs --- docs/0.9.5/.buildinfo | 2 +- ...-voice-operated-elevator-using-events.html | 2 + docs/0.9.5/API-refactoring.html | 2 + docs/0.9.5/Accounts.html | 2 + docs/0.9.5/Add-a-simple-new-web-page.html | 2 + docs/0.9.5/Add-a-wiki-on-your-website.html | 2 + docs/0.9.5/Adding-Command-Tutorial.html | 2 + .../Adding-Object-Typeclass-Tutorial.html | 2 + docs/0.9.5/Administrative-Docs.html | 2 + docs/0.9.5/Apache-Config.html | 2 + docs/0.9.5/Arxcode-installing-help.html | 2 + docs/0.9.5/Async-Process.html | 2 + docs/0.9.5/Attributes.html | 2 + docs/0.9.5/Banning.html | 2 + docs/0.9.5/Batch-Code-Processor.html | 2 + docs/0.9.5/Batch-Command-Processor.html | 2 + docs/0.9.5/Batch-Processors.html | 2 + docs/0.9.5/Bootstrap-&-Evennia.html | 2 + .../Bootstrap-Components-and-Utilities.html | 2 + docs/0.9.5/Builder-Docs.html | 4 +- docs/0.9.5/Building-Permissions.html | 2 + docs/0.9.5/Building-Quickstart.html | 2 + docs/0.9.5/Building-a-mech-tutorial.html | 2 + docs/0.9.5/Building-menus.html | 2 + docs/0.9.5/Choosing-An-SQL-Server.html | 2 + docs/0.9.5/Client-Support-Grid.html | 170 ++++++++++++------ docs/0.9.5/Coding-FAQ.html | 2 + docs/0.9.5/Coding-Introduction.html | 2 + docs/0.9.5/Coding-Utils.html | 2 + docs/0.9.5/Command-Cooldown.html | 2 + docs/0.9.5/Command-Duration.html | 2 + docs/0.9.5/Command-Prompt.html | 2 + docs/0.9.5/Command-Sets.html | 2 + docs/0.9.5/Command-System.html | 2 + docs/0.9.5/Commands.html | 2 + docs/0.9.5/Communications.html | 2 + docs/0.9.5/Connection-Screen.html | 2 + docs/0.9.5/Continuous-Integration.html | 2 + docs/0.9.5/Contributing-Docs.html | 80 +++------ docs/0.9.5/Contributing.html | 2 + docs/0.9.5/Coordinates.html | 2 + docs/0.9.5/Custom-Protocols.html | 2 + docs/0.9.5/Customize-channels.html | 2 + docs/0.9.5/Debugging.html | 2 + docs/0.9.5/Default-Command-Help.html | 2 + docs/0.9.5/Default-Exit-Errors.html | 2 + docs/0.9.5/Developer-Central.html | 2 + docs/0.9.5/Dialogues-in-events.html | 2 + docs/0.9.5/Directory-Overview.html | 2 + docs/0.9.5/Docs-refactoring.html | 2 + docs/0.9.5/Dynamic-In-Game-Map.html | 2 + docs/0.9.5/EvEditor.html | 2 + docs/0.9.5/EvMenu.html | 2 + docs/0.9.5/EvMore.html | 2 + docs/0.9.5/Evennia-API.html | 9 +- docs/0.9.5/Evennia-Game-Index.html | 2 + docs/0.9.5/Evennia-Introduction.html | 2 + docs/0.9.5/Evennia-for-Diku-Users.html | 2 + docs/0.9.5/Evennia-for-MUSH-Users.html | 2 + .../Evennia-for-roleplaying-sessions.html | 2 + docs/0.9.5/Execute-Python-Code.html | 2 + docs/0.9.5/First-Steps-Coding.html | 2 + docs/0.9.5/Game-Planning.html | 2 + docs/0.9.5/Gametime-Tutorial.html | 2 + docs/0.9.5/Getting-Started.html | 2 + docs/0.9.5/Glossary.html | 2 + docs/0.9.5/Grapevine.html | 2 + docs/0.9.5/Guest-Logins.html | 2 + docs/0.9.5/HAProxy-Config.html | 2 + docs/0.9.5/Help-System-Tutorial.html | 2 + docs/0.9.5/Help-System.html | 2 + docs/0.9.5/How-To-Get-And-Give-Help.html | 2 + .../How-to-connect-Evennia-to-Twitter.html | 2 + docs/0.9.5/IRC.html | 2 + .../Implementing-a-game-rule-system.html | 2 + docs/0.9.5/Inputfuncs.html | 2 + docs/0.9.5/Installing-on-Android.html | 2 + docs/0.9.5/Internationalization.html | 2 + ...Learn-Python-for-Evennia-The-Hard-Way.html | 2 + docs/0.9.5/Licensing.html | 2 + docs/0.9.5/Links.html | 2 + docs/0.9.5/Locks.html | 2 + docs/0.9.5/Manually-Configuring-Color.html | 2 + docs/0.9.5/Mass-and-weight-for-objects.html | 2 + docs/0.9.5/Messagepath.html | 2 + docs/0.9.5/MonitorHandler.html | 2 + docs/0.9.5/NPC-shop-Tutorial.html | 2 + docs/0.9.5/New-Models.html | 2 + docs/0.9.5/Nicks.html | 2 + docs/0.9.5/OOB.html | 2 + docs/0.9.5/Objects.html | 2 + docs/0.9.5/Online-Setup.html | 2 + ...-arguments,-theory-and-best-practices.html | 2 + docs/0.9.5/Portal-And-Server.html | 2 + docs/0.9.5/Profiling.html | 2 + docs/0.9.5/Python-3.html | 2 + docs/0.9.5/Python-basic-introduction.html | 2 + .../0.9.5/Python-basic-tutorial-part-two.html | 4 +- docs/0.9.5/Quirks.html | 2 + docs/0.9.5/RSS.html | 2 + docs/0.9.5/Roadmap.html | 2 + docs/0.9.5/Running-Evennia-in-Docker.html | 2 + docs/0.9.5/Screenshot.html | 2 + docs/0.9.5/Scripts.html | 2 + docs/0.9.5/Security.html | 2 + docs/0.9.5/Server-Conf.html | 2 + docs/0.9.5/Sessions.html | 2 + docs/0.9.5/Setting-up-PyCharm.html | 2 + docs/0.9.5/Signals.html | 2 + docs/0.9.5/Soft-Code.html | 2 + docs/0.9.5/Spawner-and-Prototypes.html | 2 + docs/0.9.5/Start-Stop-Reload.html | 2 + docs/0.9.5/Static-In-Game-Map.html | 2 + docs/0.9.5/Tags.html | 2 + docs/0.9.5/Text-Encodings.html | 2 + docs/0.9.5/TextTags.html | 2 + docs/0.9.5/TickerHandler.html | 2 + docs/0.9.5/Turn-based-Combat-System.html | 2 + docs/0.9.5/Tutorial-Aggressive-NPCs.html | 2 + docs/0.9.5/Tutorial-NPCs-listening.html | 2 + .../0.9.5/Tutorial-Searching-For-Objects.html | 2 + docs/0.9.5/Tutorial-Tweeting-Game-Stats.html | 2 + docs/0.9.5/Tutorial-Vehicles.html | 2 + docs/0.9.5/Tutorial-World-Introduction.html | 2 + .../Tutorial-for-basic-MUSH-like-game.html | 2 + docs/0.9.5/Tutorials.html | 2 + docs/0.9.5/Typeclasses.html | 2 + docs/0.9.5/Understanding-Color-Tags.html | 2 + docs/0.9.5/Unit-Testing.html | 2 + docs/0.9.5/Updating-Your-Game.html | 2 + docs/0.9.5/Using-MUX-as-a-Standard.html | 2 + docs/0.9.5/Using-Travis.html | 2 + docs/0.9.5/Version-Control.html | 2 + docs/0.9.5/Weather-Tutorial.html | 2 + docs/0.9.5/Web-Character-Generation.html | 2 + docs/0.9.5/Web-Character-View-Tutorial.html | 2 + docs/0.9.5/Web-Features.html | 2 + docs/0.9.5/Web-Tutorial.html | 2 + docs/0.9.5/Webclient-brainstorm.html | 2 + docs/0.9.5/Webclient.html | 2 + docs/0.9.5/Wiki-Index.html | 2 + docs/0.9.5/Zones.html | 2 + docs/0.9.5/_modules/django/conf.html | 2 + .../db/models/fields/related_descriptors.html | 2 + .../_modules/django/db/models/manager.html | 2 + .../django/db/models/query_utils.html | 2 + .../_modules/django/utils/functional.html | 2 + docs/0.9.5/_modules/evennia.html | 8 +- .../_modules/evennia/accounts/accounts.html | 6 +- .../_modules/evennia/accounts/admin.html | 2 + .../0.9.5/_modules/evennia/accounts/bots.html | 2 + .../_modules/evennia/accounts/manager.html | 2 + .../_modules/evennia/accounts/models.html | 2 + .../_modules/evennia/commands/cmdhandler.html | 2 + .../_modules/evennia/commands/cmdparser.html | 11 +- .../_modules/evennia/commands/cmdset.html | 19 +- .../evennia/commands/cmdsethandler.html | 2 + .../_modules/evennia/commands/command.html | 2 + .../evennia/commands/default/account.html | 4 +- .../evennia/commands/default/admin.html | 2 + .../commands/default/batchprocess.html | 2 + .../evennia/commands/default/building.html | 2 + .../commands/default/cmdset_account.html | 2 + .../commands/default/cmdset_character.html | 2 + .../commands/default/cmdset_session.html | 2 + .../commands/default/cmdset_unloggedin.html | 2 + .../evennia/commands/default/comms.html | 2 + .../evennia/commands/default/general.html | 2 + .../evennia/commands/default/help.html | 2 + .../evennia/commands/default/muxcommand.html | 2 + .../evennia/commands/default/syscommands.html | 2 + .../evennia/commands/default/system.html | 37 ++-- .../evennia/commands/default/tests.html | 2 + .../evennia/commands/default/unloggedin.html | 2 + docs/0.9.5/_modules/evennia/comms/admin.html | 2 + .../evennia/comms/channelhandler.html | 2 + docs/0.9.5/_modules/evennia/comms/comms.html | 2 + .../_modules/evennia/comms/managers.html | 2 + docs/0.9.5/_modules/evennia/comms/models.html | 2 + .../_modules/evennia/contrib/barter.html | 2 + .../evennia/contrib/building_menu.html | 2 + .../_modules/evennia/contrib/chargen.html | 2 + .../_modules/evennia/contrib/clothing.html | 2 + .../evennia/contrib/custom_gametime.html | 2 + docs/0.9.5/_modules/evennia/contrib/dice.html | 2 + .../_modules/evennia/contrib/email_login.html | 2 + .../evennia/contrib/extended_room.html | 2 + .../_modules/evennia/contrib/fieldfill.html | 2 + .../_modules/evennia/contrib/gendersub.html | 2 + .../_modules/evennia/contrib/health_bar.html | 2 + .../ingame_python/callbackhandler.html | 2 + .../contrib/ingame_python/commands.html | 2 + .../contrib/ingame_python/eventfuncs.html | 2 + .../contrib/ingame_python/scripts.html | 2 + .../evennia/contrib/ingame_python/tests.html | 2 + .../contrib/ingame_python/typeclasses.html | 2 + .../evennia/contrib/ingame_python/utils.html | 2 + docs/0.9.5/_modules/evennia/contrib/mail.html | 2 + .../_modules/evennia/contrib/mapbuilder.html | 2 + .../_modules/evennia/contrib/menu_login.html | 2 + .../_modules/evennia/contrib/multidescer.html | 2 + .../_modules/evennia/contrib/puzzles.html | 2 + .../contrib/random_string_generator.html | 2 + .../_modules/evennia/contrib/rplanguage.html | 2 + .../_modules/evennia/contrib/rpsystem.html | 2 + .../contrib/security/auditing/outputs.html | 2 + .../contrib/security/auditing/server.html | 2 + .../contrib/security/auditing/tests.html | 2 + .../_modules/evennia/contrib/simpledoor.html | 2 + .../_modules/evennia/contrib/slow_exit.html | 2 + .../_modules/evennia/contrib/talking_npc.html | 2 + .../_modules/evennia/contrib/tree_select.html | 2 + .../evennia/contrib/turnbattle/tb_basic.html | 2 + .../evennia/contrib/turnbattle/tb_equip.html | 2 + .../evennia/contrib/turnbattle/tb_items.html | 2 + .../evennia/contrib/turnbattle/tb_magic.html | 2 + .../evennia/contrib/turnbattle/tb_range.html | 2 + .../tutorial_examples/bodyfunctions.html | 2 + .../tutorial_examples/cmdset_red_button.html | 2 + .../contrib/tutorial_examples/red_button.html | 2 + .../tutorial_examples/red_button_scripts.html | 2 + .../contrib/tutorial_examples/tests.html | 2 + .../contrib/tutorial_world/intro_menu.html | 4 +- .../evennia/contrib/tutorial_world/mob.html | 2 + .../contrib/tutorial_world/objects.html | 2 + .../evennia/contrib/tutorial_world/rooms.html | 2 + .../_modules/evennia/contrib/unixcommand.html | 2 + .../_modules/evennia/contrib/wilderness.html | 2 + docs/0.9.5/_modules/evennia/help/admin.html | 2 + docs/0.9.5/_modules/evennia/help/manager.html | 2 + docs/0.9.5/_modules/evennia/help/models.html | 2 + .../_modules/evennia/locks/lockfuncs.html | 2 + .../_modules/evennia/locks/lockhandler.html | 2 + .../0.9.5/_modules/evennia/objects/admin.html | 2 + .../_modules/evennia/objects/manager.html | 20 ++- .../_modules/evennia/objects/models.html | 2 + .../_modules/evennia/objects/objects.html | 5 +- .../_modules/evennia/prototypes/menus.html | 2 + .../evennia/prototypes/protfuncs.html | 2 + .../evennia/prototypes/prototypes.html | 71 ++++---- .../_modules/evennia/prototypes/spawner.html | 2 + .../0.9.5/_modules/evennia/scripts/admin.html | 2 + .../_modules/evennia/scripts/manager.html | 2 + .../_modules/evennia/scripts/models.html | 2 + .../evennia/scripts/monitorhandler.html | 4 +- .../evennia/scripts/scripthandler.html | 2 + .../_modules/evennia/scripts/scripts.html | 2 + .../_modules/evennia/scripts/taskhandler.html | 2 + .../evennia/scripts/tickerhandler.html | 16 +- docs/0.9.5/_modules/evennia/server/admin.html | 2 + .../_modules/evennia/server/amp_client.html | 2 + .../evennia/server/connection_wizard.html | 2 + .../_modules/evennia/server/deprecations.html | 2 + .../evennia/server/evennia_launcher.html | 2 + .../server/game_index_client/client.html | 2 + .../server/game_index_client/service.html | 2 + .../evennia/server/initial_setup.html | 2 + .../_modules/evennia/server/inputfuncs.html | 7 +- .../_modules/evennia/server/manager.html | 2 + .../0.9.5/_modules/evennia/server/models.html | 2 + .../_modules/evennia/server/portal/amp.html | 53 +++++- .../evennia/server/portal/amp_server.html | 2 + .../evennia/server/portal/grapevine.html | 2 + .../_modules/evennia/server/portal/irc.html | 2 + .../_modules/evennia/server/portal/mccp.html | 2 + .../_modules/evennia/server/portal/mssp.html | 2 + .../_modules/evennia/server/portal/mxp.html | 2 + .../_modules/evennia/server/portal/naws.html | 2 + .../evennia/server/portal/portal.html | 2 + .../server/portal/portalsessionhandler.html | 2 + .../_modules/evennia/server/portal/rss.html | 2 + .../_modules/evennia/server/portal/ssh.html | 2 + .../_modules/evennia/server/portal/ssl.html | 2 + .../evennia/server/portal/suppress_ga.html | 2 + .../evennia/server/portal/telnet.html | 3 +- .../evennia/server/portal/telnet_oob.html | 2 + .../evennia/server/portal/telnet_ssl.html | 2 + .../_modules/evennia/server/portal/tests.html | 2 + .../_modules/evennia/server/portal/ttype.html | 2 + .../evennia/server/portal/webclient.html | 6 + .../evennia/server/portal/webclient_ajax.html | 2 + .../evennia/server/profiling/dummyrunner.html | 2 + .../profiling/dummyrunner_settings.html | 2 + .../evennia/server/profiling/memplot.html | 2 + .../server/profiling/test_queries.html | 2 + .../evennia/server/profiling/tests.html | 2 + .../evennia/server/profiling/timetrace.html | 2 + .../0.9.5/_modules/evennia/server/server.html | 2 + .../evennia/server/serversession.html | 2 + .../_modules/evennia/server/session.html | 2 + .../evennia/server/sessionhandler.html | 2 + .../_modules/evennia/server/throttle.html | 133 ++++++++++++-- .../_modules/evennia/server/validators.html | 2 + .../_modules/evennia/server/webserver.html | 2 + .../_modules/evennia/typeclasses/admin.html | 2 + .../evennia/typeclasses/attributes.html | 4 +- .../evennia/typeclasses/managers.html | 2 + .../_modules/evennia/typeclasses/models.html | 2 + .../_modules/evennia/typeclasses/tags.html | 2 + docs/0.9.5/_modules/evennia/utils/ansi.html | 90 ++++++++-- .../evennia/utils/batchprocessors.html | 2 + .../_modules/evennia/utils/containers.html | 2 + docs/0.9.5/_modules/evennia/utils/create.html | 2 + .../_modules/evennia/utils/dbserialize.html | 6 + .../_modules/evennia/utils/eveditor.html | 2 + docs/0.9.5/_modules/evennia/utils/evform.html | 48 +---- docs/0.9.5/_modules/evennia/utils/evmenu.html | 2 + docs/0.9.5/_modules/evennia/utils/evmore.html | 2 + .../0.9.5/_modules/evennia/utils/evtable.html | 2 + .../_modules/evennia/utils/gametime.html | 2 + .../evennia/utils/idmapper/manager.html | 2 + .../evennia/utils/idmapper/models.html | 2 + .../evennia/utils/idmapper/tests.html | 2 + .../_modules/evennia/utils/inlinefuncs.html | 2 + docs/0.9.5/_modules/evennia/utils/logger.html | 4 +- .../_modules/evennia/utils/optionclasses.html | 2 + .../_modules/evennia/utils/optionhandler.html | 2 + .../_modules/evennia/utils/picklefield.html | 2 + docs/0.9.5/_modules/evennia/utils/search.html | 2 + .../evennia/utils/test_resources.html | 2 + .../_modules/evennia/utils/text2html.html | 15 +- docs/0.9.5/_modules/evennia/utils/utils.html | 2 + .../evennia/utils/validatorfuncs.html | 2 + .../_modules/evennia/web/utils/backends.html | 2 + .../evennia/web/utils/general_context.html | 2 + .../evennia/web/utils/middleware.html | 2 + .../_modules/evennia/web/utils/tests.html | 2 + .../_modules/evennia/web/webclient/views.html | 2 + .../_modules/evennia/web/website/forms.html | 2 + .../web/website/templatetags/addclass.html | 2 + .../_modules/evennia/web/website/tests.html | 2 + .../_modules/evennia/web/website/views.html | 2 + docs/0.9.5/_modules/functools.html | 2 + docs/0.9.5/_modules/index.html | 2 + docs/0.9.5/_modules/typeclasses/accounts.html | 2 + docs/0.9.5/_modules/typeclasses/channels.html | 2 + .../_modules/typeclasses/characters.html | 2 + docs/0.9.5/_modules/typeclasses/objects.html | 2 + docs/0.9.5/_sources/Builder-Docs.md.txt | 3 +- .../0.9.5/_sources/Client-Support-Grid.md.txt | 159 ++++++++-------- docs/0.9.5/_sources/Contributing-Docs.md.txt | 60 ++----- docs/0.9.5/_sources/Evennia-API.md.txt | 7 +- .../Python-basic-tutorial-part-two.md.txt | 2 +- docs/0.9.5/_sources/toc.md.txt | 2 +- docs/0.9.5/_static/nature.css | 10 ++ docs/0.9.5/api/evennia-api.html | 7 +- docs/0.9.5/api/evennia.accounts.accounts.html | 2 + docs/0.9.5/api/evennia.accounts.admin.html | 2 + docs/0.9.5/api/evennia.accounts.bots.html | 2 + docs/0.9.5/api/evennia.accounts.html | 2 + docs/0.9.5/api/evennia.accounts.manager.html | 2 + docs/0.9.5/api/evennia.accounts.models.html | 2 + .../api/evennia.commands.cmdhandler.html | 2 + .../0.9.5/api/evennia.commands.cmdparser.html | 2 + docs/0.9.5/api/evennia.commands.cmdset.html | 2 + .../api/evennia.commands.cmdsethandler.html | 2 + docs/0.9.5/api/evennia.commands.command.html | 2 + .../api/evennia.commands.default.account.html | 6 +- .../api/evennia.commands.default.admin.html | 2 + ...evennia.commands.default.batchprocess.html | 6 +- .../evennia.commands.default.building.html | 14 +- ...ennia.commands.default.cmdset_account.html | 2 + ...nia.commands.default.cmdset_character.html | 2 + ...ennia.commands.default.cmdset_session.html | 2 + ...ia.commands.default.cmdset_unloggedin.html | 2 + .../api/evennia.commands.default.comms.html | 6 +- .../api/evennia.commands.default.general.html | 22 +-- .../api/evennia.commands.default.help.html | 2 + docs/0.9.5/api/evennia.commands.default.html | 2 + .../evennia.commands.default.muxcommand.html | 2 + .../evennia.commands.default.syscommands.html | 2 + .../api/evennia.commands.default.system.html | 6 +- .../api/evennia.commands.default.tests.html | 2 + .../evennia.commands.default.unloggedin.html | 18 +- docs/0.9.5/api/evennia.commands.html | 2 + docs/0.9.5/api/evennia.comms.admin.html | 2 + .../api/evennia.comms.channelhandler.html | 2 + docs/0.9.5/api/evennia.comms.comms.html | 2 + docs/0.9.5/api/evennia.comms.html | 2 + docs/0.9.5/api/evennia.comms.managers.html | 2 + docs/0.9.5/api/evennia.comms.models.html | 2 + docs/0.9.5/api/evennia.contrib.barter.html | 6 +- .../api/evennia.contrib.building_menu.html | 2 + docs/0.9.5/api/evennia.contrib.chargen.html | 6 +- docs/0.9.5/api/evennia.contrib.clothing.html | 6 +- .../api/evennia.contrib.color_markups.html | 2 + .../api/evennia.contrib.custom_gametime.html | 2 + docs/0.9.5/api/evennia.contrib.dice.html | 2 + .../api/evennia.contrib.email_login.html | 18 +- .../api/evennia.contrib.extended_room.html | 6 +- docs/0.9.5/api/evennia.contrib.fieldfill.html | 2 + docs/0.9.5/api/evennia.contrib.gendersub.html | 2 + .../0.9.5/api/evennia.contrib.health_bar.html | 2 + docs/0.9.5/api/evennia.contrib.html | 2 + ...contrib.ingame_python.callbackhandler.html | 2 + ...vennia.contrib.ingame_python.commands.html | 6 +- ...nnia.contrib.ingame_python.eventfuncs.html | 2 + .../api/evennia.contrib.ingame_python.html | 2 + ...evennia.contrib.ingame_python.scripts.html | 2 + .../evennia.contrib.ingame_python.tests.html | 2 + ...nia.contrib.ingame_python.typeclasses.html | 2 + .../evennia.contrib.ingame_python.utils.html | 2 + docs/0.9.5/api/evennia.contrib.mail.html | 2 + .../0.9.5/api/evennia.contrib.mapbuilder.html | 2 + .../0.9.5/api/evennia.contrib.menu_login.html | 2 + .../api/evennia.contrib.multidescer.html | 2 + docs/0.9.5/api/evennia.contrib.puzzles.html | 2 + ...ennia.contrib.random_string_generator.html | 2 + .../0.9.5/api/evennia.contrib.rplanguage.html | 2 + docs/0.9.5/api/evennia.contrib.rpsystem.html | 6 +- .../evennia.contrib.security.auditing.html | 2 + ...nia.contrib.security.auditing.outputs.html | 2 + ...nnia.contrib.security.auditing.server.html | 2 + ...ennia.contrib.security.auditing.tests.html | 2 + docs/0.9.5/api/evennia.contrib.security.html | 2 + .../0.9.5/api/evennia.contrib.simpledoor.html | 2 + docs/0.9.5/api/evennia.contrib.slow_exit.html | 2 + .../api/evennia.contrib.talking_npc.html | 2 + .../api/evennia.contrib.tree_select.html | 2 + .../0.9.5/api/evennia.contrib.turnbattle.html | 2 + .../evennia.contrib.turnbattle.tb_basic.html | 2 + .../evennia.contrib.turnbattle.tb_equip.html | 2 + .../evennia.contrib.turnbattle.tb_items.html | 2 + .../evennia.contrib.turnbattle.tb_magic.html | 2 + .../evennia.contrib.turnbattle.tb_range.html | 2 + ...ntrib.tutorial_examples.bodyfunctions.html | 2 + ...b.tutorial_examples.cmdset_red_button.html | 18 +- ....tutorial_examples.example_batch_code.html | 2 + .../evennia.contrib.tutorial_examples.html | 2 + ....contrib.tutorial_examples.red_button.html | 2 + ....tutorial_examples.red_button_scripts.html | 2 + ...ennia.contrib.tutorial_examples.tests.html | 2 + .../api/evennia.contrib.tutorial_world.html | 2 + ...nia.contrib.tutorial_world.intro_menu.html | 2 + .../evennia.contrib.tutorial_world.mob.html | 2 + ...vennia.contrib.tutorial_world.objects.html | 10 +- .../evennia.contrib.tutorial_world.rooms.html | 14 +- .../api/evennia.contrib.unixcommand.html | 2 + .../0.9.5/api/evennia.contrib.wilderness.html | 2 + docs/0.9.5/api/evennia.help.admin.html | 2 + docs/0.9.5/api/evennia.help.html | 2 + docs/0.9.5/api/evennia.help.manager.html | 2 + docs/0.9.5/api/evennia.help.models.html | 2 + docs/0.9.5/api/evennia.html | 7 +- docs/0.9.5/api/evennia.locks.html | 2 + docs/0.9.5/api/evennia.locks.lockfuncs.html | 2 + docs/0.9.5/api/evennia.locks.lockhandler.html | 2 + docs/0.9.5/api/evennia.objects.admin.html | 2 + docs/0.9.5/api/evennia.objects.html | 2 + docs/0.9.5/api/evennia.objects.manager.html | 2 + docs/0.9.5/api/evennia.objects.models.html | 2 + docs/0.9.5/api/evennia.objects.objects.html | 5 +- docs/0.9.5/api/evennia.prototypes.html | 2 + docs/0.9.5/api/evennia.prototypes.menus.html | 2 + .../api/evennia.prototypes.protfuncs.html | 2 + .../api/evennia.prototypes.prototypes.html | 9 + .../0.9.5/api/evennia.prototypes.spawner.html | 2 + docs/0.9.5/api/evennia.scripts.admin.html | 2 + docs/0.9.5/api/evennia.scripts.html | 2 + docs/0.9.5/api/evennia.scripts.manager.html | 2 + docs/0.9.5/api/evennia.scripts.models.html | 2 + .../api/evennia.scripts.monitorhandler.html | 4 +- .../api/evennia.scripts.scripthandler.html | 2 + docs/0.9.5/api/evennia.scripts.scripts.html | 2 + .../api/evennia.scripts.taskhandler.html | 2 + .../api/evennia.scripts.tickerhandler.html | 2 + docs/0.9.5/api/evennia.server.admin.html | 2 + docs/0.9.5/api/evennia.server.amp_client.html | 2 + .../api/evennia.server.connection_wizard.html | 2 + .../api/evennia.server.deprecations.html | 2 + .../api/evennia.server.evennia_launcher.html | 2 + ...ennia.server.game_index_client.client.html | 2 + .../api/evennia.server.game_index_client.html | 2 + ...nnia.server.game_index_client.service.html | 2 + docs/0.9.5/api/evennia.server.html | 2 + .../api/evennia.server.initial_setup.html | 2 + docs/0.9.5/api/evennia.server.inputfuncs.html | 2 + docs/0.9.5/api/evennia.server.manager.html | 2 + docs/0.9.5/api/evennia.server.models.html | 2 + docs/0.9.5/api/evennia.server.portal.amp.html | 2 + .../api/evennia.server.portal.amp_server.html | 2 + .../api/evennia.server.portal.grapevine.html | 2 + docs/0.9.5/api/evennia.server.portal.html | 2 + docs/0.9.5/api/evennia.server.portal.irc.html | 2 + .../0.9.5/api/evennia.server.portal.mccp.html | 2 + .../0.9.5/api/evennia.server.portal.mssp.html | 2 + docs/0.9.5/api/evennia.server.portal.mxp.html | 2 + .../0.9.5/api/evennia.server.portal.naws.html | 2 + .../api/evennia.server.portal.portal.html | 2 + ...ia.server.portal.portalsessionhandler.html | 2 + docs/0.9.5/api/evennia.server.portal.rss.html | 2 + docs/0.9.5/api/evennia.server.portal.ssh.html | 2 + docs/0.9.5/api/evennia.server.portal.ssl.html | 2 + .../evennia.server.portal.suppress_ga.html | 2 + .../api/evennia.server.portal.telnet.html | 2 + .../api/evennia.server.portal.telnet_oob.html | 2 + .../api/evennia.server.portal.telnet_ssl.html | 2 + .../api/evennia.server.portal.tests.html | 2 + .../api/evennia.server.portal.ttype.html | 2 + .../api/evennia.server.portal.webclient.html | 2 + .../evennia.server.portal.webclient_ajax.html | 2 + .../evennia.server.profiling.dummyrunner.html | 2 + ...server.profiling.dummyrunner_settings.html | 2 + docs/0.9.5/api/evennia.server.profiling.html | 2 + .../api/evennia.server.profiling.memplot.html | 2 + ...ennia.server.profiling.settings_mixin.html | 2 + ...evennia.server.profiling.test_queries.html | 2 + .../api/evennia.server.profiling.tests.html | 2 + .../evennia.server.profiling.timetrace.html | 2 + docs/0.9.5/api/evennia.server.server.html | 2 + .../api/evennia.server.serversession.html | 2 + docs/0.9.5/api/evennia.server.session.html | 2 + .../api/evennia.server.sessionhandler.html | 2 + docs/0.9.5/api/evennia.server.signals.html | 2 + docs/0.9.5/api/evennia.server.throttle.html | 61 ++++++- docs/0.9.5/api/evennia.server.validators.html | 2 + docs/0.9.5/api/evennia.server.webserver.html | 2 + docs/0.9.5/api/evennia.settings_default.html | 2 + docs/0.9.5/api/evennia.typeclasses.admin.html | 2 + .../api/evennia.typeclasses.attributes.html | 2 + docs/0.9.5/api/evennia.typeclasses.html | 2 + .../api/evennia.typeclasses.managers.html | 2 + .../0.9.5/api/evennia.typeclasses.models.html | 2 + docs/0.9.5/api/evennia.typeclasses.tags.html | 2 + docs/0.9.5/api/evennia.utils.ansi.html | 75 ++++++-- .../api/evennia.utils.batchprocessors.html | 2 + docs/0.9.5/api/evennia.utils.containers.html | 2 + docs/0.9.5/api/evennia.utils.create.html | 2 + docs/0.9.5/api/evennia.utils.dbserialize.html | 2 + docs/0.9.5/api/evennia.utils.eveditor.html | 6 +- docs/0.9.5/api/evennia.utils.evform.html | 2 + docs/0.9.5/api/evennia.utils.evmenu.html | 2 + docs/0.9.5/api/evennia.utils.evmore.html | 6 +- docs/0.9.5/api/evennia.utils.evtable.html | 2 + docs/0.9.5/api/evennia.utils.gametime.html | 2 + docs/0.9.5/api/evennia.utils.html | 7 +- docs/0.9.5/api/evennia.utils.idmapper.html | 2 + .../api/evennia.utils.idmapper.manager.html | 2 + .../api/evennia.utils.idmapper.models.html | 2 + .../api/evennia.utils.idmapper.tests.html | 2 + docs/0.9.5/api/evennia.utils.inlinefuncs.html | 2 + docs/0.9.5/api/evennia.utils.logger.html | 2 + .../api/evennia.utils.optionclasses.html | 2 + .../api/evennia.utils.optionhandler.html | 2 + docs/0.9.5/api/evennia.utils.picklefield.html | 2 + docs/0.9.5/api/evennia.utils.search.html | 2 + .../api/evennia.utils.test_resources.html | 2 + docs/0.9.5/api/evennia.utils.text2html.html | 4 +- docs/0.9.5/api/evennia.utils.utils.html | 2 + .../api/evennia.utils.validatorfuncs.html | 2 + docs/0.9.5/api/evennia.web.html | 2 + docs/0.9.5/api/evennia.web.urls.html | 2 + .../0.9.5/api/evennia.web.utils.backends.html | 2 + .../evennia.web.utils.general_context.html | 2 + docs/0.9.5/api/evennia.web.utils.html | 2 + .../api/evennia.web.utils.middleware.html | 2 + docs/0.9.5/api/evennia.web.utils.tests.html | 2 + docs/0.9.5/api/evennia.web.webclient.html | 2 + .../0.9.5/api/evennia.web.webclient.urls.html | 2 + .../api/evennia.web.webclient.views.html | 2 + docs/0.9.5/api/evennia.web.website.forms.html | 2 + docs/0.9.5/api/evennia.web.website.html | 2 + ...nia.web.website.templatetags.addclass.html | 2 + .../api/evennia.web.website.templatetags.html | 2 + docs/0.9.5/api/evennia.web.website.tests.html | 2 + docs/0.9.5/api/evennia.web.website.urls.html | 2 + docs/0.9.5/api/evennia.web.website.views.html | 2 + docs/0.9.5/genindex.html | 22 ++- docs/0.9.5/index.html | 2 + docs/0.9.5/objects.inv | Bin 73236 -> 73226 bytes docs/0.9.5/py-modindex.html | 2 + docs/0.9.5/search.html | 2 + docs/0.9.5/searchindex.js | 2 +- docs/0.9.5/toc.html | 3 +- docs/1.0-dev/.buildinfo | 2 +- docs/1.0-dev/Coding/Coding-Introduction.html | 2 + docs/1.0-dev/Coding/Coding-Overview.html | 2 + .../Coding/Continuous-Integration.html | 2 + docs/1.0-dev/Coding/Debugging.html | 2 + docs/1.0-dev/Coding/Flat-API.html | 2 + docs/1.0-dev/Coding/Profiling.html | 2 + docs/1.0-dev/Coding/Quirks.html | 2 + docs/1.0-dev/Coding/Setting-up-PyCharm.html | 2 + docs/1.0-dev/Coding/Unit-Testing.html | 2 + docs/1.0-dev/Coding/Updating-Your-Game.html | 2 + docs/1.0-dev/Coding/Using-Travis.html | 2 + docs/1.0-dev/Coding/Version-Control.html | 2 + docs/1.0-dev/Components/Accounts.html | 2 + docs/1.0-dev/Components/Attributes.html | 2 + .../Components/Batch-Code-Processor.html | 2 + .../Components/Batch-Command-Processor.html | 2 + docs/1.0-dev/Components/Batch-Processors.html | 2 + .../Bootstrap-Components-and-Utilities.html | 2 + docs/1.0-dev/Components/Channels.html | 2 + docs/1.0-dev/Components/Coding-Utils.html | 2 + docs/1.0-dev/Components/Command-Sets.html | 2 + docs/1.0-dev/Components/Command-System.html | 2 + docs/1.0-dev/Components/Commands.html | 2 + docs/1.0-dev/Components/Communications.html | 2 + .../Components/Components-Overview.html | 2 + .../1.0-dev/Components/Connection-Screen.html | 2 + docs/1.0-dev/Components/EvEditor.html | 2 + docs/1.0-dev/Components/EvMenu.html | 2 + docs/1.0-dev/Components/EvMore.html | 2 + docs/1.0-dev/Components/Help-System.html | 2 + docs/1.0-dev/Components/Inputfuncs.html | 2 + docs/1.0-dev/Components/Locks.html | 2 + docs/1.0-dev/Components/MonitorHandler.html | 2 + docs/1.0-dev/Components/Nicks.html | 2 + docs/1.0-dev/Components/Objects.html | 2 + docs/1.0-dev/Components/Outputfuncs.html | 2 + .../1.0-dev/Components/Portal-And-Server.html | 2 + docs/1.0-dev/Components/Scripts.html | 2 + docs/1.0-dev/Components/Server-Conf.html | 2 + docs/1.0-dev/Components/Server.html | 2 + docs/1.0-dev/Components/Sessions.html | 2 + docs/1.0-dev/Components/Signals.html | 2 + .../Components/Spawner-and-Prototypes.html | 2 + docs/1.0-dev/Components/Tags.html | 2 + docs/1.0-dev/Components/TickerHandler.html | 2 + docs/1.0-dev/Components/Typeclasses.html | 2 + docs/1.0-dev/Components/Webclient.html | 2 + docs/1.0-dev/Components/Webserver.html | 2 + docs/1.0-dev/Concepts/Async-Process.html | 2 + docs/1.0-dev/Concepts/Banning.html | 2 + .../1.0-dev/Concepts/Bootstrap-&-Evennia.html | 2 + .../Concepts/Building-Permissions.html | 2 + docs/1.0-dev/Concepts/Concepts-Overview.html | 2 + docs/1.0-dev/Concepts/Custom-Protocols.html | 2 + docs/1.0-dev/Concepts/Guest-Logins.html | 2 + .../Concepts/Internationalization.html | 2 + docs/1.0-dev/Concepts/Messagepath.html | 2 + docs/1.0-dev/Concepts/Multisession-modes.html | 2 + docs/1.0-dev/Concepts/New-Models.html | 2 + docs/1.0-dev/Concepts/OOB.html | 2 + docs/1.0-dev/Concepts/Soft-Code.html | 2 + docs/1.0-dev/Concepts/Text-Encodings.html | 2 + docs/1.0-dev/Concepts/TextTags.html | 2 + .../Concepts/Using-MUX-as-a-Standard.html | 2 + docs/1.0-dev/Concepts/Web-Features.html | 2 + docs/1.0-dev/Concepts/Zones.html | 2 + ...-voice-operated-elevator-using-events.html | 2 + .../Contribs/Arxcode-installing-help.html | 2 + docs/1.0-dev/Contribs/Building-menus.html | 2 + docs/1.0-dev/Contribs/Contrib-Overview.html | 2 + .../1.0-dev/Contribs/Dialogues-in-events.html | 2 + .../1.0-dev/Contribs/Dynamic-In-Game-Map.html | 2 + docs/1.0-dev/Contribs/Static-In-Game-Map.html | 2 + docs/1.0-dev/Contributing-Docs.html | 2 + docs/1.0-dev/Contributing.html | 2 + docs/1.0-dev/Evennia-API.html | 2 + docs/1.0-dev/Evennia-Introduction.html | 2 + docs/1.0-dev/Glossary.html | 2 + docs/1.0-dev/How-To-Get-And-Give-Help.html | 2 + .../Howto/Add-a-wiki-on-your-website.html | 2 + .../Howto/Building-a-mech-tutorial.html | 2 + docs/1.0-dev/Howto/Coding-FAQ.html | 2 + docs/1.0-dev/Howto/Command-Cooldown.html | 2 + docs/1.0-dev/Howto/Command-Duration.html | 2 + docs/1.0-dev/Howto/Command-Prompt.html | 2 + docs/1.0-dev/Howto/Coordinates.html | 2 + docs/1.0-dev/Howto/Customize-channels.html | 2 + docs/1.0-dev/Howto/Default-Exit-Errors.html | 2 + .../1.0-dev/Howto/Evennia-for-Diku-Users.html | 2 + .../1.0-dev/Howto/Evennia-for-MUSH-Users.html | 2 + .../Evennia-for-roleplaying-sessions.html | 2 + docs/1.0-dev/Howto/Gametime-Tutorial.html | 2 + docs/1.0-dev/Howto/Help-System-Tutorial.html | 2 + docs/1.0-dev/Howto/Howto-Overview.html | 2 + .../Howto/Manually-Configuring-Color.html | 2 + .../Howto/Mass-and-weight-for-objects.html | 2 + docs/1.0-dev/Howto/NPC-shop-Tutorial.html | 2 + .../Howto/Parsing-commands-tutorial.html | 2 + .../Howto/Starting/Part1/Adding-Commands.html | 2 + .../Starting/Part1/Building-Quickstart.html | 2 + .../Howto/Starting/Part1/Creating-Things.html | 2 + .../Howto/Starting/Part1/Django-queries.html | 2 + .../Part1/Evennia-Library-Overview.html | 2 + .../Starting/Part1/Gamedir-Overview.html | 2 + .../Starting/Part1/Learning-Typeclasses.html | 2 + .../Starting/Part1/More-on-Commands.html | 2 + .../Part1/Python-basic-introduction.html | 2 + .../Part1/Python-classes-and-objects.html | 2 + .../Starting/Part1/Searching-Things.html | 2 + .../Howto/Starting/Part1/Starting-Part1.html | 2 + .../Part1/Tutorial-World-Introduction.html | 2 + .../Howto/Starting/Part2/Game-Planning.html | 2 + .../Part2/Planning-Some-Useful-Contribs.html | 2 + .../Part2/Planning-The-Tutorial-Game.html | 2 + .../Part2/Planning-Where-Do-I-Begin.html | 2 + .../Howto/Starting/Part2/Starting-Part2.html | 2 + .../Starting/Part3/A-Sittable-Object.html | 2 + .../Implementing-a-game-rule-system.html | 2 + .../Howto/Starting/Part3/Starting-Part3.html | 2 + .../Part3/Turn-based-Combat-System.html | 2 + .../Tutorial-for-basic-MUSH-like-game.html | 2 + .../Howto/Starting/Part4/Starting-Part4.html | 2 + .../Part5/Add-a-simple-new-web-page.html | 2 + .../Howto/Starting/Part5/Starting-Part5.html | 2 + .../Howto/Starting/Part5/Web-Tutorial.html | 2 + .../Howto/Tutorial-Aggressive-NPCs.html | 2 + .../Howto/Tutorial-NPCs-listening.html | 2 + .../Howto/Tutorial-Tweeting-Game-Stats.html | 2 + docs/1.0-dev/Howto/Tutorial-Vehicles.html | 2 + .../Howto/Understanding-Color-Tags.html | 2 + docs/1.0-dev/Howto/Weather-Tutorial.html | 2 + .../Howto/Web-Character-Generation.html | 2 + .../Howto/Web-Character-View-Tutorial.html | 2 + docs/1.0-dev/Licensing.html | 2 + docs/1.0-dev/Links.html | 2 + docs/1.0-dev/Setup/Apache-Config.html | 2 + .../1.0-dev/Setup/Choosing-An-SQL-Server.html | 2 + docs/1.0-dev/Setup/Client-Support-Grid.html | 2 + docs/1.0-dev/Setup/Evennia-Game-Index.html | 2 + docs/1.0-dev/Setup/Extended-Installation.html | 2 + docs/1.0-dev/Setup/Grapevine.html | 2 + docs/1.0-dev/Setup/HAProxy-Config.html | 2 + .../How-to-connect-Evennia-to-Twitter.html | 2 + docs/1.0-dev/Setup/IRC.html | 2 + docs/1.0-dev/Setup/Installing-on-Android.html | 2 + docs/1.0-dev/Setup/Online-Setup.html | 2 + docs/1.0-dev/Setup/RSS.html | 2 + .../Setup/Running-Evennia-in-Docker.html | 2 + docs/1.0-dev/Setup/Security.html | 2 + docs/1.0-dev/Setup/Settings-File.html | 2 + docs/1.0-dev/Setup/Setup-Overview.html | 2 + docs/1.0-dev/Setup/Setup-Quickstart.html | 6 + docs/1.0-dev/Setup/Start-Stop-Reload.html | 2 + docs/1.0-dev/Unimplemented.html | 2 + docs/1.0-dev/_modules/django/conf.html | 2 + .../db/models/fields/related_descriptors.html | 2 + .../_modules/django/db/models/manager.html | 2 + .../_modules/django/db/models/query.html | 2 + .../django/db/models/query_utils.html | 2 + .../_modules/django/utils/deconstruct.html | 2 + .../_modules/django/utils/functional.html | 2 + docs/1.0-dev/_modules/evennia.html | 8 +- .../_modules/evennia/accounts/accounts.html | 6 +- .../_modules/evennia/accounts/admin.html | 2 + .../_modules/evennia/accounts/bots.html | 2 + .../_modules/evennia/accounts/manager.html | 2 + .../_modules/evennia/accounts/models.html | 2 + .../_modules/evennia/commands/cmdhandler.html | 2 + .../_modules/evennia/commands/cmdparser.html | 11 +- .../_modules/evennia/commands/cmdset.html | 19 +- .../evennia/commands/cmdsethandler.html | 2 + .../_modules/evennia/commands/command.html | 2 + .../evennia/commands/default/account.html | 4 +- .../evennia/commands/default/admin.html | 2 + .../commands/default/batchprocess.html | 2 + .../evennia/commands/default/building.html | 2 + .../commands/default/cmdset_account.html | 2 + .../commands/default/cmdset_character.html | 2 + .../commands/default/cmdset_session.html | 2 + .../commands/default/cmdset_unloggedin.html | 2 + .../evennia/commands/default/comms.html | 2 + .../evennia/commands/default/general.html | 2 + .../evennia/commands/default/help.html | 2 + .../evennia/commands/default/muxcommand.html | 2 + .../evennia/commands/default/syscommands.html | 2 + .../evennia/commands/default/system.html | 37 ++-- .../evennia/commands/default/tests.html | 2 + .../evennia/commands/default/unloggedin.html | 2 + .../1.0-dev/_modules/evennia/comms/admin.html | 2 + .../evennia/comms/channelhandler.html | 2 + .../1.0-dev/_modules/evennia/comms/comms.html | 2 + .../_modules/evennia/comms/managers.html | 2 + .../_modules/evennia/comms/models.html | 2 + .../contrib/awsstorage/aws_s3_cdn.html | 2 + .../evennia/contrib/awsstorage/tests.html | 2 + .../_modules/evennia/contrib/barter.html | 2 + .../evennia/contrib/building_menu.html | 2 + .../_modules/evennia/contrib/chargen.html | 2 + .../_modules/evennia/contrib/clothing.html | 2 + .../evennia/contrib/custom_gametime.html | 2 + .../_modules/evennia/contrib/dice.html | 2 + .../_modules/evennia/contrib/email_login.html | 2 + .../evennia/contrib/extended_room.html | 2 + .../_modules/evennia/contrib/fieldfill.html | 2 + .../_modules/evennia/contrib/gendersub.html | 2 + .../_modules/evennia/contrib/health_bar.html | 2 + .../ingame_python/callbackhandler.html | 2 + .../contrib/ingame_python/commands.html | 2 + .../contrib/ingame_python/eventfuncs.html | 2 + .../contrib/ingame_python/scripts.html | 2 + .../evennia/contrib/ingame_python/tests.html | 2 + .../contrib/ingame_python/typeclasses.html | 2 + .../evennia/contrib/ingame_python/utils.html | 2 + .../_modules/evennia/contrib/mail.html | 2 + .../_modules/evennia/contrib/mapbuilder.html | 2 + .../_modules/evennia/contrib/menu_login.html | 2 + .../_modules/evennia/contrib/multidescer.html | 2 + .../_modules/evennia/contrib/puzzles.html | 2 + .../contrib/random_string_generator.html | 2 + .../_modules/evennia/contrib/rplanguage.html | 2 + .../_modules/evennia/contrib/rpsystem.html | 2 + .../contrib/security/auditing/outputs.html | 2 + .../contrib/security/auditing/server.html | 2 + .../contrib/security/auditing/tests.html | 2 + .../_modules/evennia/contrib/simpledoor.html | 2 + .../_modules/evennia/contrib/slow_exit.html | 2 + .../_modules/evennia/contrib/talking_npc.html | 2 + .../_modules/evennia/contrib/test_traits.html | 2 + .../_modules/evennia/contrib/traits.html | 2 + .../_modules/evennia/contrib/tree_select.html | 2 + .../evennia/contrib/turnbattle/tb_basic.html | 2 + .../evennia/contrib/turnbattle/tb_equip.html | 2 + .../evennia/contrib/turnbattle/tb_items.html | 2 + .../evennia/contrib/turnbattle/tb_magic.html | 2 + .../evennia/contrib/turnbattle/tb_range.html | 2 + .../tutorial_examples/bodyfunctions.html | 2 + .../tutorial_examples/cmdset_red_button.html | 2 + .../contrib/tutorial_examples/mirror.html | 2 + .../contrib/tutorial_examples/red_button.html | 2 + .../tutorial_examples/red_button_scripts.html | 2 + .../contrib/tutorial_examples/tests.html | 2 + .../contrib/tutorial_world/intro_menu.html | 4 +- .../evennia/contrib/tutorial_world/mob.html | 2 + .../contrib/tutorial_world/objects.html | 2 + .../evennia/contrib/tutorial_world/rooms.html | 2 + .../_modules/evennia/contrib/unixcommand.html | 2 + .../_modules/evennia/contrib/wilderness.html | 2 + docs/1.0-dev/_modules/evennia/help/admin.html | 2 + .../_modules/evennia/help/manager.html | 2 + .../1.0-dev/_modules/evennia/help/models.html | 2 + .../_modules/evennia/locks/lockfuncs.html | 2 + .../_modules/evennia/locks/lockhandler.html | 2 + .../_modules/evennia/objects/admin.html | 2 + .../_modules/evennia/objects/manager.html | 20 ++- .../_modules/evennia/objects/models.html | 2 + .../_modules/evennia/objects/objects.html | 5 +- .../_modules/evennia/prototypes/menus.html | 2 + .../evennia/prototypes/protfuncs.html | 2 + .../evennia/prototypes/prototypes.html | 71 ++++---- .../_modules/evennia/prototypes/spawner.html | 2 + .../_modules/evennia/scripts/admin.html | 2 + .../_modules/evennia/scripts/manager.html | 2 + .../_modules/evennia/scripts/models.html | 2 + .../evennia/scripts/monitorhandler.html | 4 +- .../evennia/scripts/scripthandler.html | 2 + .../_modules/evennia/scripts/scripts.html | 2 + .../_modules/evennia/scripts/taskhandler.html | 2 + .../evennia/scripts/tickerhandler.html | 16 +- .../_modules/evennia/server/admin.html | 2 + .../_modules/evennia/server/amp_client.html | 2 + .../evennia/server/connection_wizard.html | 2 + .../_modules/evennia/server/deprecations.html | 2 + .../evennia/server/evennia_launcher.html | 2 + .../server/game_index_client/client.html | 2 + .../server/game_index_client/service.html | 2 + .../evennia/server/initial_setup.html | 2 + .../_modules/evennia/server/inputfuncs.html | 7 +- .../_modules/evennia/server/manager.html | 2 + .../_modules/evennia/server/models.html | 2 + .../_modules/evennia/server/portal/amp.html | 53 +++++- .../evennia/server/portal/amp_server.html | 2 + .../evennia/server/portal/grapevine.html | 2 + .../_modules/evennia/server/portal/irc.html | 2 + .../_modules/evennia/server/portal/mccp.html | 2 + .../_modules/evennia/server/portal/mssp.html | 2 + .../_modules/evennia/server/portal/mxp.html | 2 + .../_modules/evennia/server/portal/naws.html | 2 + .../evennia/server/portal/portal.html | 2 + .../server/portal/portalsessionhandler.html | 2 + .../_modules/evennia/server/portal/rss.html | 2 + .../_modules/evennia/server/portal/ssh.html | 2 + .../_modules/evennia/server/portal/ssl.html | 2 + .../evennia/server/portal/suppress_ga.html | 2 + .../evennia/server/portal/telnet.html | 3 +- .../evennia/server/portal/telnet_oob.html | 2 + .../evennia/server/portal/telnet_ssl.html | 2 + .../_modules/evennia/server/portal/tests.html | 2 + .../_modules/evennia/server/portal/ttype.html | 2 + .../evennia/server/portal/webclient.html | 6 + .../evennia/server/portal/webclient_ajax.html | 2 + .../evennia/server/profiling/dummyrunner.html | 2 + .../profiling/dummyrunner_settings.html | 2 + .../evennia/server/profiling/memplot.html | 2 + .../server/profiling/test_queries.html | 2 + .../evennia/server/profiling/tests.html | 2 + .../evennia/server/profiling/timetrace.html | 2 + .../_modules/evennia/server/server.html | 2 + .../evennia/server/serversession.html | 2 + .../_modules/evennia/server/session.html | 2 + .../evennia/server/sessionhandler.html | 2 + .../_modules/evennia/server/throttle.html | 133 ++++++++++++-- .../_modules/evennia/server/validators.html | 2 + .../_modules/evennia/server/webserver.html | 2 + .../_modules/evennia/typeclasses/admin.html | 2 + .../evennia/typeclasses/attributes.html | 4 +- .../evennia/typeclasses/managers.html | 2 + .../_modules/evennia/typeclasses/models.html | 2 + .../_modules/evennia/typeclasses/tags.html | 2 + docs/1.0-dev/_modules/evennia/utils/ansi.html | 90 ++++++++-- .../evennia/utils/batchprocessors.html | 2 + .../_modules/evennia/utils/containers.html | 2 + .../_modules/evennia/utils/create.html | 2 + .../_modules/evennia/utils/dbserialize.html | 6 + .../_modules/evennia/utils/eveditor.html | 2 + .../_modules/evennia/utils/evform.html | 48 +---- .../_modules/evennia/utils/evmenu.html | 2 + .../_modules/evennia/utils/evmore.html | 2 + .../_modules/evennia/utils/evtable.html | 2 + .../_modules/evennia/utils/gametime.html | 2 + .../evennia/utils/idmapper/manager.html | 2 + .../evennia/utils/idmapper/models.html | 2 + .../evennia/utils/idmapper/tests.html | 2 + .../_modules/evennia/utils/inlinefuncs.html | 2 + .../_modules/evennia/utils/logger.html | 4 +- .../_modules/evennia/utils/optionclasses.html | 2 + .../_modules/evennia/utils/optionhandler.html | 2 + .../_modules/evennia/utils/picklefield.html | 2 + .../_modules/evennia/utils/search.html | 2 + .../evennia/utils/test_resources.html | 2 + .../_modules/evennia/utils/text2html.html | 15 +- .../1.0-dev/_modules/evennia/utils/utils.html | 2 + .../evennia/utils/validatorfuncs.html | 2 + .../_modules/evennia/web/api/filters.html | 2 + .../_modules/evennia/web/api/permissions.html | 2 + .../_modules/evennia/web/api/serializers.html | 2 + .../_modules/evennia/web/api/tests.html | 2 + .../_modules/evennia/web/api/views.html | 2 + .../_modules/evennia/web/utils/backends.html | 2 + .../evennia/web/utils/general_context.html | 2 + .../evennia/web/utils/middleware.html | 2 + .../_modules/evennia/web/utils/tests.html | 2 + .../_modules/evennia/web/webclient/views.html | 2 + .../_modules/evennia/web/website/forms.html | 2 + .../web/website/templatetags/addclass.html | 2 + .../_modules/evennia/web/website/tests.html | 2 + .../_modules/evennia/web/website/views.html | 2 + docs/1.0-dev/_modules/functools.html | 2 + docs/1.0-dev/_modules/index.html | 2 + .../1.0-dev/_modules/rest_framework/test.html | 2 + .../_modules/typeclasses/accounts.html | 2 + .../_modules/typeclasses/channels.html | 2 + .../_modules/typeclasses/characters.html | 2 + .../1.0-dev/_modules/typeclasses/objects.html | 2 + .../_sources/Setup/Setup-Quickstart.md.txt | 5 + docs/1.0-dev/_sources/index.md.txt | 14 +- docs/1.0-dev/_static/nature.css | 10 ++ docs/1.0-dev/api/evennia-api.html | 7 +- .../api/evennia.accounts.accounts.html | 2 + docs/1.0-dev/api/evennia.accounts.admin.html | 2 + docs/1.0-dev/api/evennia.accounts.bots.html | 2 + docs/1.0-dev/api/evennia.accounts.html | 2 + .../1.0-dev/api/evennia.accounts.manager.html | 2 + docs/1.0-dev/api/evennia.accounts.models.html | 2 + .../api/evennia.commands.cmdhandler.html | 2 + .../api/evennia.commands.cmdparser.html | 2 + docs/1.0-dev/api/evennia.commands.cmdset.html | 2 + .../api/evennia.commands.cmdsethandler.html | 2 + .../1.0-dev/api/evennia.commands.command.html | 2 + .../api/evennia.commands.default.account.html | 2 + .../api/evennia.commands.default.admin.html | 2 + ...evennia.commands.default.batchprocess.html | 2 + .../evennia.commands.default.building.html | 14 +- ...ennia.commands.default.cmdset_account.html | 2 + ...nia.commands.default.cmdset_character.html | 2 + ...ennia.commands.default.cmdset_session.html | 2 + ...ia.commands.default.cmdset_unloggedin.html | 2 + .../api/evennia.commands.default.comms.html | 6 +- .../api/evennia.commands.default.general.html | 18 +- .../api/evennia.commands.default.help.html | 2 + .../1.0-dev/api/evennia.commands.default.html | 2 + .../evennia.commands.default.muxcommand.html | 2 + .../evennia.commands.default.syscommands.html | 2 + .../api/evennia.commands.default.system.html | 6 +- .../api/evennia.commands.default.tests.html | 2 + .../evennia.commands.default.unloggedin.html | 10 +- docs/1.0-dev/api/evennia.commands.html | 2 + docs/1.0-dev/api/evennia.comms.admin.html | 2 + .../api/evennia.comms.channelhandler.html | 2 + docs/1.0-dev/api/evennia.comms.comms.html | 2 + docs/1.0-dev/api/evennia.comms.html | 2 + docs/1.0-dev/api/evennia.comms.managers.html | 2 + docs/1.0-dev/api/evennia.comms.models.html | 2 + ...evennia.contrib.awsstorage.aws_s3_cdn.html | 2 + .../api/evennia.contrib.awsstorage.html | 2 + .../api/evennia.contrib.awsstorage.tests.html | 2 + docs/1.0-dev/api/evennia.contrib.barter.html | 6 +- .../api/evennia.contrib.building_menu.html | 2 + docs/1.0-dev/api/evennia.contrib.chargen.html | 2 + .../1.0-dev/api/evennia.contrib.clothing.html | 6 +- .../api/evennia.contrib.color_markups.html | 2 + .../api/evennia.contrib.custom_gametime.html | 2 + docs/1.0-dev/api/evennia.contrib.dice.html | 6 +- .../api/evennia.contrib.email_login.html | 10 +- .../api/evennia.contrib.extended_room.html | 2 + .../api/evennia.contrib.fieldfill.html | 2 + .../api/evennia.contrib.gendersub.html | 2 + .../api/evennia.contrib.health_bar.html | 2 + docs/1.0-dev/api/evennia.contrib.html | 2 + ...contrib.ingame_python.callbackhandler.html | 2 + ...vennia.contrib.ingame_python.commands.html | 6 +- ...nnia.contrib.ingame_python.eventfuncs.html | 2 + .../api/evennia.contrib.ingame_python.html | 2 + ...evennia.contrib.ingame_python.scripts.html | 2 + .../evennia.contrib.ingame_python.tests.html | 2 + ...nia.contrib.ingame_python.typeclasses.html | 2 + .../evennia.contrib.ingame_python.utils.html | 2 + docs/1.0-dev/api/evennia.contrib.mail.html | 2 + .../api/evennia.contrib.mapbuilder.html | 2 + .../api/evennia.contrib.menu_login.html | 2 + .../api/evennia.contrib.multidescer.html | 2 + docs/1.0-dev/api/evennia.contrib.puzzles.html | 2 + ...ennia.contrib.random_string_generator.html | 2 + .../api/evennia.contrib.rplanguage.html | 2 + .../1.0-dev/api/evennia.contrib.rpsystem.html | 2 + .../evennia.contrib.security.auditing.html | 2 + ...nia.contrib.security.auditing.outputs.html | 2 + ...nnia.contrib.security.auditing.server.html | 2 + ...ennia.contrib.security.auditing.tests.html | 2 + .../1.0-dev/api/evennia.contrib.security.html | 2 + .../api/evennia.contrib.simpledoor.html | 2 + .../api/evennia.contrib.slow_exit.html | 2 + .../api/evennia.contrib.talking_npc.html | 2 + .../api/evennia.contrib.test_traits.html | 2 + docs/1.0-dev/api/evennia.contrib.traits.html | 2 + .../api/evennia.contrib.tree_select.html | 2 + .../api/evennia.contrib.turnbattle.html | 2 + .../evennia.contrib.turnbattle.tb_basic.html | 2 + .../evennia.contrib.turnbattle.tb_equip.html | 2 + .../evennia.contrib.turnbattle.tb_items.html | 2 + .../evennia.contrib.turnbattle.tb_magic.html | 2 + .../evennia.contrib.turnbattle.tb_range.html | 2 + ...ntrib.tutorial_examples.bodyfunctions.html | 2 + ...b.tutorial_examples.cmdset_red_button.html | 18 +- ....tutorial_examples.example_batch_code.html | 2 + .../evennia.contrib.tutorial_examples.html | 2 + ...nnia.contrib.tutorial_examples.mirror.html | 2 + ....contrib.tutorial_examples.red_button.html | 2 + ....tutorial_examples.red_button_scripts.html | 2 + ...ennia.contrib.tutorial_examples.tests.html | 2 + .../api/evennia.contrib.tutorial_world.html | 2 + ...nia.contrib.tutorial_world.intro_menu.html | 2 + .../evennia.contrib.tutorial_world.mob.html | 2 + ...vennia.contrib.tutorial_world.objects.html | 18 +- .../evennia.contrib.tutorial_world.rooms.html | 10 +- .../api/evennia.contrib.unixcommand.html | 2 + .../api/evennia.contrib.wilderness.html | 2 + docs/1.0-dev/api/evennia.help.admin.html | 2 + docs/1.0-dev/api/evennia.help.html | 2 + docs/1.0-dev/api/evennia.help.manager.html | 2 + docs/1.0-dev/api/evennia.help.models.html | 2 + docs/1.0-dev/api/evennia.html | 7 +- docs/1.0-dev/api/evennia.locks.html | 2 + docs/1.0-dev/api/evennia.locks.lockfuncs.html | 2 + .../api/evennia.locks.lockhandler.html | 2 + docs/1.0-dev/api/evennia.objects.admin.html | 2 + docs/1.0-dev/api/evennia.objects.html | 2 + docs/1.0-dev/api/evennia.objects.manager.html | 2 + docs/1.0-dev/api/evennia.objects.models.html | 2 + docs/1.0-dev/api/evennia.objects.objects.html | 5 +- docs/1.0-dev/api/evennia.prototypes.html | 2 + .../1.0-dev/api/evennia.prototypes.menus.html | 2 + .../api/evennia.prototypes.protfuncs.html | 2 + .../api/evennia.prototypes.prototypes.html | 9 + .../api/evennia.prototypes.spawner.html | 2 + docs/1.0-dev/api/evennia.scripts.admin.html | 2 + docs/1.0-dev/api/evennia.scripts.html | 2 + docs/1.0-dev/api/evennia.scripts.manager.html | 2 + docs/1.0-dev/api/evennia.scripts.models.html | 2 + .../api/evennia.scripts.monitorhandler.html | 4 +- .../api/evennia.scripts.scripthandler.html | 2 + docs/1.0-dev/api/evennia.scripts.scripts.html | 2 + .../api/evennia.scripts.taskhandler.html | 2 + .../api/evennia.scripts.tickerhandler.html | 2 + docs/1.0-dev/api/evennia.server.admin.html | 2 + .../api/evennia.server.amp_client.html | 2 + .../api/evennia.server.connection_wizard.html | 2 + .../api/evennia.server.deprecations.html | 2 + .../api/evennia.server.evennia_launcher.html | 2 + ...ennia.server.game_index_client.client.html | 2 + .../api/evennia.server.game_index_client.html | 2 + ...nnia.server.game_index_client.service.html | 2 + docs/1.0-dev/api/evennia.server.html | 2 + .../api/evennia.server.initial_setup.html | 2 + .../api/evennia.server.inputfuncs.html | 2 + docs/1.0-dev/api/evennia.server.manager.html | 2 + docs/1.0-dev/api/evennia.server.models.html | 2 + .../api/evennia.server.portal.amp.html | 2 + .../api/evennia.server.portal.amp_server.html | 2 + .../api/evennia.server.portal.grapevine.html | 2 + docs/1.0-dev/api/evennia.server.portal.html | 2 + .../api/evennia.server.portal.irc.html | 2 + .../api/evennia.server.portal.mccp.html | 2 + .../api/evennia.server.portal.mssp.html | 2 + .../api/evennia.server.portal.mxp.html | 2 + .../api/evennia.server.portal.naws.html | 2 + .../api/evennia.server.portal.portal.html | 2 + ...ia.server.portal.portalsessionhandler.html | 2 + .../api/evennia.server.portal.rss.html | 2 + .../api/evennia.server.portal.ssh.html | 2 + .../api/evennia.server.portal.ssl.html | 2 + .../evennia.server.portal.suppress_ga.html | 2 + .../api/evennia.server.portal.telnet.html | 2 + .../api/evennia.server.portal.telnet_oob.html | 2 + .../api/evennia.server.portal.telnet_ssl.html | 2 + .../api/evennia.server.portal.tests.html | 2 + .../api/evennia.server.portal.ttype.html | 2 + .../api/evennia.server.portal.webclient.html | 2 + .../evennia.server.portal.webclient_ajax.html | 2 + .../evennia.server.profiling.dummyrunner.html | 2 + ...server.profiling.dummyrunner_settings.html | 2 + .../1.0-dev/api/evennia.server.profiling.html | 2 + .../api/evennia.server.profiling.memplot.html | 2 + ...ennia.server.profiling.settings_mixin.html | 2 + ...evennia.server.profiling.test_queries.html | 2 + .../api/evennia.server.profiling.tests.html | 2 + .../evennia.server.profiling.timetrace.html | 2 + docs/1.0-dev/api/evennia.server.server.html | 2 + .../api/evennia.server.serversession.html | 2 + docs/1.0-dev/api/evennia.server.session.html | 2 + .../api/evennia.server.sessionhandler.html | 2 + docs/1.0-dev/api/evennia.server.signals.html | 2 + docs/1.0-dev/api/evennia.server.throttle.html | 61 ++++++- .../api/evennia.server.validators.html | 2 + .../1.0-dev/api/evennia.server.webserver.html | 2 + .../1.0-dev/api/evennia.settings_default.html | 2 + .../api/evennia.typeclasses.admin.html | 2 + .../api/evennia.typeclasses.attributes.html | 2 + docs/1.0-dev/api/evennia.typeclasses.html | 2 + .../api/evennia.typeclasses.managers.html | 2 + .../api/evennia.typeclasses.models.html | 2 + .../1.0-dev/api/evennia.typeclasses.tags.html | 2 + docs/1.0-dev/api/evennia.utils.ansi.html | 75 ++++++-- .../api/evennia.utils.batchprocessors.html | 2 + .../1.0-dev/api/evennia.utils.containers.html | 2 + docs/1.0-dev/api/evennia.utils.create.html | 2 + .../api/evennia.utils.dbserialize.html | 2 + docs/1.0-dev/api/evennia.utils.eveditor.html | 6 +- docs/1.0-dev/api/evennia.utils.evform.html | 2 + docs/1.0-dev/api/evennia.utils.evmenu.html | 2 + docs/1.0-dev/api/evennia.utils.evmore.html | 6 +- docs/1.0-dev/api/evennia.utils.evtable.html | 2 + docs/1.0-dev/api/evennia.utils.gametime.html | 2 + docs/1.0-dev/api/evennia.utils.html | 7 +- docs/1.0-dev/api/evennia.utils.idmapper.html | 2 + .../api/evennia.utils.idmapper.manager.html | 2 + .../api/evennia.utils.idmapper.models.html | 2 + .../api/evennia.utils.idmapper.tests.html | 2 + .../api/evennia.utils.inlinefuncs.html | 2 + docs/1.0-dev/api/evennia.utils.logger.html | 2 + .../api/evennia.utils.optionclasses.html | 2 + .../api/evennia.utils.optionhandler.html | 2 + .../api/evennia.utils.picklefield.html | 2 + docs/1.0-dev/api/evennia.utils.search.html | 2 + .../api/evennia.utils.test_resources.html | 2 + docs/1.0-dev/api/evennia.utils.text2html.html | 4 +- docs/1.0-dev/api/evennia.utils.utils.html | 2 + .../api/evennia.utils.validatorfuncs.html | 2 + docs/1.0-dev/api/evennia.web.api.filters.html | 2 + docs/1.0-dev/api/evennia.web.api.html | 2 + .../api/evennia.web.api.permissions.html | 2 + .../api/evennia.web.api.serializers.html | 2 + docs/1.0-dev/api/evennia.web.api.tests.html | 2 + docs/1.0-dev/api/evennia.web.api.urls.html | 2 + docs/1.0-dev/api/evennia.web.api.views.html | 2 + docs/1.0-dev/api/evennia.web.html | 2 + docs/1.0-dev/api/evennia.web.urls.html | 2 + .../api/evennia.web.utils.backends.html | 2 + .../evennia.web.utils.general_context.html | 2 + docs/1.0-dev/api/evennia.web.utils.html | 2 + .../api/evennia.web.utils.middleware.html | 2 + docs/1.0-dev/api/evennia.web.utils.tests.html | 2 + docs/1.0-dev/api/evennia.web.webclient.html | 2 + .../api/evennia.web.webclient.urls.html | 2 + .../api/evennia.web.webclient.views.html | 2 + .../api/evennia.web.website.forms.html | 2 + docs/1.0-dev/api/evennia.web.website.html | 2 + ...nia.web.website.templatetags.addclass.html | 2 + .../api/evennia.web.website.templatetags.html | 2 + .../api/evennia.web.website.tests.html | 2 + .../1.0-dev/api/evennia.web.website.urls.html | 2 + .../api/evennia.web.website.views.html | 2 + docs/1.0-dev/genindex.html | 22 ++- docs/1.0-dev/index.html | 16 +- docs/1.0-dev/objects.inv | Bin 78710 -> 78766 bytes docs/1.0-dev/py-modindex.html | 2 + docs/1.0-dev/search.html | 2 + docs/1.0-dev/searchindex.js | 2 +- docs/1.0-dev/toc.html | 2 + 1183 files changed, 3839 insertions(+), 733 deletions(-) diff --git a/docs/0.9.5/.buildinfo b/docs/0.9.5/.buildinfo index faf79d3291..3d318ad2dd 100644 --- a/docs/0.9.5/.buildinfo +++ b/docs/0.9.5/.buildinfo @@ -1,4 +1,4 @@ # Sphinx build info version 1 # This file hashes the configuration used when building these files. When it is not found, a full rebuild will be done. -config: b3d6691cbcfd884f2c512e34b39ac37e +config: d0600f95bac1b69ef17923c9d29a7f8b tags: 645f666f9bcd5a90fca523b33c5a78b7 diff --git a/docs/0.9.5/A-voice-operated-elevator-using-events.html b/docs/0.9.5/A-voice-operated-elevator-using-events.html index 6fcb02e837..c79f0731b8 100644 --- a/docs/0.9.5/A-voice-operated-elevator-using-events.html +++ b/docs/0.9.5/A-voice-operated-elevator-using-events.html @@ -38,6 +38,7 @@ +
develop branch
@@ -590,6 +591,7 @@ shown in the next tutorial.

+
develop branch
@@ -166,6 +167,7 @@ easier passthrough on extension.

+
develop branch
@@ -227,6 +228,7 @@ any.

+
develop branch
@@ -233,6 +234,7 @@ to.

+
develop branch
@@ -439,6 +440,7 @@ necessary. If you’re interested in supporting this little project, you are mo +
develop branch
@@ -330,6 +331,7 @@ default character cmdset defaults to being defined as

+
develop branch
@@ -240,6 +241,7 @@ objects you can use Tutorials » +
develop branch
@@ -183,6 +184,7 @@ Settings

+
develop branch
@@ -308,6 +309,7 @@ port but this should be applicable also to other types of proxies (like nginx).< +
develop branch
@@ -342,6 +343,7 @@ on localhost at port 4000, and the webserver at http://localhost:4001/

+
develop branch
@@ -381,6 +382,7 @@ your own liking.

+
develop branch
@@ -551,6 +552,7 @@ those will check for the Developer Central » +
develop branch
@@ -269,6 +270,7 @@ password of any account, including the superuser or admin accounts. This is a fe +
develop branch
@@ -389,6 +390,7 @@ executed. When the code runs it has no knowledge of what file those strings wher +
develop branch
@@ -313,6 +314,7 @@ mode instead, see its readme for install instructions.

+
develop branch
@@ -167,6 +168,7 @@ allowed.

+
develop branch
@@ -219,6 +220,7 @@ started/introduction/) or read one of our other web tutorials.

+
develop branch
@@ -225,6 +226,7 @@ over Tutorials » +
develop branch
@@ -42,7 +43,7 @@
@@ -189,6 +190,7 @@ levels. Note that you cannot escalate your permissions this way; If the Characte +
develop branch
@@ -382,6 +383,7 @@ World-Introduction).

+
develop branch
@@ -414,6 +415,7 @@ shooting goodness would be made available to you only when you enter it.

+
develop branch
@@ -1678,6 +1679,7 @@ exhaustive but user-friendly.

+
develop branch
@@ -400,6 +401,7 @@ others. If you try other databases out, consider expanding this page with instru +
develop branch
@@ -47,50 +48,126 @@

Client Support Grid

-

This grid tries to gather Evennia-specific knowledge about the various clients and protocols used. -Everyone’s welcome to report their findings.

+

This grid tries to gather info about different MU clients when used with Evennia. +If you want to report a problem, update an entry or add a client, make a +new documentation issue for it. Everyone’s encouraged to report their findings.

Legend:

    -
  • Name: The name of the client. If it’s only available for a specific OS, it should be noted -here too.

  • +
  • Name: The name of the client. Also note if it’s OS-specific.

  • Version: Which version or range of client versions were tested.

  • -
  • Comments: Any comments or quirks on using this client with Evennia should be added here. Also -note if some other protocol than Telnet is used (like Websockets, SSH etc).

  • +
  • Comments: Any quirks on using this client with Evennia should be added here.

Client Grid

-

Name | Version | Comments -:———-:———— -Evennia webclient | 0.6 | Uses WS/AJAX. Current client issues -tintin++ | 2.0+ | No MXP support -tinyfugue | 5.0+ | No UTF-8 support -MUSHclient (Win) | 4.94 | NAWS reports full text area -Zmud (Win) | 7.21 | UNTESTED -Cmud (Win) | v3 | UNTESTED -Potato | 2.0.0b16 | No MXP, MCCP support. Win 32bit does not understand -“localhost”, must use 127.0.0.1. Newline issue. -*Won’t send a single blank line on Enter press. -Mudlet | 3.4+ | No known issues. Some older versions showed <> as html under MXP. -SimpleMU (Win) | full | UNTESTED. Discontinued. NAWS reports pixel size. -Atlantis (Mac) | 0.9.9.4 | No known issues. -GMUD | 0.0.1 | Can’t handle any telnet handshakes. Not recommended. -BeipMU (Win) | 3.0.255 | No MXP support. Best to enable “MUD prompt handling”, disable -“Handle HTML tags”. -MudRammer (IOS) | 1.8.7 | Bad Telnet Protocol compliance: displays spurious characters. -MUDMaster (IOS) | 1.3.1 | UNTESTED -BlowTorch (Andr) | 1.1.3 | *Telnet NOP displays as spurious character. -Mukluk (Andr) | 2015.11.20| *Telnet NOP displays as spurious character. Has UTF-8/Emoji -support. -Gnome-MUD (Unix) | 0.11.2 | Telnet handshake errors. First (only) attempt at logging in -fails. -Spyrit | 0.4 | No MXP, OOB support. -JamochaMUD | 5.2 | Does not support ANSI within MXP text. -DuckClient (Chrome)| 4.2 | No MXP support. Displays Telnet Go-Ahead and WILL SUPPRESS-GO-AHEAD -as ù character. Also seems to run the version command on connection, which will not work in -MULTISESSION_MODES above 1. -KildClient | 2.11.1 | No known issues.

+ +++++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

Name

Version

Comments

Evennia Webclient

0.9

Evennia-specific

tintin++

2.0+

No MXP support

tinyfugue

5.0+

No UTF-8 support

MUSHclient (Win)

4.94

NAWS reports full text area

Zmud (Win)

7.21

UNTESTED

Cmud (Win)

v3

UNTESTED

Potato

2.0.0b16

No MXP, MCCP support. Win 32bit does not understand +“localhost”, must use 127.0.0.1.

Mudlet

3.4+

No known issues. Some older versions showed <> as html +under MXP.

SimpleMU (Win)

full

Discontinued. NAWS reports pixel size.

Atlantis (Mac)

0.9.9.4

No known issues.

GMUD

0.0.1

Can’t handle any telnet handshakes. Not recommended.

BeipMU (Win)

3.0.255

No MXP support. Best to enable “MUD prompt handling”, disable +“Handle HTML tags”.

MudRammer (IOS)

1.8.7

Bad Telnet Protocol compliance: displays spurious characters.

MUDMaster

1.3.1

UNTESTED

BlowTorch (Andr)

1.1.3

Telnet NOP displays as spurious character.

Mukluk (Andr)

2015.11.20

Telnet NOP displays as spurious character. Has UTF-8/Emoji +support.

Gnome-MUD (Unix)

0.11.2

Telnet handshake errors. First (only) attempt at logging in +fails.

Spyrit

0.4

No MXP, OOB support.

JamochaMUD

5.2

Does not support ANSI within MXP text.

DuckClient (Chrome)

4.2

No MXP support. Displays Telnet Go-Ahead and +WILL SUPPRESS-GO-AHEAD as ù character. Also seems to run +the version command on connection, which will not work in +MULTISESSION_MODES above 1.

KildClient

2.11.1

No known issues.

Workarounds for client issues:

@@ -98,27 +175,16 @@ as ù character. Also seems to run the

Known clients:

Workaround:

    -
  • Set the command in game to @option NOPKEEPALIVE=off for the session, or use the /save -parameter to disable it for that Evennian account permanently.

  • +
  • In-game: Use @option NOPKEEPALIVE=off for the session, or use the /save +parameter to disable it for that Evennia account permanently.

  • Client-side: Set a gag-type trigger on the NOP character to make it invisible to the client.

-
-

Issue: Won’t send blank line on Enter key press.

-

Known clients:

- -

Workaround:

-
    -
  • Press Control Enter, then Enter key again to send blank line.

  • -
-
@@ -149,7 +215,6 @@ parameter to disable it for that Evennian account permanently.

  • Client Grid
  • Workarounds for client issues:
  • @@ -198,6 +263,7 @@ parameter to disable it for that Evennian account permanently.

    +
    develop branch
    @@ -633,6 +634,7 @@ discussion where some suitable fonts are suggested.

    +
    develop branch
    @@ -219,6 +220,7 @@ can’t find the answer in the docs, don’t be shy to ask questions! The +
    develop branch
    @@ -480,6 +481,7 @@ instructions.

    +
    develop branch
    @@ -255,6 +256,7 @@ other types of attacks for a while before the warrior can recover.

    +
    develop branch
    @@ -742,6 +743,7 @@ callback when the server comes back up (it will resume the countdown and ignore +
    develop branch
    @@ -300,6 +301,7 @@ directly the easiest way is to just wrap those with a multiple inheritance to yo +
    develop branch
    @@ -525,6 +526,7 @@ commands having any combination of the keys and/or aliases “kick”, “punch +
    develop branch
    @@ -121,6 +122,7 @@ +
    develop branch
    @@ -897,6 +898,7 @@ on.

    +
    develop branch
    @@ -236,6 +237,7 @@ for channel communication (since the default ChannelCommand instead logs to a fi +
    develop branch
    @@ -151,6 +152,7 @@ tutorial section on how to add new commands to a default command set.

    +
    develop branch
    @@ -441,6 +442,7 @@ build steps could be added or removed at this point, adding some features like U +
    develop branch
    @@ -44,42 +45,18 @@

    Contributing to Evennia Docs

    Warning

    -

    WARNING: This system is still WIP and many things are bound to change!

    +

    The creation of docs pages is still WIP and we are still figuring things out here and there.

    -

    Contributing to the docs is is like [contributing to the rest of Evennia][contributing]: Check out the branch of Evennia you want to edit the documentation for. Create your +

    Contributing to the docs is is like contributing to the rest of Evennia: Check out the branch of Evennia you want to edit the documentation for. Create your own work-branch, make your changes to files in evennia/docs/source/ and make a PR for it!

    The documentation source files are *.md (Markdown) files found in evennia/docs/source/. Markdown files are simple text files that can be edited with a normal text editor. They can also contain raw HTML directives (but that is very rarely needed). They primarly use -the [Markdown][commonmark] syntax. See the syntax section below for more help.

    +the Markdown syntax. See the syntax section below for more help.

    Source file structure

    -

    The sources are organized into several rough categories, with only a few administrative documents -at the root of evennia/docs/source/. The folders are named in singular form since they will -primarily be accessed as link refs (e.g. Component/Account)

    -
      -
    • source/Components/ are docs describing separate Evennia building blocks, that is, things -that you can import and use. This extends and elaborates on what can be found out by reading -the api docs themselves. Example are documentation for Accounts, Objects and Commands.

    • -
    • source/Concepts/ describes how larger-scale features of Evennia hang together - things that -can’t easily be broken down into one isolated component. This can be general descriptions of -how Models and Typeclasses interact to the path a message takes from the client to the server -and back.

    • -
    • source/Setup/ holds detailed docs on installing, running and maintaining the Evennia server and -the infrastructure around it.

    • -
    • source/Coding/ has help on how to interact with, use and navigate the Evennia codebase itself. -This also has non-Evennia-specific help on general development concepts and how to set up a sane -development environment.

    • -
    • source/Contribs/ holds documentation specifically for packages in the evennia/contribs/ folder. -Any contrib-specific tutorials will be found here instead of in Howtos

    • -
    • source/Howtos/ holds docs that describe how to achieve a specific goal, effect or -result in Evennia. This is often on a tutorial or FAQ form and will refer to the rest of the -documentation for further reading.

      -
        -
      • source/Howtos/Starting/ holds all documents part of the initial tutorial sequence.

      • -
      -
    • -
    +

    For v 0.9.5, the sources are all together under evennia/docs/source/. The main files are all +Markdown (.md) files.

    Other files and folders:

    • source/api/ contains the auto-generated API documentation as .rst files. Don’t edit these @@ -94,16 +71,16 @@ the Evennia version on a new branch.

    • Building the docs locally

      The sources in evennia/docs/source/ are built into a documentation using the -[Sphinx][sphinx] static generator system. To do this locally you need to use a -system with make (Linux/Unix/Mac or [Windows-WSL][Windows-WSL]). Lacking +Sphinx static generator system. To do this locally you need to use a +system with make (Linux/Unix/Mac or Windows-WSL). Lacking that, you could in principle also run the sphinx build-commands manually - read the evennia/docs/Makefile to see which commands are run by the make-commands referred to in this document.

      You don’t necessarily have to build the docs locally to contribute. Markdown is not hard and is very readable on its raw text-form.

      You can furthermore get a good feel for how things will look using a -Markdown-viewer like [Grip][grip]. Editors like [ReText][retext] or IDE’s like -[PyCharm][pycharm] also have native Markdown previews. Building the docs locally is +Markdown-viewer like Grip. Editors like ReText or IDE’s like +PyCharm also have native Markdown previews. Building the docs locally is however the only way to make sure the outcome is exactly as you expect. The process will also find any mistakes you made, like making a typo in a link.

      @@ -196,7 +173,7 @@ view the full docs.

      If you for some reason want to use another location of your gamedir/, or want it named something else (maybe you already use the name ‘gamedir’ for your development …), you can do so by setting the EVGAMEDIR environment variable to the absolute path -of your alternative game dir. For example:

      +of your alternative game dir. For example (bash):

      EVGAMEDIR=/my/path/to/mygamedir make local
       
      @@ -246,7 +223,7 @@ available at https://evennia.github.io/evennia/latest/.

      Editing syntax

      -

      The format used for Evennia’s docs is [Markdown][commonmark-help] (Commonmark). While markdown +

      The format used for Evennia’s docs is Markdown (Commonmark). While markdown supports a few alternative forms for some of these, we try to stick to the below forms for consistency.

      @@ -314,7 +291,7 @@ thing to remember.

    +
    develop branch
    @@ -232,6 +233,7 @@ UBBFWIuVDEZxC0M_2pM6ywO&dispatch=5885d80a13c0db1f8e263663d3faee8d66f31424b43 +
    develop branch
    @@ -603,6 +604,7 @@ square (E, G, M and O) are not in this circle. So we remove them.

    +
    develop branch
    @@ -458,6 +459,7 @@ ways.

    +
    develop branch
    @@ -789,6 +790,7 @@ lg/avenew/blob/master/commands/comms.py)

    +
    develop branch
    @@ -397,6 +398,7 @@ topic here.

    +
    develop branch
    @@ -3036,6 +3037,7 @@ ttps://github.com/evennia/evennia/tree/master/evennia/commands/default/cmdset_un +
    develop branch
    @@ -277,6 +278,7 @@ matching “north” exit-command.

    +
    develop branch
    @@ -272,6 +273,7 @@ over time

    +
    develop branch
    @@ -360,6 +361,7 @@ events).

    +
    develop branch
    @@ -196,6 +197,7 @@ having to import from their actual locations inside the source tree.

    +
    develop branch
    @@ -229,6 +230,7 @@ call return_appearance

    +
    develop branch
    @@ -835,6 +836,7 @@ also look into up/down directions and figure out how to display that in a good w +
    develop branch
    @@ -359,6 +360,7 @@ editor can be useful if you want to test the code you have typed but add new lin +
    develop branch
    @@ -1802,6 +1803,7 @@ until the exit node.

    +
    develop branch
    @@ -152,6 +153,7 @@ paging.

    +
    develop branch
    @@ -114,8 +115,8 @@ The flat API is defined in
  • evennia.Command - base Command class. See also evennia.default_cmds.MuxCommand

  • evennia.CmdSet - base Cmdset class

  • -
  • evennia.default_cmds - access all default command classes as properties

  • -
  • evennia.syscmdkeys - access system command keys as properties

  • +
  • evennia.default_cmds - access to all default command classes as properties

  • +
  • evennia.syscmdkeys - access to all system command names as properties

  • @@ -156,8 +157,7 @@ The flat API is defined in

    Contributions

    @@ -244,6 +244,7 @@ game-specific contributions and plugins (Developer Central » +
    develop branch
    @@ -205,6 +206,7 @@ if you are not ready for players yet.

    +
    develop branch
    @@ -287,6 +288,7 @@ your own game, you will end up with a small (very small) game that you can build +
    develop branch
    @@ -382,6 +383,7 @@ your mob.

    +
    develop branch
    @@ -347,6 +348,7 @@ question in our Tutorials » +
    develop branch
    @@ -1170,6 +1171,7 @@ when the message was sent.

    +
    develop branch
    @@ -239,6 +240,7 @@ Out[3]: [<ObjectDB: Harry>, <ObjectDB: Limbo>, ...] +
    develop branch
    @@ -463,6 +464,7 @@ developers.

    +
    develop branch
    @@ -337,6 +338,7 @@ have made their dream game a reality!

    +
    develop branch
    @@ -495,6 +496,7 @@ same way as described for the default one above.

    +
    develop branch
    @@ -609,6 +610,7 @@ virus software interfering. Try disabling or changing your anti-virus software s +
    develop branch
    @@ -479,6 +480,7 @@ activated whenever you want to use the Evennia 0.9.5 » +
    develop branch
    @@ -180,6 +181,7 @@ it to your channel in-game.

    +
    develop branch
    @@ -136,6 +137,7 @@ of nine names from +
    develop branch
    @@ -246,6 +247,7 @@ Linux mechanism for running things at specific times.

    +
    develop branch
    @@ -695,6 +696,7 @@ themselves links to display their details.

    +
    develop branch
    @@ -251,6 +252,7 @@ definition:

    +
    develop branch
    @@ -166,6 +167,7 @@ mage/* +
    develop branch
    @@ -262,6 +263,7 @@ help.

    +
    develop branch
    @@ -198,6 +199,7 @@ name of the IRC channel you used (#evennia here).

    +
    develop branch
    @@ -556,6 +557,7 @@ tag dummy=training_dummy

    +
    develop branch
    @@ -312,6 +313,7 @@ add more. By default the following fields/attributes can be monitored:

    +
    develop branch
    @@ -227,6 +228,7 @@ killed if your phone is heavily taxed. Termux seems to keep a notification up to +
    develop branch
    @@ -203,6 +204,7 @@ your own repository clone) so we can integrate your translation into Evennia!

    Administrative Docs » +
    develop branch
    @@ -167,6 +168,7 @@ commands when obtaining a weapon.

    +
    develop branch
    @@ -131,6 +132,7 @@ as Evennia itself, unless the individual contributor has specifically defined ot +
    develop branch
    @@ -304,6 +305,7 @@ programming curriculum for different skill levels

    +
    develop branch
    @@ -662,6 +663,7 @@ interface. It’s stand-alone from the permissions described above.

    +
    develop branch
    @@ -333,6 +334,7 @@ regardless of if Evennia thinks their client supports it or not.

    +
    develop branch
    @@ -241,6 +242,7 @@ default_cmdsets.py file:

    +
    develop branch
    @@ -434,6 +435,7 @@ information needed between server and client.

    +
    develop branch
    @@ -209,6 +210,7 @@ the monitor to remove:

    +
    develop branch
    @@ -593,6 +594,7 @@ it well stocked.

    +
    develop branch
    @@ -399,6 +400,7 @@ lot more information about querying the database.

    +
    develop branch
    @@ -248,6 +249,7 @@ basically the unchanged strings you enter to the Developer Central » +
    develop branch
    @@ -297,6 +298,7 @@ same example (" +
    develop branch
    @@ -317,6 +318,7 @@ and display this as an error message. If this is not found, the Exit will instea +
    develop branch
    @@ -678,6 +679,7 @@ https://aws.amazon.com/cloud9/

    +
    develop branch
    @@ -1105,6 +1106,7 @@ code.

    +
    develop branch
    @@ -120,6 +121,7 @@ This allows the two programs to communicate seamlessly.

    +
    develop branch
    @@ -240,6 +241,7 @@ course hard to actually mimic human user behavior. For this, actual real-game te +
    develop branch
    @@ -192,6 +193,7 @@ ened&group=status&milestone=Python-3.x)

    +
    develop branch
    @@ -367,6 +368,7 @@ about objects and to explore the Evennia library.

    +
    develop branch
    @@ -370,7 +371,7 @@ Character.

    This means that DefaultCharacter is in itself a child of something called DefaultObject! Let’s see what this parent class provides. It’s in the same module as DefaultCharacter, you just need to -scroll up near the +scroll up near the top:

    - +
    1
     2
    class DefaultObject(with_metaclass(TypeclassBase, ObjectDB)):
    @@ -639,6 +640,7 @@ of the beginning-level Tutorials »
              
           
    +      
    develop branch
    @@ -235,6 +236,7 @@ instructions, use the following command to fix it:

    +
    develop branch
    @@ -165,6 +166,7 @@ same channels as Administrative Docs » +
    develop branch
    @@ -91,6 +92,7 @@ Page.

    +
    develop branch
    @@ -412,6 +413,7 @@ line.

    +
    develop branch
    @@ -102,6 +103,7 @@ interface for editing the database online.

    +
    develop branch
    @@ -572,6 +573,7 @@ tutorial.

    +
    develop branch
    @@ -255,6 +256,7 @@ ISP snooping.

    +
    develop branch
    @@ -222,6 +223,7 @@ know about if you are an Evennia developer.

    +
    develop branch
    @@ -302,6 +303,7 @@ module for details on the capabilities of the Developer Central » +
    develop branch
    @@ -239,6 +240,7 @@ still running in interactive mode.

    +
    develop branch
    @@ -235,6 +236,7 @@ decorator (only relevant for unit testing)

    +
    develop branch
    @@ -182,6 +183,7 @@ pseudo-softcode plugin aimed at developers wanting to script their game from ins +
    develop branch
    @@ -461,6 +462,7 @@ the api docs.

    +
    develop branch
    @@ -316,6 +317,7 @@ In-game you should now get the message that the Server has successfully restarte +
    develop branch
    @@ -718,6 +719,7 @@ system.

    +
    develop branch
    @@ -316,6 +317,7 @@ is found in the Developer Central » +
    develop branch
    @@ -176,6 +177,7 @@ the Wikipedia article Administrative Docs » +
    develop branch
    @@ -489,6 +490,7 @@ value will be a float (so Developer Central » +
    develop branch
    @@ -242,6 +243,7 @@ same time without input from something else.

    +
    develop branch
    @@ -948,6 +949,7 @@ show others what’s going on.

    +
    develop branch
    @@ -254,6 +255,7 @@ AI code).

    +
    develop branch
    @@ -264,6 +265,7 @@ Which way to go depends on the design requirements of your particular game.

    +
    develop branch
    @@ -595,6 +596,7 @@ in a format like the following:

    +
    develop branch
    @@ -267,6 +268,7 @@ as mygame/typeclass +
    develop branch
    @@ -664,6 +665,7 @@ direction to which room it goes.

    +
    develop branch
    @@ -227,6 +228,7 @@ itself.

    +
    develop branch
    @@ -1001,6 +1002,7 @@ as the Tutorials » +
    develop branch
    @@ -284,6 +285,7 @@ to MUSH-style servers.

    +
    develop branch
    @@ -467,6 +468,7 @@ comments for examples and solutions.

    +
    develop branch
    @@ -278,6 +279,7 @@ push it over the limit, so to speak.

    +
    develop branch
    @@ -655,6 +656,7 @@ string.

    +
    develop branch
    @@ -247,6 +248,7 @@ you then just run e +
    develop branch
    @@ -231,6 +232,7 @@ something to the effect of

    +
    develop branch
    @@ -156,6 +157,7 @@ to that for making tests fitting your game.

    +
    develop branch
    @@ -570,6 +571,7 @@ understand the underlying ideas behind GIT +
    develop branch
    @@ -175,6 +176,7 @@ weather came before it. Expanding it to be more realistic is a useful exercise.< +
    develop branch
    @@ -1009,6 +1010,7 @@ to see what happens. And do the same while checking the checkbox!

    +
    develop branch
    @@ -392,6 +393,7 @@ here.

    +
    develop branch
    @@ -256,6 +257,7 @@ implementation, the relevant django “applications” in default Evennia are Developer Central » +
    develop branch
    @@ -228,6 +229,7 @@ possibilities exist.

    +
    develop branch
    @@ -449,6 +450,7 @@ could stay in this mode, but they could also “lock” the gui layout at any ti +
    develop branch
    @@ -388,6 +389,7 @@ clear your browser cache before loading the webclient page.

    +
    develop branch
    @@ -304,6 +305,7 @@ character-info

    +
    develop branch
    @@ -166,6 +167,7 @@ properly search the inheritance tree.

    +
    develop branch
    @@ -337,6 +338,7 @@ +
    develop branch
    @@ -1219,6 +1220,7 @@ +
    develop branch
    @@ -283,6 +284,7 @@ +
    develop branch
    @@ -418,6 +419,7 @@ +
    develop branch
    @@ -515,6 +516,7 @@ +
    develop branch
    @@ -432,8 +433,12 @@ BASE_GUEST_TYPECLASS = class_from_module(settings.BASE_GUEST_TYPECLASS) del class_from_module - # delayed starts + # delayed starts - important so as to not back-access evennia before it has + # finished initializing GLOBAL_SCRIPTS.start() + from .prototypes import prototypes + prototypes.load_module_prototypes() + del prototypes
    [docs]def set_trace(term_size=(140, 80), debugger="auto"): @@ -545,6 +550,7 @@ +
    develop branch
    @@ -93,10 +94,10 @@ # Create throttles for too many account-creations and login attempts CREATION_THROTTLE = Throttle( - limit=settings.CREATION_THROTTLE_LIMIT, timeout=settings.CREATION_THROTTLE_TIMEOUT + name='creation', limit=settings.CREATION_THROTTLE_LIMIT, timeout=settings.CREATION_THROTTLE_TIMEOUT ) LOGIN_THROTTLE = Throttle( - limit=settings.LOGIN_THROTTLE_LIMIT, timeout=settings.LOGIN_THROTTLE_TIMEOUT + name='login', limit=settings.LOGIN_THROTTLE_LIMIT, timeout=settings.LOGIN_THROTTLE_TIMEOUT ) @@ -1761,6 +1762,7 @@ +
    develop branch
    @@ -449,6 +450,7 @@ +
    develop branch
    @@ -663,6 +664,7 @@ +
    develop branch
    @@ -273,6 +274,7 @@ +
    develop branch
    @@ -265,6 +266,7 @@ +
    develop branch
    @@ -911,6 +912,7 @@ +
    develop branch
    @@ -250,10 +251,15 @@ quality = [mat[4] for mat in matches] matches = matches[-quality.count(quality[-1]) :] - if len(matches) > 1 and match_index is not None and 0 < match_index <= len(matches): + if len(matches) > 1 and match_index is not None: # We couldn't separate match by quality, but we have an # index argument to tell us which match to use. - matches = [matches[match_index - 1]] + if 0 < match_index <= len(matches): + matches = [matches[match_index - 1]] + else: + # we tried to give an index outside of the range - this means + # a no-match + matches = [] # no matter what we have at this point, we have to return it. return matches
    @@ -302,6 +308,7 @@ +
    develop branch
    @@ -555,15 +556,16 @@ # cmd is a command set so merge all commands in that set # to this one. We raise a visible error if we created # an infinite loop (adding cmdset to itself somehow) + cmdset = cmd try: - cmd = self._instantiate(cmd) + cmdset = self._instantiate(cmdset) except RuntimeError: - string = "Adding cmdset %(cmd)s to %(class)s lead to an " - string += "infinite loop. When adding a cmdset to another, " - string += "make sure they are not themself cyclically added to " - string += "the new cmdset somewhere in the chain." - raise RuntimeError(_(string) % {"cmd": cmd, "class": self.__class__}) - cmds = cmd.commands + err = ("Adding cmdset {cmdset} to {cls} lead to an " + "infinite loop. When adding a cmdset to another, " + "make sure they are not themself cyclically added to " + "the new cmdset somewhere in the chain.") + raise RuntimeError(_(err.format(cmdset=cmdset, cls=self.__class__))) + cmds = cmdset.commands elif is_iter(cmd): cmds = [self._instantiate(c) for c in cmd] else: @@ -572,7 +574,7 @@ system_commands = self.system_commands for cmd in cmds: # add all commands - if not hasattr(cmd, "obj"): + if not hasattr(cmd, "obj") or cmd.obj is None: cmd.obj = self.cmdsetobj try: ic = commands.index(cmd) @@ -757,6 +759,7 @@ +
    develop branch
    @@ -738,6 +739,7 @@ +
    develop branch
    @@ -759,6 +760,7 @@ +
    develop branch
    @@ -345,7 +346,7 @@ character_candidates = [] if not self.args: - character_candidates = [account.db._last_puppet] or [] + character_candidates = [account.db._last_puppet] if account.db._last_puppet else [] if not character_candidates: self.msg("Usage: ic <character>") return @@ -1138,6 +1139,7 @@ +
    develop branch
    @@ -679,6 +680,7 @@ +
    develop branch
    @@ -905,6 +906,7 @@ +
    develop branch
    @@ -3902,6 +3903,7 @@ +
    develop branch
    @@ -161,6 +162,7 @@ +
    develop branch
    @@ -176,6 +177,7 @@ +
    develop branch
    @@ -102,6 +103,7 @@ +
    develop branch
    @@ -111,6 +112,7 @@ +
    develop branch
    @@ -1441,6 +1442,7 @@ +
    develop branch
    @@ -812,6 +813,7 @@ +
    develop branch
    @@ -629,6 +630,7 @@ +
    develop branch
    @@ -354,6 +355,7 @@ +
    develop branch
    @@ -237,6 +238,7 @@ +
    develop branch
    @@ -883,21 +884,30 @@ return if service.name[:7] == "Evennia": if delmode: - caller.msg("You cannot remove a core Evennia service (named 'Evennia***').") + caller.msg("You cannot remove a core Evennia service (named 'Evennia*').") return - string = "You seem to be shutting down a core Evennia service (named 'Evennia***'). Note that" - string += "stopping some TCP port services will *not* disconnect users *already*" - string += "connected on those ports, but *may* instead cause spurious errors for them. To " - string += "safely and permanently remove ports, change settings file and restart the server." + string = ("|RYou seem to be shutting down a core Evennia " + "service (named 'Evennia*').\nNote that stopping " + "some TCP port services will *not* disconnect users " + "*already* connected on those ports, but *may* " + "instead cause spurious errors for them.\nTo safely " + "and permanently remove ports, change settings file " + "and restart the server.|n\n") caller.msg(string) if delmode: service.stopService() service_collection.removeService(service) - caller.msg("Stopped and removed service '%s'." % self.args) + caller.msg("|gStopped and removed service '%s'.|n" % self.args) else: - service.stopService() - caller.msg("Stopped service '%s'." % self.args) + caller.msg(f"Stopping service '{self.args}'...") + try: + service.stopService() + except Exception as err: + caller.msg(f"|rErrors were reported when stopping this service{err}.\n" + "If there are remaining problems, try reloading " + "or rebooting the server.") + caller.msg("|g... Stopped service '%s'.|n" % self.args) return if switches[0] == "start": @@ -905,8 +915,14 @@ if service.running: caller.msg("That service is already running.") return - caller.msg("Starting service '%s'." % self.args) - service.startService()
    + caller.msg(f"Starting service '{self.args}' ...") + try: + service.startService() + except Exception as err: + caller.msg(f"|rErrors were reported when starting this service{err}.\n" + "If there are remaining problems, try reloading the server, changing the " + "settings if it's a non-standard service.|n") + caller.msg("|gService started.|n")
    [docs]class CmdAbout(COMMAND_DEFAULT_CLASS): @@ -1251,6 +1267,7 @@ +
    develop branch
    @@ -1682,6 +1683,7 @@ +
    develop branch
    @@ -581,6 +582,7 @@ +
    develop branch
    @@ -207,6 +208,7 @@ +
    develop branch
    @@ -407,6 +408,7 @@ +
    develop branch
    @@ -906,6 +907,7 @@ +
    develop branch
    @@ -499,6 +500,7 @@ +
    develop branch
    @@ -825,6 +826,7 @@ +
    develop branch
    @@ -981,6 +982,7 @@ +
    develop branch
    @@ -1351,6 +1352,7 @@ +
    develop branch
    @@ -278,6 +279,7 @@ +
    develop branch
    @@ -828,6 +829,7 @@ +
    develop branch
    @@ -393,6 +394,7 @@ +
    develop branch
    @@ -346,6 +347,7 @@ +
    develop branch
    @@ -447,6 +448,7 @@ +
    develop branch
    @@ -677,6 +678,7 @@ +
    develop branch
    @@ -800,6 +801,7 @@ +
    develop branch
    @@ -241,6 +242,7 @@ +
    develop branch
    @@ -204,6 +205,7 @@ +
    develop branch
    @@ -309,6 +310,7 @@ +
    develop branch
    @@ -667,6 +668,7 @@ +
    develop branch
    @@ -175,6 +176,7 @@ +
    develop branch
    @@ -752,6 +753,7 @@ +
    develop branch
    @@ -627,6 +628,7 @@ +
    develop branch
    @@ -1003,6 +1004,7 @@ +
    develop branch
    @@ -347,6 +348,7 @@ +
    develop branch
    @@ -443,6 +444,7 @@ +
    develop branch
    @@ -586,6 +587,7 @@ +
    develop branch
    @@ -338,6 +339,7 @@ +
    develop branch
    @@ -354,6 +355,7 @@ +
    develop branch
    @@ -898,6 +899,7 @@ +
    develop branch
    @@ -438,6 +439,7 @@ +
    develop branch
    @@ -629,6 +630,7 @@ +
    develop branch
    @@ -1709,6 +1710,7 @@ +
    develop branch
    @@ -144,6 +145,7 @@ +
    develop branch
    @@ -333,6 +334,7 @@ +
    develop branch
    @@ -198,6 +199,7 @@ +
    develop branch
    @@ -256,6 +257,7 @@ +
    develop branch
    @@ -228,6 +229,7 @@ +
    develop branch
    @@ -217,6 +218,7 @@ +
    develop branch
    @@ -661,6 +662,7 @@ +
    develop branch
    @@ -864,6 +865,7 @@ +
    develop branch
    @@ -1222,6 +1223,7 @@ +
    develop branch
    @@ -1541,6 +1542,7 @@ +
    develop branch
    @@ -1463,6 +1464,7 @@ +
    develop branch
    @@ -1519,6 +1520,7 @@ +
    develop branch
    @@ -150,6 +151,7 @@ +
    develop branch
    @@ -419,6 +420,7 @@ +
    develop branch
    @@ -251,6 +252,7 @@ +
    develop branch
    @@ -369,6 +370,7 @@ +
    develop branch
    @@ -155,6 +156,7 @@ +
    develop branch
    @@ -430,7 +431,7 @@ (aka MUDs, MUSHes, MUX, MOOs...). It is open-source and |wfree to use|n, also for commercial projects (BSD license). -Out of the box, Evennia provides a |wfull, if empty game|n. Whereas you can play +Out of the box, Evennia provides a |wworking, if empty game|n. Whereas you can play via traditional telnet MUD-clients, the server runs your game's website and offers a |wHTML5 webclient|n so that people can play your game in their browser without downloading anything extra. @@ -866,6 +867,7 @@ +
    develop branch
    @@ -520,6 +521,7 @@ +
    develop branch
    @@ -1268,6 +1269,7 @@ +
    develop branch
    @@ -1252,6 +1253,7 @@ +
    develop branch
    @@ -379,6 +380,7 @@ +
    develop branch
    @@ -861,6 +862,7 @@ +
    develop branch
    @@ -140,6 +141,7 @@ +
    develop branch
    @@ -236,6 +237,7 @@ +
    develop branch
    @@ -377,6 +378,7 @@ +
    develop branch
    @@ -782,6 +783,7 @@ +
    develop branch
    @@ -841,6 +842,7 @@ +
    develop branch
    @@ -281,6 +282,7 @@ +
    develop branch
    @@ -507,19 +508,25 @@ # strips the number match_number, searchdata = match.group("number"), match.group("name") match_number = int(match_number) - 1 - match_number = match_number if match_number >= 0 else None if match_number is not None or not exact: # run search again, with the exactness set by call matches = _searcher(searchdata, candidates, typeclass, exact=exact) # deal with result - if len(matches) > 1 and match_number is not None: + if len(matches) == 1 and match_number is not None and match_number != 0: + # this indicates trying to get a single match with a match-number + # targeting some higher-number match (like 2-box when there is only + # one box in the room). This leads to a no-match. + matches = [] + elif len(matches) > 1 and match_number is not None: # multiple matches, but a number was given to separate them - try: + if 0 <= match_number < len(matches): + # limit to one match matches = [matches[match_number]] - except IndexError: - # match number not matching anything - pass + else: + # a number was given outside of range. This means a no-match. + matches = [] + # return a list (possibly empty) return matches @@ -677,6 +684,7 @@ +
    develop branch
    @@ -469,6 +470,7 @@ +
    develop branch
    @@ -435,7 +436,8 @@ a global search. - `me,self`: self-reference to this object - `<num>-<string>` - can be used to differentiate - between multiple same-named matches + between multiple same-named matches. The exact form of this input + is given by `settings.SEARCH_MULTIMATCH_REGEX`. global_search (bool): Search all objects globally. This overrules 'location' data. use_nicks (bool): Use nickname-replace (nicktype "object") on `searchdata`. typeclass (str or Typeclass, or list of either): Limit search only @@ -2791,6 +2793,7 @@ +
    develop branch
    @@ -2843,6 +2844,7 @@ +
    develop branch
    @@ -430,6 +431,7 @@ +
    develop branch
    @@ -185,35 +186,41 @@ # module-based prototypes -for mod in settings.PROTOTYPE_MODULES: - # to remove a default prototype, override it with an empty dict. - # internally we store as (key, desc, locks, tags, prototype_dict) - prots = [] - for variable_name, prot in all_from_module(mod).items(): - if isinstance(prot, dict): - if "prototype_key" not in prot: - prot["prototype_key"] = variable_name.lower() - prots.append((prot["prototype_key"], homogenize_prototype(prot))) - # assign module path to each prototype_key for easy reference - _MODULE_PROTOTYPE_MODULES.update({prototype_key.lower(): mod for prototype_key, _ in prots}) - # make sure the prototype contains all meta info - for prototype_key, prot in prots: - actual_prot_key = prot.get("prototype_key", prototype_key).lower() - prot.update( - { - "prototype_key": actual_prot_key, - "prototype_desc": prot["prototype_desc"] if "prototype_desc" in prot else mod, - "prototype_locks": ( - prot["prototype_locks"] - if "prototype_locks" in prot - else "use:all();edit:false()" - ), - "prototype_tags": list( - set(list(make_iter(prot.get("prototype_tags", []))) + ["module"]) - ), - } - ) - _MODULE_PROTOTYPES[actual_prot_key] = prot +
    [docs]def load_module_prototypes(): + """ + This is called by `evennia.__init__` as Evennia initializes. It's important + to do this late so as to not interfere with evennia initialization. + + """ + for mod in settings.PROTOTYPE_MODULES: + # to remove a default prototype, override it with an empty dict. + # internally we store as (key, desc, locks, tags, prototype_dict) + prots = [] + for variable_name, prot in all_from_module(mod).items(): + if isinstance(prot, dict): + if "prototype_key" not in prot: + prot["prototype_key"] = variable_name.lower() + prots.append((prot["prototype_key"], homogenize_prototype(prot))) + # assign module path to each prototype_key for easy reference + _MODULE_PROTOTYPE_MODULES.update({prototype_key.lower(): mod for prototype_key, _ in prots}) + # make sure the prototype contains all meta info + for prototype_key, prot in prots: + actual_prot_key = prot.get("prototype_key", prototype_key).lower() + prot.update( + { + "prototype_key": actual_prot_key, + "prototype_desc": prot["prototype_desc"] if "prototype_desc" in prot else mod, + "prototype_locks": ( + prot["prototype_locks"] + if "prototype_locks" in prot + else "use:all();edit:false()" + ), + "prototype_tags": list( + set(list(make_iter(prot.get("prototype_tags", []))) + ["module"]) + ), + } + ) + _MODULE_PROTOTYPES[actual_prot_key] = prot
    # Db-based prototypes @@ -970,7 +977,10 @@ value = validator(value[0](*make_iter(args))) else: value = validator(value) - return protfunc_parser(value)
    + result = protfunc_parser(value) + if result != value: + return validator(result) + return result
    [docs]def value_to_obj_or_any(value): @@ -1041,6 +1051,7 @@ +
    develop branch
    @@ -1076,6 +1077,7 @@ +
    develop branch
    @@ -175,6 +176,7 @@ +
    develop branch
    @@ -370,6 +371,7 @@ +
    develop branch
    @@ -265,6 +266,7 @@ +
    develop branch
    @@ -134,7 +135,7 @@
    [docs] def at_update(self, obj, fieldname): """ - Called by the field as it saves. + Called by the field/attribute as it saves. """ to_delete = [] @@ -289,6 +290,7 @@ +
    develop branch
    @@ -256,6 +257,7 @@ +
    develop branch
    @@ -800,6 +801,7 @@ +
    develop branch
    @@ -287,6 +288,7 @@ +
    develop branch
    @@ -121,9 +122,15 @@ _ERROR_ADD_TICKER = """TickerHandler: Tried to add an invalid ticker: -{storekey} +{store_key} Ticker was not added.""" +_ERROR_ADD_TICKER_SUB_SECOND = """You are trying to add a ticker running faster +than once per second. This is not supported and also probably not useful: +Spamming messages to the user faster than once per second serves no purpose in +a text-game, and if you want to update some property, consider doing so +on-demand rather than using a ticker. +"""
    [docs]class Ticker(object): """ @@ -400,7 +407,8 @@ obj (Object, tuple or None): Subscribing object if any. If a tuple, this is a packed_obj tuple from dbserialize. path (str or None): Python-path to callable, if any. - interval (int): Ticker interval. + interval (int): Ticker interval. Floats will be converted to + nearest lower integer value. callfunc (callable or str): This is either the callable function or the name of the method to call. Note that the callable is never stored in the key; that is uniquely identified with the python-path. @@ -419,6 +427,9 @@ `idstring` and `persistent` are integers, strings and bools respectively. """ + if interval < 1: + raise RuntimeError(_ERROR_ADD_TICKER_SUB_SECOND) + interval = int(interval) persistent = bool(persistent) packed_obj = pack_dbobj(obj) @@ -717,6 +728,7 @@ +
    develop branch
    @@ -109,6 +110,7 @@ +
    develop branch
    @@ -336,6 +337,7 @@ +
    develop branch
    @@ -605,6 +606,7 @@ +
    develop branch
    @@ -208,6 +209,7 @@ +
    develop branch
    @@ -2378,6 +2379,7 @@ +
    develop branch
    @@ -263,6 +264,7 @@ +
    develop branch
    @@ -142,6 +143,7 @@ +
    develop branch
    @@ -323,6 +324,7 @@ +
    develop branch
    @@ -562,9 +563,8 @@ session=session, ) else: - # kwargs provided: persist them to the account object - for key, value in kwargs.items(): - clientoptions[key] = value
    + # kwargs provided: persist them to the account object. + clientoptions.update(kwargs)
    # OOB protocol-specific aliases and wrappers @@ -702,6 +702,7 @@ +
    develop branch
    @@ -137,6 +138,7 @@ +
    develop branch
    @@ -219,6 +220,7 @@ +
    develop branch
    @@ -87,6 +88,14 @@ AMP_MAXLEN = amp.MAX_VALUE_LENGTH # max allowed data length in AMP protocol (cannot be changed) +# amp internal +ASK = b'_ask' +ANSWER = b'_answer' +ERROR = b'_error' +ERROR_CODE = b'_error_code' +ERROR_DESCRIPTION = b'_error_description' +UNKNOWN_ERROR_CODE = b'UNKNOWN' + # buffers _SENDBATCH = defaultdict(list) _MSGBUFFER = defaultdict(list) @@ -342,6 +351,47 @@ # later twisted amp has its own __init__ super(AMPMultiConnectionProtocol, self).__init__(*args, **kwargs)
    + def _commandReceived(self, box): + """ + This overrides the default Twisted AMP error handling which is not + passing enough of the traceback through to the other side. Instead we + add a specific log of the problem on the erroring side. + + """ + def formatAnswer(answerBox): + answerBox[ANSWER] = box[ASK] + return answerBox + + def formatError(error): + if error.check(amp.RemoteAmpError): + code = error.value.errorCode + desc = error.value.description + + # Evennia extra logging + desc += " (error logged on other side)" + _get_logger().log_err(f"AMP caught exception ({desc}):\n{error.value}") + + if isinstance(desc, str): + desc = desc.encode("utf-8", "replace") + if error.value.fatal: + errorBox = amp.QuitBox() + else: + errorBox = amp.AmpBox() + else: + errorBox = amp.QuitBox() + _get_logger().log_err(error) # server-side logging if unhandled error + code = UNKNOWN_ERROR_CODE + desc = b"Unknown Error" + errorBox[ERROR] = box[ASK] + errorBox[ERROR_DESCRIPTION] = desc + errorBox[ERROR_CODE] = code + return errorBox + deferred = self.dispatchCommand(box) + if ASK in box: + deferred.addCallbacks(formatAnswer, formatError) + deferred.addCallback(self._safeEmit) + deferred.addErrback(self.unhandledError) +
    [docs] def dataReceived(self, data): """ Handle non-AMP messages, such as HTTP communication. @@ -426,7 +476,7 @@ """ e.trap(Exception) _get_logger().log_err( - "AMP Error for {info}: {trcbck} {err}".format( + "AMP Error from {info}: {trcbck} {err}".format( info=info, trcbck=e.getTraceback(), err=e.getErrorMessage() ) )
    @@ -575,6 +625,7 @@ +
    develop branch
    @@ -566,6 +567,7 @@ +
    develop branch
    @@ -443,6 +444,7 @@ +
    develop branch
    @@ -562,6 +563,7 @@ +
    develop branch
    @@ -174,6 +175,7 @@ +
    develop branch
    @@ -219,6 +220,7 @@ +
    develop branch
    @@ -168,6 +169,7 @@ +
    develop branch
    @@ -168,6 +169,7 @@ +
    develop branch
    @@ -521,6 +522,7 @@ +
    develop branch
    @@ -566,6 +567,7 @@ +
    develop branch
    @@ -247,6 +248,7 @@ +
    develop branch
    @@ -611,6 +612,7 @@ +
    develop branch
    @@ -201,6 +202,7 @@ +
    develop branch
    @@ -150,6 +151,7 @@ +
    develop branch
    @@ -128,7 +129,6 @@ super().dataReceived(data) except ValueError as err: from evennia.utils import logger - logger.log_err(f"Malformed telnet input: {err}")
    [docs] def connectionMade(self): @@ -576,6 +576,7 @@ +
    develop branch
    @@ -524,6 +525,7 @@ +
    develop branch
    @@ -239,6 +240,7 @@ +
    develop branch
    @@ -404,6 +405,7 @@ +
    develop branch
    @@ -270,6 +271,7 @@ +
    develop branch
    @@ -158,6 +159,10 @@ self.sessid = old_session.sessid self.sessionhandler.disconnect(old_session) + self.protocol_flags["CLIENTNAME"] = "Evennia Webclient (websocket)" + self.protocol_flags["UTF-8"] = True + self.protocol_flags["OOB"] = True + # watch for dead links self.transport.setTcpKeepAlive(1) # actually do the connection @@ -387,6 +392,7 @@ +
    develop branch
    @@ -551,6 +552,7 @@ +
    develop branch
    @@ -518,6 +519,7 @@ +
    develop branch
    @@ -376,6 +377,7 @@ +
    develop branch
    @@ -200,6 +201,7 @@ +
    develop branch
    @@ -127,6 +128,7 @@ +
    develop branch
    @@ -246,6 +247,7 @@ +
    develop branch
    @@ -124,6 +125,7 @@ +
    develop branch
    @@ -815,6 +816,7 @@ +
    develop branch
    @@ -509,6 +510,7 @@ +
    develop branch
    @@ -258,6 +259,7 @@ +
    develop branch
    @@ -932,6 +933,7 @@ +
    develop branch
    @@ -39,7 +40,8 @@

    Source code for evennia.server.throttle

    -from collections import defaultdict, deque
    +from django.core.cache import caches
    +from collections import deque
     from evennia.utils import logger
     import time
     
    @@ -53,8 +55,8 @@
     
         This version of the throttle is usable by both the terminal server as well
         as the web server, imposes limits on memory consumption by using deques
    -    with length limits instead of open-ended lists, and removes sparse keys when
    -    no recent failures have been recorded.
    +    with length limits instead of open-ended lists, and uses native Django 
    +    caches for automatic key eviction and persistence configurability.
         """
     
         error_msg = "Too many failed attempts; you must wait a few minutes before trying again."
    @@ -64,6 +66,7 @@
             Allows setting of throttle parameters.
     
             Keyword Args:
    +            name (str): Name of this throttle.
                 limit (int): Max number of failures before imposing limiter
                 timeout (int): number of timeout seconds after
                     max number of tries has been reached.
    @@ -71,9 +74,37 @@
                     rolling window; this is NOT the same as the limit after which
                     the throttle is imposed!
             """
    -        self.storage = defaultdict(deque)
    -        self.cache_size = self.limit = kwargs.get("limit", 5)
    +        try:
    +            self.storage = caches['throttle']
    +        except Exception as e:
    +            logger.log_trace("Throttle: Errors encountered; using default cache.")
    +            self.storage = caches['default']
    +            
    +        self.name = kwargs.get('name', 'undefined-throttle')
    +        self.limit = kwargs.get("limit", 5)
    +        self.cache_size = kwargs.get('cache_size', self.limit)
             self.timeout = kwargs.get("timeout", 5 * 60)
    + +
    [docs] def get_cache_key(self, *args, **kwargs): + """ + Creates a 'prefixed' key containing arbitrary terms to prevent key + collisions in the same namespace. + + """ + return '-'.join((self.name, *args))
    + +
    [docs] def touch(self, key, *args, **kwargs): + """ + Refreshes the timeout on a given key and ensures it is recorded in the + key register. + + Args: + key(str): Key of entry to renew. + + """ + cache_key = self.get_cache_key(key) + if self.storage.touch(cache_key, self.timeout): + self.record_key(key)
    [docs] def get(self, ip=None): """ @@ -91,9 +122,18 @@ """ if ip: - return self.storage.get(ip, deque(maxlen=self.cache_size)) + cache_key = self.get_cache_key(str(ip)) + return self.storage.get(cache_key, deque(maxlen=self.cache_size)) else: - return self.storage
    + keys_key = self.get_cache_key('keys') + keys = self.storage.get_or_set(keys_key, set(), self.timeout) + data = self.storage.get_many((self.get_cache_key(x) for x in keys)) + + found_keys = set(data.keys()) + if len(keys) != len(found_keys): + self.storage.set(keys_key, found_keys, self.timeout) + + return data
    [docs] def update(self, ip, failmsg="Exceeded threshold."): """ @@ -108,24 +148,77 @@ None """ + cache_key = self.get_cache_key(ip) + # Get current status previously_throttled = self.check(ip) - # Enforce length limits - if not self.storage[ip].maxlen: - self.storage[ip] = deque(maxlen=self.cache_size) - - self.storage[ip].append(time.time()) + # Get previous failures, if any + entries = self.storage.get(cache_key, []) + entries.append(time.time()) + + # Store updated record + self.storage.set(cache_key, deque(entries, maxlen=self.cache_size), self.timeout) # See if this update caused a change in status currently_throttled = self.check(ip) # If this makes it engage, log a single activation event if not previously_throttled and currently_throttled: - logger.log_sec( - "Throttle Activated: %s (IP: %s, %i hits in %i seconds.)" - % (failmsg, ip, self.limit, self.timeout) - )
    + logger.log_sec(f"Throttle Activated: {failmsg} (IP: {ip}, {self.limit} hits in {self.timeout} seconds.)") + + self.record_ip(ip)
    + +
    [docs] def remove(self, ip, *args, **kwargs): + """ + Clears data stored for an IP from the throttle. + + Args: + ip(str): IP to clear. + + """ + exists = self.get(ip) + if not exists: return False + + cache_key = self.get_cache_key(ip) + self.storage.delete(cache_key) + self.unrecord_ip(ip) + + # Return True if NOT exists + return ~bool(self.get(ip))
    + +
    [docs] def record_ip(self, ip, *args, **kwargs): + """ + Tracks keys as they are added to the cache (since there is no way to + get a list of keys after-the-fact). + + Args: + ip(str): IP being added to cache. This should be the original + IP, not the cache-prefixed key. + + """ + keys_key = self.get_cache_key('keys') + keys = self.storage.get(keys_key, set()) + keys.add(ip) + self.storage.set(keys_key, keys, self.timeout) + return True
    + +
    [docs] def unrecord_ip(self, ip, *args, **kwargs): + """ + Forces removal of a key from the key registry. + + Args: + ip(str): IP to remove from list of keys. + + """ + keys_key = self.get_cache_key('keys') + keys = self.storage.get(keys_key, set()) + try: + keys.remove(ip) + self.storage.set(keys_key, keys, self.timeout) + return True + except KeyError: + return False
    [docs] def check(self, ip): """ @@ -143,17 +236,20 @@ """ now = time.time() ip = str(ip) + + cache_key = self.get_cache_key(ip) # checking mode - latest_fails = self.storage[ip] + latest_fails = self.storage.get(cache_key) if latest_fails and len(latest_fails) >= self.limit: # too many fails recently if now - latest_fails[-1] < self.timeout: # too soon - timeout in play + self.touch(cache_key) return True else: # timeout has passed. clear faillist - del self.storage[ip] + self.remove(ip) return False else: return False
    @@ -202,6 +298,7 @@ +
    develop branch
    @@ -174,6 +175,7 @@ +
    develop branch
    @@ -384,6 +385,7 @@ +
    develop branch
    @@ -428,6 +429,7 @@ +
    develop branch
    @@ -479,7 +480,7 @@ """ key = key.strip().lower() if key else None - category = category.strip().lower() if category else None + category = category.strip().lower() if category is not None else None if key: return self._get_cache_key(key, category) return self._get_cache_category(category) @@ -1587,6 +1588,7 @@ +
    develop branch
    @@ -932,6 +933,7 @@ +
    develop branch
    @@ -1130,6 +1131,7 @@ +
    develop branch
    @@ -614,6 +615,7 @@ +
    develop branch
    @@ -42,19 +43,64 @@ """ ANSI - Gives colour to text. -Use the codes defined in ANSIPARSER in your text -to apply colour to text according to the ANSI standard. +Use the codes defined in the *ANSIParser* class to apply colour to text. The +`parse_ansi` function in this module parses text for markup and `strip_ansi` +removes it. -Examples: +You should usually not need to call `parse_ansi` explicitly; it is run by +Evennia just before returning data to/from the user. Alternative markup is +possible by overriding the parser class (see also contrib/ for deprecated +markup schemes). + + +Supported standards: + +- ANSI 8 bright and 8 dark fg (foreground) colors +- ANSI 8 dark bg (background) colors +- 'ANSI' 8 bright bg colors 'faked' with xterm256 (bright bg not included in ANSI standard) +- Xterm256 - 255 fg/bg colors + 26 greyscale fg/bg colors + +## Markup + +ANSI colors: `r` ed, `g` reen, `y` ellow, `b` lue, `m` agenta, `c` yan, `n` ormal (no color). Capital +letters indicate the 'dark' variant. + +- `|r` fg bright red +- `|R` fg dark red +- `|[r` bg bright red +- `|[R` bg dark red +- `|[R|g` bg dark red, fg bright green ```python "This is |rRed text|n and this is normal again." + ``` -Mostly you should not need to call `parse_ansi()` explicitly; -it is run by Evennia just before returning data to/from the -user. Depreciated example forms are available by extending -the ansi mapping. +Xterm256 colors are given as RGB (Red-Green-Blue), with values 0-5: + +- `|500` fg bright red +- `|050` fg bright green +- `|005` fg bright blue +- `|110` fg dark brown +- `|425` fg pink +- `|[431` bg orange + +Xterm256 greyscale: + +- `|=a` fg black +- `|=g` fg dark grey +- `|=o` fg middle grey +- `|=v` fg bright grey +- `|=z` fg white +- `|[=r` bg middle grey + +```python +"This is |500Red text|n and this is normal again." +"This is |[=jText on dark grey background" + +``` + +---- """ import functools @@ -126,8 +172,7 @@ to ANSI command sequences We also allow to escape colour codes - by prepending with a \ for xterm256, - an extra | for Merc-style codes + by prepending with an extra `|`. """ @@ -138,6 +183,7 @@ (r"|n", ANSI_NORMAL), # reset (r"|/", ANSI_RETURN), # line break (r"|-", ANSI_TAB), # tab + (r"|>", ANSI_SPACE * 4), # indent (4 spaces) (r"|_", ANSI_SPACE), # space (r"|*", ANSI_INVERSE), # invert (r"|^", ANSI_BLINK), # blinking text (very annoying and not supported by all clients) @@ -567,6 +613,13 @@ return string.replace("{", "{{").replace("|", "||")
    +# ------------------------------------------------------------ +# +# ANSIString - ANSI-aware string class +# +# ------------------------------------------------------------ + + def _spacing_preflight(func): """ This wrapper function is used to do some preflight checks on @@ -937,9 +990,23 @@ replayed. """ - slice_indexes = self._char_indexes[slc] + char_indexes = self._char_indexes + slice_indexes = char_indexes[slc] # If it's the end of the string, we need to append final color codes. if not slice_indexes: + # if we find no characters it may be because we are just outside + # of the interval, using an open-ended slice. We must replay all + # of the escape characters until/after this point. + if char_indexes: + if slc.start is None and slc.stop is None: + # a [:] slice of only escape characters + return ANSIString(self._raw_string[slc]) + if slc.start is None: + # this is a [:x] slice + return ANSIString(self._raw_string[:char_indexes[0]]) + if slc.stop is None: + # a [x:] slice + return ANSIString(self._raw_string[char_indexes[-1] + 1:]) return ANSIString("") try: string = self[slc.start or 0]._raw_string @@ -959,7 +1026,7 @@ # raw_string not long enough pass if i is not None: - append_tail = self._get_interleving(self._char_indexes.index(i) + 1) + append_tail = self._get_interleving(char_indexes.index(i) + 1) else: append_tail = "" return ANSIString(string + append_tail, decoded=True) @@ -1484,6 +1551,7 @@ +
    develop branch
    @@ -523,6 +524,7 @@ +
    develop branch
    @@ -326,6 +327,7 @@ +
    develop branch
    @@ -668,6 +669,7 @@ +
    develop branch
    @@ -341,6 +342,10 @@ def has_key(self, key): return key in self._data + @_save + def update(self, *args, **kwargs): + self._data.update(*args, **kwargs) + class _SaverSet(_SaverMutable, MutableSet): """ @@ -836,6 +841,7 @@ +
    develop branch
    @@ -1198,6 +1199,7 @@ +
    develop branch
    @@ -206,9 +207,12 @@ def _to_ansi(obj, regexable=False): "convert to ANSIString" - if isinstance(obj, str): + if isinstance(obj, ANSIString): + return obj + elif isinstance(obj, str): # since ansi will be parsed twice (here and in the normal ansi send), we have to - # escape the |-structure twice. + # escape the |-structure twice. TODO: This is tied to the default color-tag syntax + # which is not ideal for those wanting to replace/extend it ... obj = _ANSI_ESCAPE.sub(r"||||", obj) if isinstance(obj, dict): return dict((key, _to_ansi(value, regexable=regexable)) for key, value in obj.items()) @@ -218,7 +222,7 @@ return ANSIString(obj, regexable=regexable) -
    [docs]class EvForm(object): +
    [docs]class EvForm: """ This object is instantiated with a text file and parses it for rectangular form fields. It can then be fed a @@ -504,43 +508,6 @@ def __str__(self): "Prints the form" return str(ANSIString("\n").join([line for line in self.form]))
    - - -def _test(): - "test evform. This is used by the unittest system." - form = EvForm("evennia.utils.tests.data.evform_example") - - # add data to each tagged form cell - form.map( - cells={ - "AA": "|gTom the Bouncer", - 2: "|yGriatch", - 3: "A sturdy fellow", - 4: 12, - 5: 10, - 6: 5, - 7: 18, - 8: 10, - 9: 3, - "F": "rev 1", - } - ) - # create the EvTables - tableA = EvTable("HP", "MV", "MP", table=[["**"], ["*****"], ["***"]], border="incols") - tableB = EvTable( - "Skill", - "Value", - "Exp", - table=[ - ["Shooting", "Herbalism", "Smithing"], - [12, 14, 9], - ["550/1200", "990/1400", "205/900"], - ], - border="incols", - ) - # add the tables to the proper ids in the form - form.map(tables={"A": tableA, "B": tableB}) - return str(form)
    @@ -586,6 +553,7 @@ +
    develop branch
    @@ -1994,6 +1995,7 @@ +
    develop branch
    @@ -635,6 +636,7 @@ +
    develop branch
    @@ -1844,6 +1845,7 @@ +
    develop branch
    @@ -352,6 +353,7 @@ +
    develop branch
    @@ -117,6 +118,7 @@ +
    develop branch
    @@ -757,6 +758,7 @@ +
    develop branch
    @@ -162,6 +163,7 @@ +
    develop branch
    @@ -709,6 +710,7 @@ +
    develop branch
    @@ -408,7 +409,7 @@ logfile.LogFile.rotate(self) return lines = tail_log_file(self.path, 0, self.num_lines_to_append) - logfile.LogFile.rotate(self) + super().rotate() for line in lines: self.write(line)
    @@ -618,6 +619,7 @@ +
    develop branch
    @@ -407,6 +408,7 @@ +
    develop branch
    @@ -264,6 +265,7 @@ +
    develop branch
    @@ -386,6 +387,7 @@ +
    develop branch
    @@ -438,6 +439,7 @@ +
    develop branch
    @@ -259,6 +260,7 @@ +
    develop branch
    @@ -138,7 +139,7 @@ re_blink = re.compile("(?:%s)(.*?)(?=%s|%s)" % (blink.replace("[", r"\["), fgstop, bgstop)) re_inverse = re.compile("(?:%s)(.*?)(?=%s|%s)" % (inverse.replace("[", r"\["), fgstop, bgstop)) re_string = re.compile( - r"(?P<htmlchars>[<&>])|(?P<firstspace>(?<=\S) )|(?P<space> [ \t]+)|" + r"(?P<htmlchars>[<&>])|(?P<tab>[\t]+)|(?P<space> +)|" r"(?P<spacestart>^ )|(?P<lineend>\r\n|\r|\n)", re.S | re.M | re.I, ) @@ -348,13 +349,12 @@ return html_escape(cdict["htmlchars"]) elif cdict["lineend"]: return "<br>" - elif cdict["firstspace"]: - return " &nbsp;" - elif cdict["space"] == "\t": - return " " if self.tabstop == 1 else " " + "&nbsp;" * self.tabstop + elif cdict["tab"]: + text = cdict["tab"].replace("\t", " " + "&nbsp;" * (self.tabstop - 1)) + return text elif cdict["space"] or cdict["spacestart"]: - text = match.group().replace("\t", "&nbsp;" * self.tabstop) - text = text.replace(" ", "&nbsp;") + text = cdict["space"] + text = " " if len(text) == 1 else " " + text[1:].replace(" ", "&nbsp;") return text return None
    @@ -453,6 +453,7 @@ +
    develop branch
    @@ -2390,6 +2391,7 @@ +
    develop branch
    @@ -318,6 +319,7 @@ +
    develop branch
    @@ -127,6 +128,7 @@ +
    develop branch
    @@ -182,6 +183,7 @@ +
    develop branch
    @@ -156,6 +157,7 @@ +
    develop branch
    @@ -155,6 +156,7 @@ +
    develop branch
    @@ -114,6 +115,7 @@ +
    develop branch
    @@ -256,6 +257,7 @@ +
    develop branch
    @@ -101,6 +102,7 @@ +
    develop branch
    @@ -373,6 +374,7 @@ +
    develop branch
    @@ -1205,6 +1206,7 @@ +
    develop branch
    @@ -931,6 +932,7 @@ +
    develop branch
    @@ -275,6 +276,7 @@ +
    develop branch
    @@ -186,6 +187,7 @@ +
    develop branch
    @@ -144,6 +145,7 @@ +
    develop branch
    @@ -116,6 +117,7 @@ +
    develop branch
    @@ -244,6 +245,7 @@ +
    develop branch
    @@ -1078,6 +1079,7 @@ overriding the call (unused by default).

    +
    develop branch
    @@ -389,6 +390,7 @@ has a slightly different workflow.

    +
    develop branch
    @@ -499,6 +500,7 @@ triggered by the bot_data_in Inputfunc.

    +
    develop branch
    @@ -101,6 +102,7 @@ more Objects depending on settings. An Account has no in-game existence.

    +
    develop branch
    @@ -96,6 +97,7 @@ +
    develop branch
    @@ -417,6 +418,7 @@ class built by **create_forward_many_to_many_manager()** define +
    develop branch
    @@ -188,6 +189,7 @@ default Evennia.

    +
    develop branch
    @@ -211,6 +212,7 @@ the remaining arguments, and the matched cmdobject from the cmdset.

    +
    develop branch
    @@ -428,6 +429,7 @@ self.add().

    +
    develop branch
    @@ -396,6 +397,7 @@ handled automatically by @reload).

    +
    develop branch
    @@ -491,6 +492,7 @@ detailing the contents of the table.

    +
    develop branch
    @@ -69,7 +70,7 @@ method. Otherwise all text will be returned to all connected sessions.

    -aliases = ['l', 'ls']
    +aliases = ['ls', 'l']
    @@ -100,7 +101,7 @@ method. Otherwise all text will be returned to all connected sessions.

    -search_index_entry = {'aliases': 'l ls', 'category': 'general', 'key': 'look', 'tags': '', 'text': '\n look while out-of-character\n\n Usage:\n look\n\n Look in the ooc state.\n '}
    +search_index_entry = {'aliases': 'ls l', 'category': 'general', 'key': 'look', 'tags': '', 'text': '\n look while out-of-character\n\n Usage:\n look\n\n Look in the ooc state.\n '}
    @@ -864,6 +865,7 @@ to all the variables defined therein.

    +
    develop branch
    @@ -549,6 +550,7 @@ including all currently unlogged in.

    +
    develop branch
    @@ -74,7 +75,7 @@ skipping, reloading etc.

    -aliases = ['batchcommand', 'batchcmd']
    +aliases = ['batchcmd', 'batchcommand']
    @@ -105,7 +106,7 @@ skipping, reloading etc.

    -search_index_entry = {'aliases': 'batchcommand batchcmd', 'category': 'building', 'key': 'batchcommands', 'tags': '', 'text': '\n build from batch-command file\n\n Usage:\n batchcommands[/interactive] <python.path.to.file>\n\n Switch:\n interactive - this mode will offer more control when\n executing the batch file, like stepping,\n skipping, reloading etc.\n\n Runs batches of commands from a batch-cmd text file (*.ev).\n\n '}
    +search_index_entry = {'aliases': 'batchcmd batchcommand', 'category': 'building', 'key': 'batchcommands', 'tags': '', 'text': '\n build from batch-command file\n\n Usage:\n batchcommands[/interactive] <python.path.to.file>\n\n Switch:\n interactive - this mode will offer more control when\n executing the batch file, like stepping,\n skipping, reloading etc.\n\n Runs batches of commands from a batch-cmd text file (*.ev).\n\n '}
    @@ -224,6 +225,7 @@ object copies behind when testing out the script.

    +
    develop branch
    @@ -528,7 +529,7 @@ You can specify the /force switch to bypass this confirmation.

    -aliases = ['del', 'delete']
    +aliases = ['delete', 'del']
    @@ -569,7 +570,7 @@ You can specify the /force switch to bypass this confirmation.

    -search_index_entry = {'aliases': 'del delete', 'category': 'building', 'key': 'destroy', 'tags': '', 'text': '\n permanently delete objects\n\n Usage:\n destroy[/switches] [obj, obj2, obj3, [dbref-dbref], ...]\n\n Switches:\n override - The destroy command will usually avoid accidentally\n destroying account objects. This switch overrides this safety.\n force - destroy without confirmation.\n Examples:\n destroy house, roof, door, 44-78\n destroy 5-10, flower, 45\n destroy/force north\n\n Destroys one or many objects. If dbrefs are used, a range to delete can be\n given, e.g. 4-10. Also the end points will be deleted. This command\n displays a confirmation before destroying, to make sure of your choice.\n You can specify the /force switch to bypass this confirmation.\n '}
    +search_index_entry = {'aliases': 'delete del', 'category': 'building', 'key': 'destroy', 'tags': '', 'text': '\n permanently delete objects\n\n Usage:\n destroy[/switches] [obj, obj2, obj3, [dbref-dbref], ...]\n\n Switches:\n override - The destroy command will usually avoid accidentally\n destroying account objects. This switch overrides this safety.\n force - destroy without confirmation.\n Examples:\n destroy house, roof, door, 44-78\n destroy 5-10, flower, 45\n destroy/force north\n\n Destroys one or many objects. If dbrefs are used, a range to delete can be\n given, e.g. 4-10. Also the end points will be deleted. This command\n displays a confirmation before destroying, to make sure of your choice.\n You can specify the /force switch to bypass this confirmation.\n '}
    @@ -1267,7 +1268,7 @@ server settings.

    -aliases = ['swap', 'parent', 'update', 'type']
    +aliases = ['type', 'parent', 'update', 'swap']
    @@ -1298,7 +1299,7 @@ server settings.

    -search_index_entry = {'aliases': 'swap parent update type', 'category': 'building', 'key': 'typeclass', 'tags': '', 'text': "\n set or change an object's typeclass\n\n Usage:\n typeclass[/switch] <object> [= typeclass.path]\n typeclass/prototype <object> = prototype_key\n\n typeclass/list/show [typeclass.path]\n swap - this is a shorthand for using /force/reset flags.\n update - this is a shorthand for using the /force/reload flag.\n\n Switch:\n show, examine - display the current typeclass of object (default) or, if\n given a typeclass path, show the docstring of that typeclass.\n update - *only* re-run at_object_creation on this object\n meaning locks or other properties set later may remain.\n reset - clean out *all* the attributes and properties on the\n object - basically making this a new clean object.\n force - change to the typeclass also if the object\n already has a typeclass of the same name.\n list - show available typeclasses. Only typeclasses in modules actually\n imported or used from somewhere in the code will show up here\n (those typeclasses are still available if you know the path)\n prototype - clean and overwrite the object with the specified\n prototype key - effectively making a whole new object.\n\n Example:\n type button = examples.red_button.RedButton\n type/prototype button=a red button\n\n If the typeclass_path is not given, the current object's typeclass is\n assumed.\n\n View or set an object's typeclass. If setting, the creation hooks of the\n new typeclass will be run on the object. If you have clashing properties on\n the old class, use /reset. By default you are protected from changing to a\n typeclass of the same name as the one you already have - use /force to\n override this protection.\n\n The given typeclass must be identified by its location using python\n dot-notation pointing to the correct module and class. If no typeclass is\n given (or a wrong typeclass is given). Errors in the path or new typeclass\n will lead to the old typeclass being kept. The location of the typeclass\n module is searched from the default typeclass directory, as defined in the\n server settings.\n\n "}
    +search_index_entry = {'aliases': 'type parent update swap', 'category': 'building', 'key': 'typeclass', 'tags': '', 'text': "\n set or change an object's typeclass\n\n Usage:\n typeclass[/switch] <object> [= typeclass.path]\n typeclass/prototype <object> = prototype_key\n\n typeclass/list/show [typeclass.path]\n swap - this is a shorthand for using /force/reset flags.\n update - this is a shorthand for using the /force/reload flag.\n\n Switch:\n show, examine - display the current typeclass of object (default) or, if\n given a typeclass path, show the docstring of that typeclass.\n update - *only* re-run at_object_creation on this object\n meaning locks or other properties set later may remain.\n reset - clean out *all* the attributes and properties on the\n object - basically making this a new clean object.\n force - change to the typeclass also if the object\n already has a typeclass of the same name.\n list - show available typeclasses. Only typeclasses in modules actually\n imported or used from somewhere in the code will show up here\n (those typeclasses are still available if you know the path)\n prototype - clean and overwrite the object with the specified\n prototype key - effectively making a whole new object.\n\n Example:\n type button = examples.red_button.RedButton\n type/prototype button=a red button\n\n If the typeclass_path is not given, the current object's typeclass is\n assumed.\n\n View or set an object's typeclass. If setting, the creation hooks of the\n new typeclass will be run on the object. If you have clashing properties on\n the old class, use /reset. By default you are protected from changing to a\n typeclass of the same name as the one you already have - use /force to\n override this protection.\n\n The given typeclass must be identified by its location using python\n dot-notation pointing to the correct module and class. If no typeclass is\n given (or a wrong typeclass is given). Errors in the path or new typeclass\n will lead to the old typeclass being kept. The location of the typeclass\n module is searched from the default typeclass directory, as defined in the\n server settings.\n\n "}
    @@ -1451,7 +1452,7 @@ If object is not specified, the current location is examined.

    -aliases = ['exam', 'ex']
    +aliases = ['ex', 'exam']
    @@ -1548,7 +1549,7 @@ non-persistent data stored on object

    -search_index_entry = {'aliases': 'exam ex', 'category': 'building', 'key': 'examine', 'tags': '', 'text': '\n get detailed information about an object\n\n Usage:\n examine [<object>[/attrname]]\n examine [*<account>[/attrname]]\n\n Switch:\n account - examine an Account (same as adding *)\n object - examine an Object (useful when OOC)\n\n The examine command shows detailed game info about an\n object and optionally a specific attribute on it.\n If object is not specified, the current location is examined.\n\n Append a * before the search string to examine an account.\n\n '}
    +search_index_entry = {'aliases': 'ex exam', 'category': 'building', 'key': 'examine', 'tags': '', 'text': '\n get detailed information about an object\n\n Usage:\n examine [<object>[/attrname]]\n examine [*<account>[/attrname]]\n\n Switch:\n account - examine an Account (same as adding *)\n object - examine an Object (useful when OOC)\n\n The examine command shows detailed game info about an\n object and optionally a specific attribute on it.\n If object is not specified, the current location is examined.\n\n Append a * before the search string to examine an account.\n\n '}
    @@ -1991,6 +1992,7 @@ displays a list of available prototypes.

    +
    develop branch
    @@ -123,6 +124,7 @@ command method rather than caller.msg().

    +
    develop branch
    @@ -121,6 +122,7 @@ Account cmdset. Account commands remain available also to Characters.

    +
    develop branch
    @@ -118,6 +119,7 @@ +
    develop branch
    @@ -120,6 +121,7 @@ of the state instance in this module.

    +
    develop branch
    @@ -233,7 +234,7 @@ Use addcom/delcom to join and leave channels

    -aliases = ['comlist', 'chanlist', 'channellist', 'clist', 'all channels']
    +aliases = ['all channels', 'comlist', 'chanlist', 'channellist', 'clist']
    @@ -264,7 +265,7 @@ Use addcom/delcom to join and leave channels

    -search_index_entry = {'aliases': 'comlist chanlist channellist clist all channels', 'category': 'comms', 'key': 'channels', 'tags': '', 'text': "\n list all channels available to you\n\n Usage:\n channels\n clist\n comlist\n\n Lists all channels available to you, whether you listen to them or not.\n Use 'comlist' to only view your current channel subscriptions.\n Use addcom/delcom to join and leave channels\n "}
    +search_index_entry = {'aliases': 'all channels comlist chanlist channellist clist', 'category': 'comms', 'key': 'channels', 'tags': '', 'text': "\n list all channels available to you\n\n Usage:\n channels\n clist\n comlist\n\n Lists all channels available to you, whether you listen to them or not.\n Use 'comlist' to only view your current channel subscriptions.\n Use addcom/delcom to join and leave channels\n "}
    @@ -1067,6 +1068,7 @@ must be added to game settings.

    +
    develop branch
    @@ -111,7 +112,7 @@ look *<account&g
    -aliases = ['l', 'ls']
    +aliases = ['ls', 'l']
    @@ -142,7 +143,7 @@ look *<account&g
    -search_index_entry = {'aliases': 'l ls', 'category': 'general', 'key': 'look', 'tags': '', 'text': '\n look at location or object\n\n Usage:\n look\n look <obj>\n look *<account>\n\n Observes your location or objects in your vicinity.\n '}
    +search_index_entry = {'aliases': 'ls l', 'category': 'general', 'key': 'look', 'tags': '', 'text': '\n look at location or object\n\n Usage:\n look\n look <obj>\n look *<account>\n\n Observes your location or objects in your vicinity.\n '}
    @@ -204,7 +205,7 @@ for everyone to use, you need build privileges and the alias command.

    -aliases = ['nickname', 'nicks']
    +aliases = ['nicks', 'nickname']
    @@ -236,7 +237,7 @@ for everyone to use, you need build privileges and the alias command.

    -search_index_entry = {'aliases': 'nickname nicks', 'category': 'general', 'key': 'nick', 'tags': '', 'text': '\n define a personal alias/nick by defining a string to\n match and replace it with another on the fly\n\n Usage:\n nick[/switches] <string> [= [replacement_string]]\n nick[/switches] <template> = <replacement_template>\n nick/delete <string> or number\n nicks\n\n Switches:\n inputline - replace on the inputline (default)\n object - replace on object-lookup\n account - replace on account-lookup\n list - show all defined aliases (also "nicks" works)\n delete - remove nick by index in /list\n clearall - clear all nicks\n\n Examples:\n nick hi = say Hello, I\'m Sarah!\n nick/object tom = the tall man\n nick build $1 $2 = create/drop $1;$2\n nick tell $1 $2=page $1=$2\n nick tm?$1=page tallman=$1\n nick tm\\=$1=page tallman=$1\n\n A \'nick\' is a personal string replacement. Use $1, $2, ... to catch arguments.\n Put the last $-marker without an ending space to catch all remaining text. You\n can also use unix-glob matching for the left-hand side <string>:\n\n * - matches everything\n ? - matches 0 or 1 single characters\n [abcd] - matches these chars in any order\n [!abcd] - matches everything not among these chars\n \\= - escape literal \'=\' you want in your <string>\n\n Note that no objects are actually renamed or changed by this command - your nicks\n are only available to you. If you want to permanently add keywords to an object\n for everyone to use, you need build privileges and the alias command.\n\n '}
    +search_index_entry = {'aliases': 'nicks nickname', 'category': 'general', 'key': 'nick', 'tags': '', 'text': '\n define a personal alias/nick by defining a string to\n match and replace it with another on the fly\n\n Usage:\n nick[/switches] <string> [= [replacement_string]]\n nick[/switches] <template> = <replacement_template>\n nick/delete <string> or number\n nicks\n\n Switches:\n inputline - replace on the inputline (default)\n object - replace on object-lookup\n account - replace on account-lookup\n list - show all defined aliases (also "nicks" works)\n delete - remove nick by index in /list\n clearall - clear all nicks\n\n Examples:\n nick hi = say Hello, I\'m Sarah!\n nick/object tom = the tall man\n nick build $1 $2 = create/drop $1;$2\n nick tell $1 $2=page $1=$2\n nick tm?$1=page tallman=$1\n nick tm\\=$1=page tallman=$1\n\n A \'nick\' is a personal string replacement. Use $1, $2, ... to catch arguments.\n Put the last $-marker without an ending space to catch all remaining text. You\n can also use unix-glob matching for the left-hand side <string>:\n\n * - matches everything\n ? - matches 0 or 1 single characters\n [abcd] - matches these chars in any order\n [!abcd] - matches everything not among these chars\n \\= - escape literal \'=\' you want in your <string>\n\n Note that no objects are actually renamed or changed by this command - your nicks\n are only available to you. If you want to permanently add keywords to an object\n for everyone to use, you need build privileges and the alias command.\n\n '}
    @@ -259,7 +260,7 @@ inv

    -aliases = ['i', 'inv']
    +aliases = ['inv', 'i']
    @@ -290,7 +291,7 @@ inv

    -search_index_entry = {'aliases': 'i inv', 'category': 'general', 'key': 'inventory', 'tags': '', 'text': '\n view inventory\n\n Usage:\n inventory\n inv\n\n Shows your inventory.\n '}
    +search_index_entry = {'aliases': 'inv i', 'category': 'general', 'key': 'inventory', 'tags': '', 'text': '\n view inventory\n\n Usage:\n inventory\n inv\n\n Shows your inventory.\n '}
    @@ -640,7 +641,7 @@ automatically begin with your name.

    -aliases = [':', 'emote']
    +aliases = ['emote', ':']
    @@ -676,7 +677,7 @@ space.

    -search_index_entry = {'aliases': ': emote', 'category': 'general', 'key': 'pose', 'tags': '', 'text': "\n strike a pose\n\n Usage:\n pose <pose text>\n pose's <pose text>\n\n Example:\n pose is standing by the wall, smiling.\n -> others will see:\n Tom is standing by the wall, smiling.\n\n Describe an action being taken. The pose text will\n automatically begin with your name.\n "}
    +search_index_entry = {'aliases': 'emote :', 'category': 'general', 'key': 'pose', 'tags': '', 'text': "\n strike a pose\n\n Usage:\n pose <pose text>\n pose's <pose text>\n\n Example:\n pose is standing by the wall, smiling.\n -> others will see:\n Tom is standing by the wall, smiling.\n\n Describe an action being taken. The pose text will\n automatically begin with your name.\n "}
    @@ -699,7 +700,7 @@ which permission groups you are a member of.

    -aliases = ['hierarchy', 'groups']
    +aliases = ['groups', 'hierarchy']
    @@ -730,7 +731,7 @@ which permission groups you are a member of.

    -search_index_entry = {'aliases': 'hierarchy groups', 'category': 'general', 'key': 'access', 'tags': '', 'text': '\n show your current game access\n\n Usage:\n access\n\n This command shows you the permission hierarchy and\n which permission groups you are a member of.\n '}
    +search_index_entry = {'aliases': 'groups hierarchy', 'category': 'general', 'key': 'access', 'tags': '', 'text': '\n show your current game access\n\n Usage:\n access\n\n This command shows you the permission hierarchy and\n which permission groups you are a member of.\n '}
    @@ -786,6 +787,7 @@ which permission groups you are a member of.

    +
    develop branch
    @@ -324,6 +325,7 @@ is to let everyone read the help file.

    +
    develop branch
    @@ -110,6 +111,7 @@ +
    develop branch
    @@ -286,6 +287,7 @@ character is actually attached to this Account and Session.

    +
    develop branch
    @@ -361,6 +362,7 @@ the already formatted input.

    +
    develop branch
    @@ -373,7 +374,7 @@ given, <nr> defaults to 10.

    -aliases = ['listobjs', 'listobjects', 'stats', 'db']
    +aliases = ['stats', 'db', 'listobjs', 'listobjects']
    @@ -399,7 +400,7 @@ given, <nr> defaults to 10.

    -search_index_entry = {'aliases': 'listobjs listobjects stats db', 'category': 'system', 'key': 'objects', 'tags': '', 'text': '\n statistics on objects in the database\n\n Usage:\n objects [<nr>]\n\n Gives statictics on objects in database as well as\n a list of <nr> latest objects in database. If not\n given, <nr> defaults to 10.\n '}
    +search_index_entry = {'aliases': 'stats db listobjs listobjects', 'category': 'system', 'key': 'objects', 'tags': '', 'text': '\n statistics on objects in the database\n\n Usage:\n objects [<nr>]\n\n Gives statictics on objects in database as well as\n a list of <nr> latest objects in database. If not\n given, <nr> defaults to 10.\n '}
    @@ -687,6 +688,7 @@ the released memory will instead be re-used by the program.

    +
    develop branch
    @@ -712,6 +713,7 @@ set in self.parse())

    +
    develop branch
    @@ -58,7 +59,7 @@ connect “account name” “pass word”

    -aliases = ['conn', 'con', 'co']
    +aliases = ['con', 'conn', 'co']
    @@ -93,7 +94,7 @@ there is no object yet before the account has logged in)

    -search_index_entry = {'aliases': 'conn con co', 'category': 'general', 'key': 'connect', 'tags': '', 'text': '\n connect to the game\n\n Usage (at login screen):\n connect accountname password\n connect "account name" "pass word"\n\n Use the create command to first create an account before logging in.\n\n If you have spaces in your name, enclose it in double quotes.\n '}
    +search_index_entry = {'aliases': 'con conn co', 'category': 'general', 'key': 'connect', 'tags': '', 'text': '\n connect to the game\n\n Usage (at login screen):\n connect accountname password\n connect "account name" "pass word"\n\n Use the create command to first create an account before logging in.\n\n If you have spaces in your name, enclose it in double quotes.\n '}
    @@ -172,7 +173,7 @@ version is a bit more complicated.

    -aliases = ['q', 'qu']
    +aliases = ['qu', 'q']
    @@ -198,7 +199,7 @@ version is a bit more complicated.

    -search_index_entry = {'aliases': 'q qu', 'category': 'general', 'key': 'quit', 'tags': '', 'text': '\n quit when in unlogged-in state\n\n Usage:\n quit\n\n We maintain a different version of the quit command\n here for unconnected accounts for the sake of simplicity. The logged in\n version is a bit more complicated.\n '}
    +search_index_entry = {'aliases': 'qu q', 'category': 'general', 'key': 'quit', 'tags': '', 'text': '\n quit when in unlogged-in state\n\n Usage:\n quit\n\n We maintain a different version of the quit command\n here for unconnected accounts for the sake of simplicity. The logged in\n version is a bit more complicated.\n '}
    @@ -222,7 +223,7 @@ All it does is display the connect screen.

    -aliases = ['l', 'look']
    +aliases = ['look', 'l']
    @@ -248,7 +249,7 @@ All it does is display the connect screen.

    -search_index_entry = {'aliases': 'l look', 'category': 'general', 'key': '__unloggedin_look_command', 'tags': '', 'text': '\n look when in unlogged-in state\n\n Usage:\n look\n\n This is an unconnected version of the look command for simplicity.\n\n This is called by the server and kicks everything in gear.\n All it does is display the connect screen.\n '}
    +search_index_entry = {'aliases': 'look l', 'category': 'general', 'key': '__unloggedin_look_command', 'tags': '', 'text': '\n look when in unlogged-in state\n\n Usage:\n look\n\n This is an unconnected version of the look command for simplicity.\n\n This is called by the server and kicks everything in gear.\n All it does is display the connect screen.\n '}
    @@ -271,7 +272,7 @@ for simplicity. It shows a pane of info.

    -aliases = ['?', 'h']
    +aliases = ['h', '?']
    @@ -297,7 +298,7 @@ for simplicity. It shows a pane of info.

    -search_index_entry = {'aliases': '? h', 'category': 'general', 'key': 'help', 'tags': '', 'text': '\n get help when in unconnected-in state\n\n Usage:\n help\n\n This is an unconnected version of the help command,\n for simplicity. It shows a pane of info.\n '}
    +search_index_entry = {'aliases': 'h ?', 'category': 'general', 'key': 'help', 'tags': '', 'text': '\n get help when in unconnected-in state\n\n Usage:\n help\n\n This is an unconnected version of the help command,\n for simplicity. It shows a pane of info.\n '}
    @@ -353,6 +354,7 @@ for simplicity. It shows a pane of info.

    +
    develop branch
    @@ -126,6 +127,7 @@ Evennia.

    +
    develop branch
    @@ -278,6 +279,7 @@ +
    develop branch
    @@ -314,6 +315,7 @@ or more channels.

    +
    develop branch
    @@ -782,6 +783,7 @@ responsibility.

    +
    develop branch
    @@ -101,6 +102,7 @@ as code related to external communication like IRC or RSS.

    +
    develop branch
    @@ -379,6 +380,7 @@ case sensitive) match.

    +
    develop branch
    @@ -731,6 +732,7 @@ object the first time, the query is executed.

    +
    develop branch
    @@ -680,7 +681,7 @@ try to influence the other part in the deal.

    -aliases = ['deal', 'offers']
    +aliases = ['offers', 'deal']
    @@ -706,7 +707,7 @@ try to influence the other part in the deal.

    -search_index_entry = {'aliases': 'deal offers', 'category': 'trading', 'key': 'status', 'tags': '', 'text': "\n show a list of the current deal\n\n Usage:\n status\n deal\n offers\n\n Shows the currently suggested offers on each sides of the deal. To\n accept the current deal, use the 'accept' command. Use 'offer' to\n change your deal. You might also want to use 'say', 'emote' etc to\n try to influence the other part in the deal.\n "}
    +search_index_entry = {'aliases': 'offers deal', 'category': 'trading', 'key': 'status', 'tags': '', 'text': "\n show a list of the current deal\n\n Usage:\n status\n deal\n offers\n\n Shows the currently suggested offers on each sides of the deal. To\n accept the current deal, use the 'accept' command. Use 'offer' to\n change your deal. You might also want to use 'say', 'emote' etc to\n try to influence the other part in the deal.\n "}
    @@ -890,6 +891,7 @@ info to your choice.

    +
    develop branch
    @@ -928,6 +929,7 @@ set in self.parse())

    +
    develop branch
    @@ -76,7 +77,7 @@ at them with this command.

    -aliases = ['l', 'ls']
    +aliases = ['ls', 'l']
    @@ -108,7 +109,7 @@ that is checked by the @ic command directly.

    -search_index_entry = {'aliases': 'l ls', 'category': 'general', 'key': 'look', 'tags': '', 'text': '\n ooc look\n\n Usage:\n look\n look <character>\n\n This is an OOC version of the look command. Since an Account doesn\'t\n have an in-game existence, there is no concept of location or\n "self".\n\n If any characters are available for you to control, you may look\n at them with this command.\n '}
    +search_index_entry = {'aliases': 'ls l', 'category': 'general', 'key': 'look', 'tags': '', 'text': '\n ooc look\n\n Usage:\n look\n look <character>\n\n This is an OOC version of the look command. Since an Account doesn\'t\n have an in-game existence, there is no concept of location or\n "self".\n\n If any characters are available for you to control, you may look\n at them with this command.\n '}
    @@ -232,6 +233,7 @@ attribute on ourselves to remember it.

    +
    develop branch
    @@ -627,7 +628,7 @@ inv

    -aliases = ['i', 'inv']
    +aliases = ['inv', 'i']
    @@ -658,7 +659,7 @@ inv

    -search_index_entry = {'aliases': 'i inv', 'category': 'general', 'key': 'inventory', 'tags': '', 'text': '\n view inventory\n\n Usage:\n inventory\n inv\n\n Shows your inventory.\n '}
    +search_index_entry = {'aliases': 'inv i', 'category': 'general', 'key': 'inventory', 'tags': '', 'text': '\n view inventory\n\n Usage:\n inventory\n inv\n\n Shows your inventory.\n '}
    @@ -740,6 +741,7 @@ items.

    +
    develop branch
    @@ -131,6 +132,7 @@ COLOR_ANSI_BRIGHT_BGS_EXTRA_MAP = color_markups.CURLY_COLOR_ANSI_BRIGHT_BGS_EXTR +
    develop branch
    @@ -318,6 +319,7 @@ The time is given in units as keyword arguments.

    +
    develop branch
    @@ -249,6 +250,7 @@ Add with @py self.cmdset.add(“contrib.dice.DiceCmdSet”)

    +
    develop branch
    @@ -73,7 +74,7 @@ the module given by settings.CONNECTION_SCREEN_MODULE.

    -aliases = ['conn', 'con', 'co']
    +aliases = ['con', 'conn', 'co']
    @@ -103,7 +104,7 @@ there is no object yet before the account has logged in)

    -search_index_entry = {'aliases': 'conn con co', 'category': 'general', 'key': 'connect', 'tags': '', 'text': '\n Connect to the game.\n\n Usage (at login screen):\n connect <email> <password>\n\n Use the create command to first create an account before logging in.\n '}
    +search_index_entry = {'aliases': 'con conn co', 'category': 'general', 'key': 'connect', 'tags': '', 'text': '\n Connect to the game.\n\n Usage (at login screen):\n connect <email> <password>\n\n Use the create command to first create an account before logging in.\n '}
    @@ -180,7 +181,7 @@ version is a bit more complicated.

    -aliases = ['q', 'qu']
    +aliases = ['qu', 'q']
    @@ -206,7 +207,7 @@ version is a bit more complicated.

    -search_index_entry = {'aliases': 'q qu', 'category': 'general', 'key': 'quit', 'tags': '', 'text': '\n We maintain a different version of the `quit` command\n here for unconnected accounts for the sake of simplicity. The logged in\n version is a bit more complicated.\n '}
    +search_index_entry = {'aliases': 'qu q', 'category': 'general', 'key': 'quit', 'tags': '', 'text': '\n We maintain a different version of the `quit` command\n here for unconnected accounts for the sake of simplicity. The logged in\n version is a bit more complicated.\n '}
    @@ -225,7 +226,7 @@ All it does is display the connect screen.

    -aliases = ['l', 'look']
    +aliases = ['look', 'l']
    @@ -251,7 +252,7 @@ All it does is display the connect screen.

    -search_index_entry = {'aliases': 'l look', 'category': 'general', 'key': '__unloggedin_look_command', 'tags': '', 'text': '\n This is an unconnected version of the `look` command for simplicity.\n\n This is called by the server and kicks everything in gear.\n All it does is display the connect screen.\n '}
    +search_index_entry = {'aliases': 'look l', 'category': 'general', 'key': '__unloggedin_look_command', 'tags': '', 'text': '\n This is an unconnected version of the `look` command for simplicity.\n\n This is called by the server and kicks everything in gear.\n All it does is display the connect screen.\n '}
    @@ -269,7 +270,7 @@ for simplicity. It shows a pane of info.

    -aliases = ['?', 'h']
    +aliases = ['h', '?']
    @@ -295,7 +296,7 @@ for simplicity. It shows a pane of info.

    -search_index_entry = {'aliases': '? h', 'category': 'general', 'key': 'help', 'tags': '', 'text': '\n This is an unconnected version of the help command,\n for simplicity. It shows a pane of info.\n '}
    +search_index_entry = {'aliases': 'h ?', 'category': 'general', 'key': 'help', 'tags': '', 'text': '\n This is an unconnected version of the help command,\n for simplicity. It shows a pane of info.\n '}
    @@ -351,6 +352,7 @@ for simplicity. It shows a pane of info.

    +
    develop branch
    @@ -275,7 +276,7 @@ look *<account&g
    -aliases = ['l', 'ls']
    +aliases = ['ls', 'l']
    @@ -295,7 +296,7 @@ look *<account&g
    -search_index_entry = {'aliases': 'l ls', 'category': 'general', 'key': 'look', 'tags': '', 'text': '\n look\n\n Usage:\n look\n look <obj>\n look <room detail>\n look *<account>\n\n Observes your location, details at your location or objects in your vicinity.\n '}
    +search_index_entry = {'aliases': 'ls l', 'category': 'general', 'key': 'look', 'tags': '', 'text': '\n look\n\n Usage:\n look\n look <obj>\n look <room detail>\n look *<account>\n\n Observes your location, details at your location or objects in your vicinity.\n '}
    @@ -550,6 +551,7 @@ self.add().

    +
    develop branch
    @@ -449,6 +450,7 @@ send

    +
    develop branch
    @@ -228,6 +229,7 @@ All extra kwargs will be passed on to the protocol.

    +
    develop branch
    @@ -146,6 +147,7 @@ readers will be unable to read the graphical aspect of the bar.

    +
    develop branch
    @@ -169,6 +170,7 @@ useful but are deemed too game-specific to go into the core library.

    +
    develop branch
    @@ -324,6 +325,7 @@ the expected fields for a callback (code, author, valid…).

    +
    develop branch
    @@ -51,7 +52,7 @@
    -aliases = ['@calls', '@callback', '@callbacks']
    +aliases = ['@callbacks', '@callback', '@calls']
    @@ -132,7 +133,7 @@ on user permission.

    -search_index_entry = {'aliases': '@calls @callback @callbacks', 'category': 'building', 'key': '@call', 'tags': '', 'text': '\n Command to edit callbacks.\n '}
    +search_index_entry = {'aliases': '@callbacks @callback @calls', 'category': 'building', 'key': '@call', 'tags': '', 'text': '\n Command to edit callbacks.\n '}
    @@ -188,6 +189,7 @@ on user permission.

    +
    develop branch
    @@ -156,6 +157,7 @@ to be called from inside another event.

    +
    develop branch
    @@ -100,6 +101,7 @@ +
    develop branch
    @@ -445,6 +446,7 @@ restart only twice.

    +
    develop branch
    @@ -231,6 +232,7 @@ +
    develop branch
    @@ -482,6 +483,7 @@ deletion is aborted.

    +
    develop branch
    @@ -209,6 +210,7 @@ either “yes” or “okay” (maybe ‘say I don’t like it, but okay’).

    Evennia 0.9.5 » +
    develop branch
    @@ -348,6 +349,7 @@ reply - Replies to a received message, appending the original message to the b +
    develop branch
    @@ -290,6 +291,7 @@ how many times the map is iterated over.

    +
    develop branch
    @@ -199,6 +200,7 @@ to the menu’s own look command.

    +
    develop branch
    @@ -173,6 +174,7 @@ description in use and db.multidesc to store all descriptions.< +
    develop branch
    @@ -554,6 +555,7 @@ self.add().

    +
    develop branch
    @@ -304,6 +305,7 @@ calling the get method.

    +
    develop branch
    @@ -384,6 +385,7 @@ means fully obscured.

    +
    develop branch
    @@ -800,7 +801,7 @@ Using the command without arguments will list all current recogs.

    -aliases = ['forget', 'recognize']
    +aliases = ['recognize', 'forget']
    @@ -827,7 +828,7 @@ Using the command without arguments will list all current recogs.

    -search_index_entry = {'aliases': 'forget recognize', 'category': 'general', 'key': 'recog', 'tags': '', 'text': '\n Recognize another person in the same room.\n\n Usage:\n recog\n recog sdesc as alias\n forget alias\n\n Example:\n recog tall man as Griatch\n forget griatch\n\n This will assign a personal alias for a person, or forget said alias.\n Using the command without arguments will list all current recogs.\n\n '}
    +search_index_entry = {'aliases': 'recognize forget', 'category': 'general', 'key': 'recog', 'tags': '', 'text': '\n Recognize another person in the same room.\n\n Usage:\n recog\n recog sdesc as alias\n forget alias\n\n Example:\n recog tall man as Griatch\n forget griatch\n\n This will assign a personal alias for a person, or forget said alias.\n Using the command without arguments will list all current recogs.\n\n '}
    @@ -1293,6 +1294,7 @@ the evennia.contrib.rplanguage module.

    +
    develop branch
    @@ -96,6 +97,7 @@ +
    develop branch
    @@ -131,6 +132,7 @@ compromised or taken down, losing your logs along with it is no help!).

    +
    develop branch
    @@ -170,6 +171,7 @@ writing to log. Recording cleartext password attempts is bad policy.

    +
    develop branch
    @@ -110,6 +111,7 @@ parsed from the Session object.

    +
    develop branch
    @@ -99,6 +100,7 @@ +
    develop branch
    @@ -285,6 +286,7 @@ close <door>

    +
    develop branch
    @@ -235,6 +236,7 @@ stored deferred from the exit traversal above.

    +
    develop branch
    @@ -237,6 +238,7 @@ the conversation defined above.

    +
    develop branch
    @@ -444,6 +445,7 @@ to determine the color the player chose.

    +
    develop branch
    @@ -98,6 +99,7 @@ +
    develop branch
    @@ -804,6 +805,7 @@ topics related to the game.

    +
    develop branch
    @@ -1103,6 +1104,7 @@ You can’t use this command in combat.

    +
    develop branch
    @@ -1083,6 +1084,7 @@ items using the same function work differently.

    +
    develop branch
    @@ -1032,6 +1033,7 @@ instead of creating objects directly.

    +
    develop branch
    @@ -1298,6 +1299,7 @@ topics related to the game.

    +
    develop branch
    @@ -144,6 +145,7 @@ a random check here so as to only return 33% of the time.

    +
    develop branch
    @@ -109,7 +110,7 @@ push the lid of the button away.

    -aliases = ['press button', 'push', 'press']
    +aliases = ['push', 'press', 'press button']
    @@ -140,7 +141,7 @@ lid-state respectively.

    -search_index_entry = {'aliases': 'press button push press', 'category': 'general', 'key': 'push button', 'tags': '', 'text': '\n Push the red button\n\n Usage:\n push button\n\n '}
    +search_index_entry = {'aliases': 'push press press button', 'category': 'general', 'key': 'push button', 'tags': '', 'text': '\n Push the red button\n\n Usage:\n push button\n\n '}
    @@ -162,7 +163,7 @@ lid-state respectively.

    -aliases = ['smash lid', 'break lid', 'smash']
    +aliases = ['smash', 'smash lid', 'break lid']
    @@ -189,7 +190,7 @@ of causing the lamp to break.

    -search_index_entry = {'aliases': 'smash lid break lid smash', 'category': 'general', 'key': 'smash glass', 'tags': '', 'text': '\n smash glass\n\n Usage:\n smash glass\n\n Try to smash the glass of the button.\n '}
    +search_index_entry = {'aliases': 'smash smash lid break lid', 'category': 'general', 'key': 'smash glass', 'tags': '', 'text': '\n smash glass\n\n Usage:\n smash glass\n\n Try to smash the glass of the button.\n '}
    @@ -210,7 +211,7 @@ of causing the lamp to break.

    -aliases = ['open', 'open button']
    +aliases = ['open button', 'open']
    @@ -236,7 +237,7 @@ of causing the lamp to break.

    -search_index_entry = {'aliases': 'open open button', 'category': 'general', 'key': 'open lid', 'tags': '', 'text': '\n open lid\n\n Usage:\n open lid\n\n '}
    +search_index_entry = {'aliases': 'open button open', 'category': 'general', 'key': 'open lid', 'tags': '', 'text': '\n open lid\n\n Usage:\n open lid\n\n '}
    @@ -306,7 +307,7 @@ of causing the lamp to break.

    -aliases = ['examine', 'l', 'listen', 'get', 'ex', 'feel']
    +aliases = ['examine', 'l', 'feel', 'get', 'listen', 'ex']
    @@ -332,7 +333,7 @@ of causing the lamp to break.

    -search_index_entry = {'aliases': 'examine l listen get ex feel', 'category': 'general', 'key': 'look', 'tags': '', 'text': "\n Looking around in darkness\n\n Usage:\n look <obj>\n\n ... not that there's much to see in the dark.\n\n "}
    +search_index_entry = {'aliases': 'examine l feel get listen ex', 'category': 'general', 'key': 'look', 'tags': '', 'text': "\n Looking around in darkness\n\n Usage:\n look <obj>\n\n ... not that there's much to see in the dark.\n\n "}
    @@ -567,6 +568,7 @@ the button is pushed.

    +
    develop branch
    @@ -99,6 +100,7 @@ +
    develop branch
    @@ -188,6 +189,7 @@ to how often the message is echoed.

    +
    develop branch
    @@ -433,6 +434,7 @@ called directly, regardless of the value of self.start_delay +
    develop branch
    @@ -125,6 +126,7 @@ +
    develop branch
    @@ -98,6 +99,7 @@ +
    develop branch
    @@ -280,6 +281,7 @@ option related to this node.

    +
    develop branch
    @@ -329,6 +330,7 @@ right away, also when patrolling on a very slow ticker.

    +
    develop branch
    @@ -491,7 +492,7 @@ shift green root up/down

    -aliases = ['move', 'push', 'pull', 'shiftroot']
    +aliases = ['push', 'pull', 'shiftroot', 'move']
    @@ -527,7 +528,7 @@ yellow/green - horizontal roots

    -search_index_entry = {'aliases': 'move push pull shiftroot', 'category': 'tutorialworld', 'key': 'shift', 'tags': '', 'text': '\n Shifts roots around.\n\n Usage:\n shift blue root left/right\n shift red root left/right\n shift yellow root up/down\n shift green root up/down\n\n '}
    +search_index_entry = {'aliases': 'push pull shiftroot move', 'category': 'tutorialworld', 'key': 'shift', 'tags': '', 'text': '\n Shifts roots around.\n\n Usage:\n shift blue root left/right\n shift red root left/right\n shift yellow root up/down\n shift green root up/down\n\n '}
    @@ -714,7 +715,7 @@ parry - forgoes your attack but will make you harder to hit on next

    -aliases = ['thrust', 'parry', 'defend', 'stab', 'kill', 'slash', 'hit', 'pierce', 'chop', 'bash', 'fight']
    +aliases = ['pierce', 'kill', 'slash', 'chop', 'hit', 'fight', 'parry', 'stab', 'defend', 'bash', 'thrust']
    @@ -740,7 +741,7 @@ parry - forgoes your attack but will make you harder to hit on next

    -search_index_entry = {'aliases': 'thrust parry defend stab kill slash hit pierce chop bash fight', 'category': 'tutorialworld', 'key': 'attack', 'tags': '', 'text': '\n Attack the enemy. Commands:\n\n stab <enemy>\n slash <enemy>\n parry\n\n stab - (thrust) makes a lot of damage but is harder to hit with.\n slash - is easier to land, but does not make as much damage.\n parry - forgoes your attack but will make you harder to hit on next\n enemy attack.\n\n '}
    +search_index_entry = {'aliases': 'pierce kill slash chop hit fight parry stab defend bash thrust', 'category': 'tutorialworld', 'key': 'attack', 'tags': '', 'text': '\n Attack the enemy. Commands:\n\n stab <enemy>\n slash <enemy>\n parry\n\n stab - (thrust) makes a lot of damage but is harder to hit with.\n slash - is easier to land, but does not make as much damage.\n parry - forgoes your attack but will make you harder to hit on next\n enemy attack.\n\n '}
    @@ -995,6 +996,7 @@ pulling weapons from it indefinitely.

    +
    develop branch
    @@ -183,7 +184,7 @@ code except for adding in the details.

    -aliases = ['l', 'ls']
    +aliases = ['ls', 'l']
    @@ -198,7 +199,7 @@ code except for adding in the details.

    -search_index_entry = {'aliases': 'l ls', 'category': 'tutorialworld', 'key': 'look', 'tags': '', 'text': '\n looks at the room and on details\n\n Usage:\n look <obj>\n look <room detail>\n look *<account>\n\n Observes your location, details at your location or objects\n in your vicinity.\n\n Tutorial: This is a child of the default Look command, that also\n allows us to look at "details" in the room. These details are\n things to examine and offers some extra description without\n actually having to be actual database objects. It uses the\n return_detail() hook on TutorialRooms for this.\n '}
    +search_index_entry = {'aliases': 'ls l', 'category': 'tutorialworld', 'key': 'look', 'tags': '', 'text': '\n looks at the room and on details\n\n Usage:\n look <obj>\n look <room detail>\n look *<account>\n\n Observes your location, details at your location or objects\n in your vicinity.\n\n Tutorial: This is a child of the default Look command, that also\n allows us to look at "details" in the room. These details are\n things to examine and offers some extra description without\n actually having to be actual database objects. It uses the\n return_detail() hook on TutorialRooms for this.\n '}
    @@ -712,7 +713,7 @@ if they fall off the bridge.

    -aliases = ['?', 'h']
    +aliases = ['h', '?']
    @@ -738,7 +739,7 @@ if they fall off the bridge.

    -search_index_entry = {'aliases': '? h', 'category': 'tutorial world', 'key': 'help', 'tags': '', 'text': '\n Overwritten help command while on the bridge.\n '}
    +search_index_entry = {'aliases': 'h ?', 'category': 'tutorial world', 'key': 'help', 'tags': '', 'text': '\n Overwritten help command while on the bridge.\n '}
    @@ -864,7 +865,7 @@ to find something.

    -aliases = ['l', 'search', 'fiddle', 'feel around', 'feel']
    +aliases = ['l', 'feel', 'search', 'fiddle', 'feel around']
    @@ -892,7 +893,7 @@ random chance of eventually finding a light source.

    -search_index_entry = {'aliases': 'l search fiddle feel around feel', 'category': 'tutorialworld', 'key': 'look', 'tags': '', 'text': '\n Look around in darkness\n\n Usage:\n look\n\n Look around in the darkness, trying\n to find something.\n '}
    +search_index_entry = {'aliases': 'l feel search fiddle feel around', 'category': 'tutorialworld', 'key': 'look', 'tags': '', 'text': '\n Look around in darkness\n\n Usage:\n look\n\n Look around in the darkness, trying\n to find something.\n '}
    @@ -1262,6 +1263,7 @@ overriding the call (unused by default).

    +
    develop branch
    @@ -375,6 +376,7 @@ use its add_argument method.

    +
    develop branch
    @@ -716,6 +717,7 @@ coordinate.

    +
    develop branch
    @@ -215,6 +216,7 @@ +
    develop branch
    @@ -100,6 +101,7 @@ itself.

    +
    develop branch
    @@ -227,6 +228,7 @@ up in one easily separated category.

    +
    develop branch
    @@ -395,6 +396,7 @@ object the first time, the query is executed.

    +
    develop branch
    @@ -369,7 +370,10 @@ with ‘q’, remove the break line and restart server when finished.

  • evennia.utils
  • @@ -101,6 +102,7 @@ also contains the default lock functions used in lock definitions.

    +
    develop branch
    @@ -553,6 +554,7 @@ unpacked to their real value. We only support basic properties.

    +
    develop branch
    @@ -461,6 +462,7 @@ among the locks defined by lockstring.

    +
    develop branch
    @@ -348,6 +349,7 @@ +
    develop branch
    @@ -99,6 +100,7 @@ objects inherit from classes in this package.

    +
    develop branch
    @@ -96,6 +97,7 @@ +
    develop branch
    @@ -577,6 +578,7 @@ class built by **create_forward_many_to_many_manager()** define +
    develop branch
    @@ -329,7 +330,8 @@ the keyword attribute_name specifies otherwise.
    • me,self: self-reference to this object

    • -
      <num>-<string> - can be used to differentiate

      between multiple same-named matches

      +
      <num>-<string> - can be used to differentiate

      between multiple same-named matches. The exact form of this input +is given by settings.SEARCH_MULTIMATCH_REGEX.

    • @@ -1990,6 +1992,7 @@ read for an error string instead.

    +
    develop branch
    @@ -97,6 +98,7 @@ +
    develop branch
    @@ -202,6 +203,7 @@ prototype rather than creating a new one.

    +
    develop branch
    @@ -271,6 +272,7 @@ Validate that a #dbref input is valid.

    +
    develop branch
    @@ -76,6 +77,13 @@ the default reserved keys.

    +
    +
    +evennia.prototypes.prototypes.load_module_prototypes()[source]
    +

    This is called by evennia.__init__ as Evennia initializes. It’s important +to do this late so as to not interfere with evennia initialization.

    +
    +
    class evennia.prototypes.prototypes.DbPrototype(*args, **kwargs)[source]
    @@ -498,6 +506,7 @@ validator (callable, optional): If given, this will be called with the value to< +
    develop branch
    @@ -523,6 +524,7 @@ custom prototype_parents are given to this function.

    +
    develop branch
    @@ -213,6 +214,7 @@ +
    develop branch
    @@ -105,6 +106,7 @@ timed effects.

    +
    develop branch
    @@ -96,6 +97,7 @@ +
    develop branch
    @@ -387,6 +388,7 @@ class built by **create_forward_many_to_many_manager()** define +
    develop branch
    @@ -91,7 +92,7 @@ non-persistent tickers must be killed.

    at_update(obj, fieldname)[source]
    -

    Called by the field as it saves.

    +

    Called by the field/attribute as it saves.

    @@ -205,6 +206,7 @@ all kwargs must be possible to pickle!

    +
    develop branch
    @@ -209,6 +210,7 @@ be called regularly to crank the wheels.

    +
    develop branch
    @@ -440,6 +441,7 @@ to do it.

    +
    develop branch
    @@ -188,6 +189,7 @@ in the TaskHandler.

    +
    develop branch
    @@ -433,6 +434,7 @@ non-db objects.

    +
    develop branch
    @@ -136,6 +137,7 @@ +
    develop branch
    @@ -271,6 +272,7 @@ operation, as defined by the global variables in +
    develop branch
    @@ -210,6 +211,7 @@ fails (and is expected to echo why if so).

    +
    develop branch
    @@ -114,6 +115,7 @@ does not stop launch.

    +
    develop branch
    @@ -588,6 +589,7 @@ settings here. The result will be printed to the terminal.

    +
    develop branch
    @@ -200,6 +201,7 @@ to this Protocol. The connection has been closed.

    +
    develop branch
    @@ -95,6 +96,7 @@ +
    develop branch
    @@ -119,6 +120,7 @@ to the Evennia Game Index.

    +
    develop branch
    @@ -157,6 +158,7 @@ to connect to the game.

    +
    develop branch
    @@ -149,6 +150,7 @@ steps need to be redone.

    +
    develop branch
    @@ -388,6 +389,7 @@ logging a missing inputfunc for it.

    +
    develop branch
    @@ -127,6 +128,7 @@ value (str): If key was given, this is the stored value, or

    +
    develop branch
    @@ -181,6 +182,7 @@ object the first time, the query is executed.

    +
    develop branch
    @@ -564,6 +565,7 @@ function call

    +
    develop branch
    @@ -312,6 +313,7 @@ global variables in evennia/server/amp.py.

    +
    develop branch
    @@ -309,6 +310,7 @@ disconnect this protocol.

    +
    develop branch
    @@ -114,6 +115,7 @@ +
    develop branch
    @@ -425,6 +426,7 @@ sessions.

    +
    develop branch
    @@ -159,6 +160,7 @@ creating a zlib compression stream.

    +
    develop branch
    @@ -160,6 +161,7 @@ operation.

    +
    develop branch
    @@ -152,6 +153,7 @@ that supports it (mudlet, zmud, mushclient are a few)

    +
    develop branch
    @@ -148,6 +149,7 @@ operation.

    +
    develop branch
    @@ -147,6 +148,7 @@ case it always needs to be restarted manually.

    +
    develop branch
    @@ -348,6 +349,7 @@ method exixts, it sends the data to a method send_default.

    +
    develop branch
    @@ -189,6 +190,7 @@ on slow connections.

    +
    develop branch
    @@ -410,6 +411,7 @@ do not exist, the keypair is created.

    +
    develop branch
    @@ -130,6 +131,7 @@ server-side.

    +
    develop branch
    @@ -138,6 +139,7 @@ protocol to set it up.

    +
    develop branch
    @@ -331,6 +332,7 @@ Note that it must be actively turned back on again!

    +
    develop branch
    @@ -301,6 +302,7 @@ We assume the structure is valid JSON.

    +
    develop branch
    @@ -141,6 +142,7 @@ server-side.

    +
    develop branch
    @@ -197,6 +198,7 @@ its inverse gives the correct string.

    +
    develop branch
    @@ -147,6 +148,7 @@ stored on protocol.protocol_flags under the TTYPE key.

    +
    develop branch
    @@ -264,6 +265,7 @@ client instead.

    +
    develop branch
    @@ -389,6 +390,7 @@ client instead.

    +
    develop branch
    @@ -256,6 +257,7 @@ all “intelligence” of the dummy client.

    +
    develop branch
    @@ -220,6 +221,7 @@ commands (such as creating an account and logging in).

    +
    develop branch
    @@ -100,6 +101,7 @@ +
    develop branch
    @@ -134,6 +135,7 @@ the script will append to this file if it already exists.

    +
    develop branch
    @@ -96,6 +97,7 @@ servers!

    +
    develop branch
    @@ -98,6 +99,7 @@ to setup the environment to test.

    +
    develop branch
    @@ -192,6 +193,7 @@ +
    develop branch
    @@ -107,6 +108,7 @@ This message will get attached time stamp.

    +
    develop branch
    @@ -226,6 +227,7 @@ shutdown or a reset.

    +
    develop branch
    @@ -397,6 +398,7 @@ property, e.g. obj.ndb.attr = value etc.

    +
    develop branch
    @@ -202,6 +203,7 @@ should overload this to format/handle the outgoing data as needed.

    +
    develop branch
    @@ -613,6 +614,7 @@ on the form commandname=((args), {kwargs}).

    +
    develop branch
    @@ -103,6 +104,7 @@ without necessitating a full takeover of hooks that may be in high demand.

    +
    develop branch
    @@ -47,8 +48,8 @@ particular threshold.

    This version of the throttle is usable by both the terminal server as well as the web server, imposes limits on memory consumption by using deques -with length limits instead of open-ended lists, and removes sparse keys when -no recent failures have been recorded.

    +with length limits instead of open-ended lists, and uses native Django +caches for automatic key eviction and persistence configurability.

    error_msg = 'Too many failed attempts; you must wait a few minutes before trying again.'
    @@ -61,6 +62,7 @@ no recent failures have been recorded.

    Keyword Arguments
      +
    • name (str) – Name of this throttle.

    • limit (int) – Max number of failures before imposing limiter

    • timeout (int) – number of timeout seconds after max number of tries has been reached.

    • @@ -72,6 +74,25 @@ the throttle is imposed!

    +
    +
    +get_cache_key(*args, **kwargs)[source]
    +

    Creates a ‘prefixed’ key containing arbitrary terms to prevent key +collisions in the same namespace.

    +
    + +
    +
    +touch(key, *args, **kwargs)[source]
    +

    Refreshes the timeout on a given key and ensures it is recorded in the +key register.

    +
    +
    Parameters
    +

    key (str) – Key of entry to renew.

    +
    +
    +
    +
    get(ip=None)[source]
    @@ -112,6 +133,41 @@ of throttle.

    +
    +
    +remove(ip, *args, **kwargs)[source]
    +

    Clears data stored for an IP from the throttle.

    +
    +
    Parameters
    +

    ip (str) – IP to clear.

    +
    +
    +
    + +
    +
    +record_ip(ip, *args, **kwargs)[source]
    +

    Tracks keys as they are added to the cache (since there is no way to +get a list of keys after-the-fact).

    +
    +
    Parameters
    +

    ip (str) – IP being added to cache. This should be the original +IP, not the cache-prefixed key.

    +
    +
    +
    + +
    +
    +unrecord_ip(ip, *args, **kwargs)[source]
    +

    Forces removal of a key from the key registry.

    +
    +
    Parameters
    +

    ip (str) – IP to remove from list of keys.

    +
    +
    +
    +
    check(ip)[source]
    @@ -186,6 +242,7 @@ fails recently.

    +
    develop branch
    @@ -151,6 +152,7 @@ by this validator.

    +
    develop branch
    @@ -309,6 +310,7 @@ directory this path represents.

    +
    develop branch
    @@ -97,6 +98,7 @@ always be sure of what you have changed and what is default behaviour.

    +
    develop branch
    @@ -380,6 +381,7 @@ people used the admin at the same time

    +
    develop branch
    @@ -1410,6 +1411,7 @@ with nicks stored on the Account level.

    +
    develop branch
    @@ -104,6 +105,7 @@ Attribute and Tag models are defined along with their handlers.

    +
    develop branch
    @@ -496,6 +497,7 @@ Mutually exclusive to include_children.

    +
    develop branch
    @@ -758,6 +759,7 @@ developer’s responsibility.

    +
    develop branch
    @@ -468,6 +469,7 @@ of a latter tuple with the same category).

    +
    develop branch
    @@ -39,16 +40,57 @@

    evennia.utils.ansi

    ANSI - Gives colour to text.

    -

    Use the codes defined in ANSIPARSER in your text -to apply colour to text according to the ANSI standard.

    -

    Examples:

    +

    Use the codes defined in the ANSIParser class to apply colour to text. The +parse_ansi function in this module parses text for markup and strip_ansi +removes it.

    +

    You should usually not need to call parse_ansi explicitly; it is run by +Evennia just before returning data to/from the user. Alternative markup is +possible by overriding the parser class (see also contrib/ for deprecated +markup schemes).

    +

    Supported standards:

    +
      +
    • ANSI 8 bright and 8 dark fg (foreground) colors

    • +
    • ANSI 8 dark bg (background) colors

    • +
    • ‘ANSI’ 8 bright bg colors ‘faked’ with xterm256 (bright bg not included in ANSI standard)

    • +
    • Xterm256 - 255 fg/bg colors + 26 greyscale fg/bg colors

    • +
    +
    +

    Markup

    +

    ANSI colors: r ed, g reen, y ellow, b lue, m agenta, c yan, n ormal (no color). Capital +letters indicate the ‘dark’ variant.

    +
      +
    • |r fg bright red

    • +
    • |R fg dark red

    • +
    • |[r bg bright red

    • +
    • |[R bg dark red

    • +
    • |[R|g bg dark red, fg bright green

    • +
    "This is |rRed text|n and this is normal again."
     
    -

    Mostly you should not need to call parse_ansi() explicitly; -it is run by Evennia just before returning data to/from the -user. Depreciated example forms are available by extending -the ansi mapping.

    +

    Xterm256 colors are given as RGB (Red-Green-Blue), with values 0-5:

    +
      +
    • |500 fg bright red

    • +
    • |050 fg bright green

    • +
    • |005 fg bright blue

    • +
    • |110 fg dark brown

    • +
    • |425 fg pink

    • +
    • |[431 bg orange

    • +
    +

    Xterm256 greyscale:

    +
      +
    • |=a fg black

    • +
    • |=g fg dark grey

    • +
    • |=o fg middle grey

    • +
    • |=v fg bright grey

    • +
    • |=z fg white

    • +
    • |[=r bg middle grey

    • +
    +
    "This is |500Red text|n and this is normal again."
    +"This is |[=jText on dark grey background"
    +
    +
    +
    class evennia.utils.ansi.ANSIParser[source]
    @@ -56,11 +98,10 @@ the ansi mapping.

    A class that parses ANSI markup to ANSI command sequences

    We also allow to escape colour codes -by prepending with a for xterm256, -an extra | for Merc-style codes

    +by prepending with an extra |.

    -ansi_map = [('|n', '\x1b[0m'), ('|/', '\r\n'), ('|-', '\t'), ('|_', ' '), ('|*', '\x1b[7m'), ('|^', '\x1b[5m'), ('|u', '\x1b[4m'), ('|r', '\x1b[1m\x1b[31m'), ('|g', '\x1b[1m\x1b[32m'), ('|y', '\x1b[1m\x1b[33m'), ('|b', '\x1b[1m\x1b[34m'), ('|m', '\x1b[1m\x1b[35m'), ('|c', '\x1b[1m\x1b[36m'), ('|w', '\x1b[1m\x1b[37m'), ('|x', '\x1b[1m\x1b[30m'), ('|R', '\x1b[22m\x1b[31m'), ('|G', '\x1b[22m\x1b[32m'), ('|Y', '\x1b[22m\x1b[33m'), ('|B', '\x1b[22m\x1b[34m'), ('|M', '\x1b[22m\x1b[35m'), ('|C', '\x1b[22m\x1b[36m'), ('|W', '\x1b[22m\x1b[37m'), ('|X', '\x1b[22m\x1b[30m'), ('|h', '\x1b[1m'), ('|H', '\x1b[22m'), ('|!R', '\x1b[31m'), ('|!G', '\x1b[32m'), ('|!Y', '\x1b[33m'), ('|!B', '\x1b[34m'), ('|!M', '\x1b[35m'), ('|!C', '\x1b[36m'), ('|!W', '\x1b[37m'), ('|!X', '\x1b[30m'), ('|[R', '\x1b[41m'), ('|[G', '\x1b[42m'), ('|[Y', '\x1b[43m'), ('|[B', '\x1b[44m'), ('|[M', '\x1b[45m'), ('|[C', '\x1b[46m'), ('|[W', '\x1b[47m'), ('|[X', '\x1b[40m')]
    +ansi_map = [('|n', '\x1b[0m'), ('|/', '\r\n'), ('|-', '\t'), ('|>', ' '), ('|_', ' '), ('|*', '\x1b[7m'), ('|^', '\x1b[5m'), ('|u', '\x1b[4m'), ('|r', '\x1b[1m\x1b[31m'), ('|g', '\x1b[1m\x1b[32m'), ('|y', '\x1b[1m\x1b[33m'), ('|b', '\x1b[1m\x1b[34m'), ('|m', '\x1b[1m\x1b[35m'), ('|c', '\x1b[1m\x1b[36m'), ('|w', '\x1b[1m\x1b[37m'), ('|x', '\x1b[1m\x1b[30m'), ('|R', '\x1b[22m\x1b[31m'), ('|G', '\x1b[22m\x1b[32m'), ('|Y', '\x1b[22m\x1b[33m'), ('|B', '\x1b[22m\x1b[34m'), ('|M', '\x1b[22m\x1b[35m'), ('|C', '\x1b[22m\x1b[36m'), ('|W', '\x1b[22m\x1b[37m'), ('|X', '\x1b[22m\x1b[30m'), ('|h', '\x1b[1m'), ('|H', '\x1b[22m'), ('|!R', '\x1b[31m'), ('|!G', '\x1b[32m'), ('|!Y', '\x1b[33m'), ('|!B', '\x1b[34m'), ('|!M', '\x1b[35m'), ('|!C', '\x1b[36m'), ('|!W', '\x1b[37m'), ('|!X', '\x1b[30m'), ('|[R', '\x1b[41m'), ('|[G', '\x1b[42m'), ('|[Y', '\x1b[43m'), ('|[B', '\x1b[44m'), ('|[M', '\x1b[45m'), ('|[C', '\x1b[46m'), ('|[W', '\x1b[47m'), ('|[X', '\x1b[40m')]
    @@ -120,7 +161,7 @@ an extra | for Merc-style codes

    -ansi_sub = re.compile('\\|n|\\|/|\\|\\-|\\|_|\\|\\*|\\|\\^|\\|u|\\|r|\\|g|\\|y|\\|b|\\|m|\\|c|\\|w|\\|x|\\|R|\\|G|\\|Y|\\|B|\\|M|\\|C|\\|W|\\|X|\\|h|\\|H|\\|!R|\\|!G|\\|!Y|\\|!B|\\|!M|\\|!C|\\|!W|\\|!X|\\|\\[R|\\|\\[G|\\|\, re.DOTALL)
    +ansi_sub = re.compile('\\|n|\\|/|\\|\\-|\\|>|\\|_|\\|\\*|\\|\\^|\\|u|\\|r|\\|g|\\|y|\\|b|\\|m|\\|c|\\|w|\\|x|\\|R|\\|G|\\|Y|\\|B|\\|M|\\|C|\\|W|\\|X|\\|h|\\|H|\\|!R|\\|!G|\\|!Y|\\|!B|\\|!M|\\|!C|\\|!W|\\|!X|\\|\\[R|\\|\\[G, re.DOTALL)
    @@ -130,7 +171,7 @@ an extra | for Merc-style codes

    -ansi_map_dict = {'|!B': '\x1b[34m', '|!C': '\x1b[36m', '|!G': '\x1b[32m', '|!M': '\x1b[35m', '|!R': '\x1b[31m', '|!W': '\x1b[37m', '|!X': '\x1b[30m', '|!Y': '\x1b[33m', '|*': '\x1b[7m', '|-': '\t', '|/': '\r\n', '|B': '\x1b[22m\x1b[34m', '|C': '\x1b[22m\x1b[36m', '|G': '\x1b[22m\x1b[32m', '|H': '\x1b[22m', '|M': '\x1b[22m\x1b[35m', '|R': '\x1b[22m\x1b[31m', '|W': '\x1b[22m\x1b[37m', '|X': '\x1b[22m\x1b[30m', '|Y': '\x1b[22m\x1b[33m', '|[B': '\x1b[44m', '|[C': '\x1b[46m', '|[G': '\x1b[42m', '|[M': '\x1b[45m', '|[R': '\x1b[41m', '|[W': '\x1b[47m', '|[X': '\x1b[40m', '|[Y': '\x1b[43m', '|^': '\x1b[5m', '|_': ' ', '|b': '\x1b[1m\x1b[34m', '|c': '\x1b[1m\x1b[36m', '|g': '\x1b[1m\x1b[32m', '|h': '\x1b[1m', '|m': '\x1b[1m\x1b[35m', '|n': '\x1b[0m', '|r': '\x1b[1m\x1b[31m', '|u': '\x1b[4m', '|w': '\x1b[1m\x1b[37m', '|x': '\x1b[1m\x1b[30m', '|y': '\x1b[1m\x1b[33m'}
    +ansi_map_dict = {'|!B': '\x1b[34m', '|!C': '\x1b[36m', '|!G': '\x1b[32m', '|!M': '\x1b[35m', '|!R': '\x1b[31m', '|!W': '\x1b[37m', '|!X': '\x1b[30m', '|!Y': '\x1b[33m', '|*': '\x1b[7m', '|-': '\t', '|/': '\r\n', '|>': ' ', '|B': '\x1b[22m\x1b[34m', '|C': '\x1b[22m\x1b[36m', '|G': '\x1b[22m\x1b[32m', '|H': '\x1b[22m', '|M': '\x1b[22m\x1b[35m', '|R': '\x1b[22m\x1b[31m', '|W': '\x1b[22m\x1b[37m', '|X': '\x1b[22m\x1b[30m', '|Y': '\x1b[22m\x1b[33m', '|[B': '\x1b[44m', '|[C': '\x1b[46m', '|[G': '\x1b[42m', '|[M': '\x1b[45m', '|[R': '\x1b[41m', '|[W': '\x1b[47m', '|[X': '\x1b[40m', '|[Y': '\x1b[43m', '|^': '\x1b[5m', '|_': ' ', '|b': '\x1b[1m\x1b[34m', '|c': '\x1b[1m\x1b[36m', '|g': '\x1b[1m\x1b[32m', '|h': '\x1b[1m', '|m': '\x1b[1m\x1b[35m', '|n': '\x1b[0m', '|r': '\x1b[1m\x1b[31m', '|u': '\x1b[4m', '|w': '\x1b[1m\x1b[37m', '|x': '\x1b[1m\x1b[30m', '|y': '\x1b[1m\x1b[33m'}
    @@ -845,6 +886,7 @@ with.

    +
    @@ -867,6 +909,14 @@ with.

    +

    Table of Contents

    + +
    +
    develop branch
    @@ -401,6 +402,7 @@ namespace.

    +
    develop branch
    @@ -236,6 +237,7 @@ scripts defined in settings.

    +
    develop branch
    @@ -306,6 +307,7 @@ operations and is thus not suitable for play-testing the game.

    +
    develop branch
    @@ -171,6 +172,7 @@ _SaverList, _SaverDict and _SaverSet counterparts.

    +
    develop branch
    @@ -273,7 +274,7 @@ indentation.

    -aliases = [':>', ':x', ':UU', ':', ':!', ':w', ':=', ':dd', ':S', ':DD', ':p', ':::', ':wq', ':u', ':I', ':A', ':uu', ':h', ':y', ':echo', ':r', ':fi', ':q!', ':s', ':dw', '::', ':j', ':fd', ':i', ':<', ':q', ':f']
    +aliases = [':', ':j', ':fi', ':r', ':::', ':fd', ':h', ':y', ':p', ':DD', ':I', ':>', ':<', ':s', ':echo', ':i', ':=', ':dd', ':S', ':q!', ':q', ':A', ':f', ':w', ':uu', ':!', ':UU', ':u', ':dw', ':wq', '::', ':x']
    @@ -301,7 +302,7 @@ efficient presentation.

    -search_index_entry = {'aliases': ':> :x :UU : :! :w := :dd :S :DD :p ::: :wq :u :I :A :uu :h :y :echo :r :fi :q! :s :dw :: :j :fd :i :< :q :f', 'category': 'general', 'key': ':editor_command_group', 'tags': '', 'text': '\n Commands for the editor\n '}
    +search_index_entry = {'aliases': ': :j :fi :r ::: :fd :h :y :p :DD :I :> :< :s :echo :i := :dd :S :q! :q :A :f :w :uu :! :UU :u :dw :wq :: :x', 'category': 'general', 'key': ':editor_command_group', 'tags': '', 'text': '\n Commands for the editor\n '}
    @@ -538,6 +539,7 @@ formatting information.

    +
    develop branch
    @@ -267,6 +268,7 @@ If this is given, filename is not read.

    +
    develop branch
    @@ -1014,6 +1015,7 @@ Must be on the form callable(caller, raw_string, **kwargs).

    +
    develop branch
    @@ -74,7 +75,7 @@ the caller.msg() construct every time the page is updated.

    -aliases = ['e', 'a', 'q', 'abort', 'next', 'quit', 'b', 'top', 'end', 't', 'n', 'back']
    +aliases = ['e', 'n', 'q', 'next', 't', 'quit', 'back', 'top', 'b', 'end', 'a', 'abort']
    @@ -100,7 +101,7 @@ the caller.msg() construct every time the page is updated.

    -search_index_entry = {'aliases': 'e a q abort next quit b top end t n back', 'category': 'general', 'key': '__noinput_command', 'tags': '', 'text': '\n Manipulate the text paging\n '}
    +search_index_entry = {'aliases': 'e n q next t quit back top b end a abort', 'category': 'general', 'key': '__noinput_command', 'tags': '', 'text': '\n Manipulate the text paging\n '}
    @@ -547,6 +548,7 @@ the evmore commands will be available when this is run).

    +
    develop branch
    @@ -656,6 +657,7 @@ given from 0 to Ncolumns-1.

    +
    develop branch
    @@ -278,6 +279,7 @@ the epoch set by settings.TIME_GAME_EPOCH will still apply.

    +
    develop branch
    @@ -43,7 +44,10 @@ modules in Evennia. It also holds the idmapper in-memory caching functionality.

    @@ -97,6 +98,7 @@ +
    develop branch
    @@ -102,6 +103,7 @@ +
    develop branch
    @@ -314,6 +315,7 @@ catch in an easy way here. Ideas are appreciated. /Griatch

    +
    develop branch
    @@ -419,6 +420,7 @@ object the first time, the query is executed.

    +
    develop branch
    @@ -382,6 +383,7 @@ etc to match the regex.

    +
    develop branch
    @@ -445,6 +446,7 @@ all if the file is shorter than nlines.

    +
    develop branch
    @@ -904,6 +905,7 @@ entries are processed.

    +
    develop branch
    @@ -212,6 +213,7 @@ than their values.

    +
    develop branch
    @@ -256,6 +257,7 @@ This is used by the serialization framework.

    +
    develop branch
    @@ -363,6 +364,7 @@ matches were found.

    +
    develop branch
    @@ -218,6 +219,7 @@ It helps ensure your tests are run with your own objects.

    +
    develop branch
    @@ -180,7 +181,7 @@ snippet #577349 on
    -re_string = re.compile('(?P<htmlchars>[<&>])|(?P<firstspace>(?<=\\S) )|(?P<space> [ \\t]+)|(?P<spacestart>^ )|(?P<lineend>\\r\\n|\\r|\\n)', re.IGNORECASE|re.MULTILINE|re.DOTALL)
    +re_string = re.compile('(?P<htmlchars>[<&>])|(?P<tab>[\\t]+)|(?P<space> +)|(?P<spacestart>^ )|(?P<lineend>\\r\\n|\\r|\\n)', re.IGNORECASE|re.MULTILINE|re.DOTALL)
    @@ -446,6 +447,7 @@ into html statements.

    +
    develop branch
    @@ -1497,6 +1498,7 @@ function has no arg or kwarg named ‘caller’.

    +
    develop branch
    @@ -209,6 +210,7 @@ If neither one is provided, defaults to UTC.

    +
    develop branch
    @@ -125,6 +126,7 @@ found under the server package).

    +
    develop branch
    @@ -89,6 +90,7 @@ +
    develop branch
    @@ -115,6 +116,7 @@ an already authenticated account and bypass authentication.

    +
    develop branch
    @@ -114,6 +115,7 @@ is automatically added to context of all views.

    +
    develop branch
    @@ -97,6 +98,7 @@ +
    develop branch
    @@ -107,6 +108,7 @@ +
    develop branch
    @@ -115,6 +116,7 @@ +
    develop branch
    @@ -95,6 +96,7 @@ +
    develop branch
    @@ -91,6 +92,7 @@ webpage ‘application’.

    +
    develop branch
    @@ -97,6 +98,7 @@ page and serve it eventual static content.

    +
    develop branch
    @@ -327,6 +328,7 @@ wish to allow.

    +
    develop branch
    @@ -105,6 +106,7 @@ +
    develop branch
    @@ -94,6 +95,7 @@ +
    develop branch
    @@ -94,6 +95,7 @@ +
    develop branch
    @@ -460,6 +461,7 @@ +
    develop branch
    @@ -90,6 +91,7 @@ +
    develop branch
    @@ -876,6 +877,7 @@ instead of pk and slug.

    +
    develop branch
    +
  • load_module_prototypes() (in module evennia.prototypes.prototypes) +
  • load_sync_data() (evennia.server.session.Session method)
  • loads() (in module evennia.server.portal.amp) @@ -11736,6 +11741,8 @@
  • (evennia.server.portal.irc.IRCBotFactory method)
  • +
  • record_ip() (evennia.server.throttle.Throttle method) +
  • RedButton (class in evennia.contrib.tutorial_examples.red_button)
  • RedButton.DoesNotExist @@ -11842,6 +11849,8 @@
  • (evennia.scripts.tickerhandler.TickerHandler method)
  • (evennia.scripts.tickerhandler.TickerPool method) +
  • +
  • (evennia.server.throttle.Throttle method)
  • (evennia.typeclasses.attributes.AttributeHandler method)
  • @@ -14057,6 +14066,8 @@
  • toint() (in module evennia.prototypes.protfuncs)
  • toString() (evennia.server.portal.amp.Compressed method) +
  • +
  • touch() (evennia.server.throttle.Throttle method)
  • TradeHandler (class in evennia.contrib.barter)
  • @@ -14387,6 +14398,8 @@
  • unpuppet_all() (evennia.accounts.accounts.DefaultAccount method)
  • unpuppet_object() (evennia.accounts.accounts.DefaultAccount method) +
  • +
  • unrecord_ip() (evennia.server.throttle.Throttle method)
  • unrepeat() (in module evennia.server.inputfuncs)
  • @@ -14408,10 +14421,10 @@
  • (evennia.utils.utils.LimitedSizeOrderedDict method)
  • -
  • update_attribute() (evennia.typeclasses.attributes.IAttributeBackend method) -
  • +
    develop branch
    @@ -126,6 +127,7 @@ time.

    +
    develop branch
    @@ -1190,6 +1191,7 @@ +
    develop branch
    @@ -94,6 +95,7 @@ +
    develop branch
    @@ -40,7 +41,6 @@

    Toc

    @@ -204,6 +205,7 @@ chat are also there for you.

    +
    develop branch
    @@ -158,6 +159,7 @@ to you, but some things may still be useful.

    +
    develop branch
    @@ -419,6 +420,7 @@ build steps could be added or removed at this point, adding some features like U +
    develop branch
    @@ -375,6 +376,7 @@ topic here.

    +
    develop branch
    @@ -128,6 +129,7 @@ package imports from.

    +
    develop branch
    @@ -218,6 +219,7 @@ course hard to actually mimic human user behavior. For this, actual real-game te +
    develop branch
    @@ -213,6 +214,7 @@ instructions, use the following command to fix it:

    +
    develop branch
    @@ -217,6 +218,7 @@ still running in interactive mode.

    +
    develop branch
    @@ -591,6 +592,7 @@ will get much more information to help you fix the bug.

    +
    develop branch
    @@ -227,6 +228,7 @@ you then just run e +
    develop branch
    @@ -131,6 +132,7 @@ fitting your game.

    +
    develop branch
    @@ -548,6 +549,7 @@ understand the underlying ideas behind GIT +
    develop branch
    @@ -203,6 +204,7 @@ any.

    +
    develop branch
    @@ -532,6 +533,7 @@ those will check for the Evennia 1.0-dev » +
    develop branch
    @@ -389,6 +390,7 @@ executed. When the code runs it has no knowledge of what file those strings wher +
    develop branch
    @@ -313,6 +314,7 @@ mode instead, see its readme for install instructions.

    +
    develop branch
    @@ -167,6 +168,7 @@ allowed.

    +
    develop branch
    @@ -201,6 +202,7 @@ over Evennia 1.0-dev » +
    develop branch
    @@ -90,6 +91,7 @@ +
    develop branch
    @@ -458,6 +459,7 @@ instructions.

    +
    develop branch
    @@ -503,6 +504,7 @@ commands having any combination of the keys and/or aliases “kick”, “punch +
    develop branch
    @@ -99,6 +100,7 @@ +
    develop branch
    @@ -876,6 +877,7 @@ on.

    +
    develop branch
    @@ -214,6 +215,7 @@ for channel communication (since the default ChannelCommand instead logs to a fi +
    develop branch
    @@ -200,6 +201,7 @@ than, the doc-strings of each component in the Evennia 1.0-dev » +
    develop branch
    @@ -129,6 +130,7 @@ tutorial section on how to add new commands to a default command set.

    +
    develop branch
    @@ -337,6 +338,7 @@ editor can be useful if you want to test the code you have typed but add new lin +
    develop branch
    @@ -1367,6 +1368,7 @@ until the exit node.

    +
    develop branch
    @@ -130,6 +131,7 @@ paging.

    +
    develop branch
    @@ -229,6 +230,7 @@ definition:

    +
    develop branch
    @@ -290,6 +291,7 @@ add more. By default the following fields/attributes can be monitored:

    +
    develop branch
    @@ -640,6 +641,7 @@ interface. It’s stand-alone from the permissions described above.

    +
    develop branch
    @@ -187,6 +188,7 @@ the monitor to remove:

    +
    develop branch
    @@ -226,6 +227,7 @@ basically the unchanged strings you enter to the Evennia 1.0-dev » +
    develop branch
    @@ -295,6 +296,7 @@ and display this as an error message. If this is not found, the Exit will instea +
    develop branch
    @@ -90,6 +91,7 @@ +
    develop branch
    @@ -98,6 +99,7 @@ This allows the two programs to communicate seamlessly.

    +
    develop branch
    @@ -528,6 +529,7 @@ tutorial.

    +
    develop branch
    @@ -200,6 +201,7 @@ know about if you are an Evennia developer.

    +
    develop branch
    @@ -90,6 +91,7 @@ +
    develop branch
    @@ -280,6 +281,7 @@ module for details on the capabilities of the Evennia 1.0-dev » +
    develop branch
    @@ -213,6 +214,7 @@ decorator (only relevant for unit testing)

    +
    develop branch
    @@ -427,6 +428,7 @@ the api docs.

    +
    develop branch
    @@ -293,6 +294,7 @@ is found in the Evennia 1.0-dev » +
    develop branch
    @@ -220,6 +221,7 @@ same time without input from something else.

    +
    develop branch
    @@ -445,6 +446,7 @@ comments for examples and solutions.

    +
    develop branch
    @@ -359,6 +360,7 @@ window.plugin_handler.add("myplugin", myplugin); +
    develop branch
    @@ -90,6 +91,7 @@ +
    develop branch
    @@ -359,6 +360,7 @@ your own liking.

    +
    develop branch
    @@ -245,6 +246,7 @@ objects on the fly. For advanced users.

    +
    develop branch
    @@ -197,6 +198,7 @@ started/introduction/) or read one of our other web tutorials.

    +
    develop branch
    @@ -167,6 +168,7 @@ levels. Note that you cannot escalate your permissions this way; If the Characte +
    develop branch
    @@ -160,6 +161,7 @@ +
    develop branch
    @@ -436,6 +437,7 @@ ways.

    +
    develop branch
    @@ -114,6 +115,7 @@ of nine names from +
    develop branch
    @@ -181,6 +182,7 @@ your own repository clone) so we can integrate your translation into Evennia!

    Evennia 1.0-dev » +
    develop branch
    @@ -310,6 +311,7 @@ may trigger changes in the GUI or play a sound etc.

    +
    develop branch
    @@ -90,6 +91,7 @@ +
    develop branch
    @@ -377,6 +378,7 @@ lot more information about querying the database.

    +
    develop branch
    @@ -275,6 +276,7 @@ same example (" +
    develop branch
    @@ -182,6 +183,7 @@ pseudo-softcode plugin aimed at developers wanting to script their game from ins +
    develop branch
    @@ -154,6 +155,7 @@ the Wikipedia article Evennia 1.0-dev » +
    develop branch
    @@ -462,6 +463,7 @@ given, it defaults to resetting the color (Evennia 1.0-dev » +
    develop branch
    @@ -209,6 +210,7 @@ something to the effect of

    +
    develop branch
    @@ -235,6 +236,7 @@ implementation, the relevant django “applications” in default Evennia are Evennia 1.0-dev » +
    develop branch
    @@ -144,6 +145,7 @@ properly search the inheritance tree.

    +
    develop branch
    @@ -568,6 +569,7 @@ shown in the next tutorial.

    +
    develop branch
    @@ -341,6 +342,7 @@ on localhost at port 4000, and the webserver at http://localhost:4001/

    +
    develop branch
    @@ -1678,6 +1679,7 @@ exhaustive but user-friendly.

    +
    develop branch
    @@ -148,6 +149,7 @@ longer-form documentation associated with particular contribs.

    +
    develop branch
    @@ -339,6 +340,7 @@ events).

    +
    develop branch
    @@ -813,6 +814,7 @@ also look into up/down directions and figure out how to display that in a good w +
    develop branch
    @@ -696,6 +697,7 @@ Tutorial), Evennia 1.0-dev » +
    develop branch
    @@ -853,6 +854,7 @@ to understand our friendly Google-style docstrings used in classes and functions +
    develop branch
    @@ -213,6 +214,7 @@ UBBFWIuVDEZxC0M_2pM6ywO&dispatch=5885d80a13c0db1f8e263663d3faee8d66f31424b43 +
    develop branch
    @@ -243,6 +244,7 @@ game-specific contributions and plugins (Evennia 1.0-dev » +
    develop branch
    @@ -311,6 +312,7 @@ your own game, you will end up with a small (very small) game that you can build +
    develop branch
    @@ -478,6 +479,7 @@ activated whenever you want to use the Evennia 1.0-dev » +
    develop branch
    @@ -169,6 +170,7 @@ issues by putting up a monetary Evennia 1.0-dev » +
    develop branch
    @@ -417,6 +418,7 @@ necessary. If you’re interested in supporting this little project, you are mo +
    develop branch
    @@ -392,6 +393,7 @@ shooting goodness would be made available to you only when you enter it.

    +
    develop branch
    @@ -599,6 +600,7 @@ discussion where some suitable fonts are suggested.

    +
    develop branch
    @@ -233,6 +234,7 @@ other types of attacks for a while before the warrior can recover.

    +
    develop branch
    @@ -720,6 +721,7 @@ callback when the server comes back up (it will resume the countdown and ignore +
    develop branch
    @@ -278,6 +279,7 @@ directly the easiest way is to just wrap those with a multiple inheritance to yo +
    develop branch
    @@ -581,6 +582,7 @@ square (E, G, M and O) are not in this circle. So we remove them.

    +
    develop branch
    @@ -767,6 +768,7 @@ lg/avenew/blob/master/commands/comms.py)

    +
    develop branch
    @@ -255,6 +256,7 @@ matching “north” exit-command.

    +
    develop branch
    @@ -360,6 +361,7 @@ your mob.

    +
    develop branch
    @@ -325,6 +326,7 @@ or post a question in our Evennia 1.0-dev » +
    develop branch
    @@ -1148,6 +1149,7 @@ when the message was sent.

    +
    develop branch
    @@ -473,6 +474,7 @@ same way as described for the default one above.

    +
    develop branch
    @@ -674,6 +675,7 @@ themselves links to display their details.

    +
    develop branch
    @@ -258,6 +259,7 @@ in mind for your own game, this will give you a good start.

    +
    develop branch
    @@ -311,6 +312,7 @@ regardless of if Evennia thinks their client supports it or not.

    +
    develop branch
    @@ -222,6 +223,7 @@ the following message in the elevator’s appearance: Evennia 1.0-dev » +
    develop branch
    @@ -571,6 +572,7 @@ it well stocked.

    +
    develop branch
    @@ -1083,6 +1084,7 @@ code.

    +
    develop branch
    @@ -575,6 +576,7 @@ get into how we replace and extend Evennia’s default Commands.

    +
    develop branch
    @@ -417,6 +418,7 @@ example. Evennia comes with a tutorial world for you to explore. We will try tha +
    develop branch
    @@ -167,6 +168,7 @@ You can find the parent class for Accounts in Starting Tutorial (Part 1) » +
    develop branch
    @@ -553,6 +554,7 @@ to understand how to plan what our tutorial game will be about.

    +
    develop branch
    @@ -244,6 +245,7 @@ to look it up in the docs:

    +
    develop branch
    @@ -342,6 +343,7 @@ equipment, stats and looks.

    +
    develop branch
    @@ -839,6 +840,7 @@ this tutorial. But that’s enough of them for now. It’s time to take some act +
    develop branch
    @@ -761,6 +762,7 @@ command on ourselves.

    +
    develop branch
    @@ -742,6 +743,7 @@ Now let’s look at the rest of the stuff you’ve got going on inside that Starting Tutorial (Part 1) » +
    develop branch
    @@ -560,6 +561,7 @@ provides. But first we need to learn just where to find everything.

    +
    develop branch
    @@ -395,6 +396,7 @@ Django queries and querysets in earnest.

    +
    develop branch
    @@ -247,6 +248,7 @@ the log again just run

    +
    develop branch
    @@ -230,6 +231,7 @@ move on with how to access this power through code.

    +
    develop branch
    @@ -335,6 +336,7 @@ have made their dream game a reality!

    +
    develop branch
    @@ -354,6 +355,7 @@ back to your planning and adjust it as you learn what works and what does not.Evennia Starting Tutorial (Part 2) » +
    develop branch
    @@ -563,6 +564,7 @@ to code themselves. So in the next lesson we will check out what help we have fr +
    develop branch
    @@ -261,6 +262,7 @@ then try to answer those questions for the sake of creating our little tutorial +
    develop branch
    @@ -150,6 +151,7 @@ and “what to think about” when creating a multiplayer online text game.

    +
    develop branch
    @@ -1186,6 +1187,7 @@ mixing them, or even try a third solution that better fits what you have in mind +
    develop branch
    @@ -467,6 +468,7 @@ your rulesEvennia 1.0-dev » +
    develop branch
    @@ -151,6 +152,7 @@ with using Evennia. This be of much use when doing your own thing later.

    +
    develop branch
    @@ -926,6 +927,7 @@ show others what’s going on.

    +
    develop branch
    @@ -985,6 +986,7 @@ as the Evennia 1.0-dev » +
    develop branch
    @@ -110,6 +111,7 @@ and batchcode processors.

    +
    develop branch
    @@ -210,6 +211,7 @@ to.

    +
    develop branch
    @@ -108,6 +109,7 @@ to bring your game online so you can invite your first players.

    +
    develop branch
    @@ -205,6 +206,7 @@ works and what possibilities exist.

    +
    develop branch
    @@ -232,6 +233,7 @@ AI code).

    +
    develop branch
    @@ -240,6 +241,7 @@ Which way to go depends on the design requirements of your particular game.

    +
    develop branch
    @@ -245,6 +246,7 @@ as mygame/typeclass +
    develop branch
    @@ -642,6 +643,7 @@ direction to which room it goes.

    +
    develop branch
    @@ -256,6 +257,7 @@ push it over the limit, so to speak.

    +
    develop branch
    @@ -153,6 +154,7 @@ weather came before it. Expanding it to be more realistic is a useful exercise.< +
    develop branch
    @@ -983,6 +984,7 @@ to see what happens. And do the same while checking the checkbox!

    +
    develop branch
    @@ -370,6 +371,7 @@ here.

    +
    develop branch
    @@ -109,6 +110,7 @@ as Evennia itself, unless the individual contributor has specifically defined ot +
    develop branch
    @@ -306,6 +307,7 @@ programming curriculum for different skill levels

    +
    develop branch
    @@ -286,6 +287,7 @@ port but this should be applicable also to other types of proxies (like nginx).< +
    develop branch
    @@ -378,6 +379,7 @@ others. If you try other databases out, consider expanding this page with instru +
    develop branch
    @@ -240,6 +241,7 @@ parameter to disable it for that Evennia account permanently.

    +
    develop branch
    @@ -183,6 +184,7 @@ if you are not ready for players yet.

    +
    develop branch
    @@ -586,6 +587,7 @@ you should update the line to the real location.

    +
    develop branch
    @@ -158,6 +159,7 @@ it to your channel in-game.

    +
    develop branch
    @@ -154,6 +155,7 @@ +
    develop branch
    @@ -240,6 +241,7 @@ help.

    +
    develop branch
    @@ -176,6 +177,7 @@ name of the IRC channel you used (#evennia here).

    +
    develop branch
    @@ -227,6 +228,7 @@ killed if your phone is heavily taxed. Termux seems to keep a notification up to +
    develop branch
    @@ -600,6 +601,7 @@ https://aws.amazon.com/cloud9/

    +
    develop branch
    @@ -143,6 +144,7 @@ same channels as Evennia 1.0-dev » +
    develop branch
    @@ -384,6 +385,7 @@ line.

    +
    develop branch
    @@ -255,6 +256,7 @@ ISP snooping.

    +
    develop branch
    @@ -90,6 +91,7 @@ +
    develop branch
    @@ -162,6 +163,7 @@ +
    develop branch
    @@ -55,6 +56,10 @@ in complete isolation if you want, without needing any access to the internet.virtualenv is recommended in order to keep your installation independent from the system libraries. It’s not recommended to install Evennia as superuser.

    +
    +

    Warning

    +

    This is not yet available. Switch to the 0.9.5 version of these docs to install Evennia.

    +
    pip install evennia
     
    @@ -204,6 +209,7 @@ a web browser at http +
    develop branch
    @@ -294,6 +295,7 @@ In-game you should now get the message that the Server has successfully restarte +
    develop branch
    @@ -117,6 +118,7 @@ +
    develop branch
    @@ -337,6 +338,7 @@ +
    develop branch
    @@ -1219,6 +1220,7 @@ +
    develop branch
    @@ -283,6 +284,7 @@ +
    develop branch
    @@ -1979,6 +1980,7 @@ +
    develop branch
    @@ -418,6 +419,7 @@ +
    develop branch
    @@ -137,6 +138,7 @@ +
    develop branch
    @@ -515,6 +516,7 @@ +
    develop branch
    @@ -432,8 +433,12 @@ BASE_GUEST_TYPECLASS = class_from_module(settings.BASE_GUEST_TYPECLASS) del class_from_module - # delayed starts + # delayed starts - important so as to not back-access evennia before it has + # finished initializing GLOBAL_SCRIPTS.start() + from .prototypes import prototypes + prototypes.load_module_prototypes() + del prototypes
    [docs]def set_trace(term_size=(140, 80), debugger="auto"): @@ -545,6 +550,7 @@ +
    develop branch
    @@ -93,10 +94,10 @@ # Create throttles for too many account-creations and login attempts CREATION_THROTTLE = Throttle( - limit=settings.CREATION_THROTTLE_LIMIT, timeout=settings.CREATION_THROTTLE_TIMEOUT + name='creation', limit=settings.CREATION_THROTTLE_LIMIT, timeout=settings.CREATION_THROTTLE_TIMEOUT ) LOGIN_THROTTLE = Throttle( - limit=settings.LOGIN_THROTTLE_LIMIT, timeout=settings.LOGIN_THROTTLE_TIMEOUT + name='login', limit=settings.LOGIN_THROTTLE_LIMIT, timeout=settings.LOGIN_THROTTLE_TIMEOUT ) @@ -1761,6 +1762,7 @@ +
    develop branch
    @@ -449,6 +450,7 @@ +
    develop branch
    @@ -663,6 +664,7 @@ +
    develop branch
    @@ -273,6 +274,7 @@ +
    develop branch
    @@ -265,6 +266,7 @@ +
    develop branch
    @@ -911,6 +912,7 @@ +
    develop branch
    @@ -250,10 +251,15 @@ quality = [mat[4] for mat in matches] matches = matches[-quality.count(quality[-1]) :] - if len(matches) > 1 and match_index is not None and 0 < match_index <= len(matches): + if len(matches) > 1 and match_index is not None: # We couldn't separate match by quality, but we have an # index argument to tell us which match to use. - matches = [matches[match_index - 1]] + if 0 < match_index <= len(matches): + matches = [matches[match_index - 1]] + else: + # we tried to give an index outside of the range - this means + # a no-match + matches = [] # no matter what we have at this point, we have to return it. return matches
    @@ -302,6 +308,7 @@ +
    develop branch
    @@ -555,15 +556,16 @@ # cmd is a command set so merge all commands in that set # to this one. We raise a visible error if we created # an infinite loop (adding cmdset to itself somehow) + cmdset = cmd try: - cmd = self._instantiate(cmd) + cmdset = self._instantiate(cmdset) except RuntimeError: - string = "Adding cmdset %(cmd)s to %(class)s lead to an " - string += "infinite loop. When adding a cmdset to another, " - string += "make sure they are not themself cyclically added to " - string += "the new cmdset somewhere in the chain." - raise RuntimeError(_(string) % {"cmd": cmd, "class": self.__class__}) - cmds = cmd.commands + err = ("Adding cmdset {cmdset} to {cls} lead to an " + "infinite loop. When adding a cmdset to another, " + "make sure they are not themself cyclically added to " + "the new cmdset somewhere in the chain.") + raise RuntimeError(_(err.format(cmdset=cmdset, cls=self.__class__))) + cmds = cmdset.commands elif is_iter(cmd): cmds = [self._instantiate(c) for c in cmd] else: @@ -572,7 +574,7 @@ system_commands = self.system_commands for cmd in cmds: # add all commands - if not hasattr(cmd, "obj"): + if not hasattr(cmd, "obj") or cmd.obj is None: cmd.obj = self.cmdsetobj try: ic = commands.index(cmd) @@ -757,6 +759,7 @@ +
    develop branch
    @@ -738,6 +739,7 @@ +
    develop branch
    @@ -759,6 +760,7 @@ +
    develop branch
    @@ -345,7 +346,7 @@ character_candidates = [] if not self.args: - character_candidates = [account.db._last_puppet] or [] + character_candidates = [account.db._last_puppet] if account.db._last_puppet else [] if not character_candidates: self.msg("Usage: ic <character>") return @@ -1138,6 +1139,7 @@ +
    develop branch
    @@ -679,6 +680,7 @@ +
    develop branch
    @@ -905,6 +906,7 @@ +
    develop branch
    @@ -3902,6 +3903,7 @@ +
    develop branch
    @@ -161,6 +162,7 @@ +
    develop branch
    @@ -176,6 +177,7 @@ +
    develop branch
    @@ -102,6 +103,7 @@ +
    develop branch
    @@ -111,6 +112,7 @@ +
    develop branch
    @@ -1441,6 +1442,7 @@ +
    develop branch
    @@ -812,6 +813,7 @@ +
    develop branch
    @@ -629,6 +630,7 @@ +
    develop branch
    @@ -354,6 +355,7 @@ +
    develop branch
    @@ -237,6 +238,7 @@ +
    develop branch
    @@ -883,21 +884,30 @@ return if service.name[:7] == "Evennia": if delmode: - caller.msg("You cannot remove a core Evennia service (named 'Evennia***').") + caller.msg("You cannot remove a core Evennia service (named 'Evennia*').") return - string = "You seem to be shutting down a core Evennia service (named 'Evennia***'). Note that" - string += "stopping some TCP port services will *not* disconnect users *already*" - string += "connected on those ports, but *may* instead cause spurious errors for them. To " - string += "safely and permanently remove ports, change settings file and restart the server." + string = ("|RYou seem to be shutting down a core Evennia " + "service (named 'Evennia*').\nNote that stopping " + "some TCP port services will *not* disconnect users " + "*already* connected on those ports, but *may* " + "instead cause spurious errors for them.\nTo safely " + "and permanently remove ports, change settings file " + "and restart the server.|n\n") caller.msg(string) if delmode: service.stopService() service_collection.removeService(service) - caller.msg("Stopped and removed service '%s'." % self.args) + caller.msg("|gStopped and removed service '%s'.|n" % self.args) else: - service.stopService() - caller.msg("Stopped service '%s'." % self.args) + caller.msg(f"Stopping service '{self.args}'...") + try: + service.stopService() + except Exception as err: + caller.msg(f"|rErrors were reported when stopping this service{err}.\n" + "If there are remaining problems, try reloading " + "or rebooting the server.") + caller.msg("|g... Stopped service '%s'.|n" % self.args) return if switches[0] == "start": @@ -905,8 +915,14 @@ if service.running: caller.msg("That service is already running.") return - caller.msg("Starting service '%s'." % self.args) - service.startService()
    + caller.msg(f"Starting service '{self.args}' ...") + try: + service.startService() + except Exception as err: + caller.msg(f"|rErrors were reported when starting this service{err}.\n" + "If there are remaining problems, try reloading the server, changing the " + "settings if it's a non-standard service.|n") + caller.msg("|gService started.|n")
    [docs]class CmdAbout(COMMAND_DEFAULT_CLASS): @@ -1251,6 +1267,7 @@ +
    develop branch
    @@ -1682,6 +1683,7 @@ +
    develop branch
    @@ -581,6 +582,7 @@ +
    develop branch
    @@ -207,6 +208,7 @@ +
    develop branch
    @@ -407,6 +408,7 @@ +
    develop branch
    @@ -906,6 +907,7 @@ +
    develop branch
    @@ -499,6 +500,7 @@ +
    develop branch
    @@ -825,6 +826,7 @@ +
    develop branch
    @@ -947,6 +948,7 @@ +
    develop branch
    @@ -685,6 +686,7 @@ +
    develop branch
    @@ -981,6 +982,7 @@ +
    develop branch
    @@ -1351,6 +1352,7 @@ +
    develop branch
    @@ -278,6 +279,7 @@ +
    develop branch
    @@ -828,6 +829,7 @@ +
    develop branch
    @@ -393,6 +394,7 @@ +
    develop branch
    @@ -346,6 +347,7 @@ +
    develop branch
    @@ -447,6 +448,7 @@ +
    develop branch
    @@ -677,6 +678,7 @@ +
    develop branch
    @@ -800,6 +801,7 @@ +
    develop branch
    @@ -241,6 +242,7 @@ +
    develop branch
    @@ -204,6 +205,7 @@ +
    develop branch
    @@ -309,6 +310,7 @@ +
    develop branch
    @@ -667,6 +668,7 @@ +
    develop branch
    @@ -175,6 +176,7 @@ +
    develop branch
    @@ -752,6 +753,7 @@ +
    develop branch
    @@ -627,6 +628,7 @@ +
    develop branch
    @@ -1003,6 +1004,7 @@ +
    develop branch
    @@ -347,6 +348,7 @@ +
    develop branch
    @@ -443,6 +444,7 @@ +
    develop branch
    @@ -586,6 +587,7 @@ +
    develop branch
    @@ -338,6 +339,7 @@ +
    develop branch
    @@ -354,6 +355,7 @@ +
    develop branch
    @@ -898,6 +899,7 @@ +
    develop branch
    @@ -438,6 +439,7 @@ +
    develop branch
    @@ -629,6 +630,7 @@ +
    develop branch
    @@ -1709,6 +1710,7 @@ +
    develop branch
    @@ -144,6 +145,7 @@ +
    develop branch
    @@ -333,6 +334,7 @@ +
    develop branch
    @@ -198,6 +199,7 @@ +
    develop branch
    @@ -256,6 +257,7 @@ +
    develop branch
    @@ -228,6 +229,7 @@ +
    develop branch
    @@ -217,6 +218,7 @@ +
    develop branch
    @@ -989,6 +990,7 @@ +
    develop branch
    @@ -1486,6 +1487,7 @@ +
    develop branch
    @@ -661,6 +662,7 @@ +
    develop branch
    @@ -864,6 +865,7 @@ +
    develop branch
    @@ -1222,6 +1223,7 @@ +
    develop branch
    @@ -1541,6 +1542,7 @@ +
    develop branch
    @@ -1463,6 +1464,7 @@ +
    develop branch
    @@ -1519,6 +1520,7 @@ +
    develop branch
    @@ -150,6 +151,7 @@ +
    develop branch
    @@ -419,6 +420,7 @@ +
    develop branch
    @@ -146,6 +147,7 @@ +
    develop branch
    @@ -251,6 +252,7 @@ +
    develop branch
    @@ -369,6 +370,7 @@ +
    develop branch
    @@ -155,6 +156,7 @@ +
    develop branch
    @@ -430,7 +431,7 @@ (aka MUDs, MUSHes, MUX, MOOs...). It is open-source and |wfree to use|n, also for commercial projects (BSD license). -Out of the box, Evennia provides a |wfull, if empty game|n. Whereas you can play +Out of the box, Evennia provides a |wworking, if empty game|n. Whereas you can play via traditional telnet MUD-clients, the server runs your game's website and offers a |wHTML5 webclient|n so that people can play your game in their browser without downloading anything extra. @@ -866,6 +867,7 @@ +
    develop branch
    @@ -520,6 +521,7 @@ +
    develop branch
    @@ -1268,6 +1269,7 @@ +
    develop branch
    @@ -1252,6 +1253,7 @@ +
    develop branch
    @@ -379,6 +380,7 @@ +
    develop branch
    @@ -861,6 +862,7 @@ +
    develop branch
    @@ -140,6 +141,7 @@ +
    develop branch
    @@ -236,6 +237,7 @@ +
    develop branch
    @@ -377,6 +378,7 @@ +
    develop branch
    @@ -782,6 +783,7 @@ +
    develop branch
    @@ -841,6 +842,7 @@ +
    develop branch
    @@ -281,6 +282,7 @@ +
    develop branch
    @@ -507,19 +508,25 @@ # strips the number match_number, searchdata = match.group("number"), match.group("name") match_number = int(match_number) - 1 - match_number = match_number if match_number >= 0 else None if match_number is not None or not exact: # run search again, with the exactness set by call matches = _searcher(searchdata, candidates, typeclass, exact=exact) # deal with result - if len(matches) > 1 and match_number is not None: + if len(matches) == 1 and match_number is not None and match_number != 0: + # this indicates trying to get a single match with a match-number + # targeting some higher-number match (like 2-box when there is only + # one box in the room). This leads to a no-match. + matches = [] + elif len(matches) > 1 and match_number is not None: # multiple matches, but a number was given to separate them - try: + if 0 <= match_number < len(matches): + # limit to one match matches = [matches[match_number]] - except IndexError: - # match number not matching anything - pass + else: + # a number was given outside of range. This means a no-match. + matches = [] + # return a list (possibly empty) return matches @@ -677,6 +684,7 @@ +
    develop branch
    @@ -469,6 +470,7 @@ +
    develop branch
    @@ -435,7 +436,8 @@ a global search. - `me,self`: self-reference to this object - `<num>-<string>` - can be used to differentiate - between multiple same-named matches + between multiple same-named matches. The exact form of this input + is given by `settings.SEARCH_MULTIMATCH_REGEX`. global_search (bool): Search all objects globally. This overrules 'location' data. use_nicks (bool): Use nickname-replace (nicktype "object") on `searchdata`. typeclass (str or Typeclass, or list of either): Limit search only @@ -2791,6 +2793,7 @@ +
    develop branch
    @@ -2843,6 +2844,7 @@ +
    develop branch
    @@ -430,6 +431,7 @@ +
    develop branch
    @@ -185,35 +186,41 @@ # module-based prototypes -for mod in settings.PROTOTYPE_MODULES: - # to remove a default prototype, override it with an empty dict. - # internally we store as (key, desc, locks, tags, prototype_dict) - prots = [] - for variable_name, prot in all_from_module(mod).items(): - if isinstance(prot, dict): - if "prototype_key" not in prot: - prot["prototype_key"] = variable_name.lower() - prots.append((prot["prototype_key"], homogenize_prototype(prot))) - # assign module path to each prototype_key for easy reference - _MODULE_PROTOTYPE_MODULES.update({prototype_key.lower(): mod for prototype_key, _ in prots}) - # make sure the prototype contains all meta info - for prototype_key, prot in prots: - actual_prot_key = prot.get("prototype_key", prototype_key).lower() - prot.update( - { - "prototype_key": actual_prot_key, - "prototype_desc": prot["prototype_desc"] if "prototype_desc" in prot else mod, - "prototype_locks": ( - prot["prototype_locks"] - if "prototype_locks" in prot - else "use:all();edit:false()" - ), - "prototype_tags": list( - set(list(make_iter(prot.get("prototype_tags", []))) + ["module"]) - ), - } - ) - _MODULE_PROTOTYPES[actual_prot_key] = prot +
    [docs]def load_module_prototypes(): + """ + This is called by `evennia.__init__` as Evennia initializes. It's important + to do this late so as to not interfere with evennia initialization. + + """ + for mod in settings.PROTOTYPE_MODULES: + # to remove a default prototype, override it with an empty dict. + # internally we store as (key, desc, locks, tags, prototype_dict) + prots = [] + for variable_name, prot in all_from_module(mod).items(): + if isinstance(prot, dict): + if "prototype_key" not in prot: + prot["prototype_key"] = variable_name.lower() + prots.append((prot["prototype_key"], homogenize_prototype(prot))) + # assign module path to each prototype_key for easy reference + _MODULE_PROTOTYPE_MODULES.update({prototype_key.lower(): mod for prototype_key, _ in prots}) + # make sure the prototype contains all meta info + for prototype_key, prot in prots: + actual_prot_key = prot.get("prototype_key", prototype_key).lower() + prot.update( + { + "prototype_key": actual_prot_key, + "prototype_desc": prot["prototype_desc"] if "prototype_desc" in prot else mod, + "prototype_locks": ( + prot["prototype_locks"] + if "prototype_locks" in prot + else "use:all();edit:false()" + ), + "prototype_tags": list( + set(list(make_iter(prot.get("prototype_tags", []))) + ["module"]) + ), + } + ) + _MODULE_PROTOTYPES[actual_prot_key] = prot
    # Db-based prototypes @@ -970,7 +977,10 @@ value = validator(value[0](*make_iter(args))) else: value = validator(value) - return protfunc_parser(value)
    + result = protfunc_parser(value) + if result != value: + return validator(result) + return result
    [docs]def value_to_obj_or_any(value): @@ -1041,6 +1051,7 @@ +
    develop branch
    @@ -1076,6 +1077,7 @@ +
    develop branch
    @@ -175,6 +176,7 @@ +
    develop branch
    @@ -370,6 +371,7 @@ +
    develop branch
    @@ -265,6 +266,7 @@ +
    develop branch
    @@ -134,7 +135,7 @@
    [docs] def at_update(self, obj, fieldname): """ - Called by the field as it saves. + Called by the field/attribute as it saves. """ to_delete = [] @@ -289,6 +290,7 @@ +
    develop branch
    @@ -256,6 +257,7 @@ +
    develop branch
    @@ -800,6 +801,7 @@ +
    develop branch
    @@ -287,6 +288,7 @@ +
    develop branch
    @@ -121,9 +122,15 @@ _ERROR_ADD_TICKER = """TickerHandler: Tried to add an invalid ticker: -{storekey} +{store_key} Ticker was not added.""" +_ERROR_ADD_TICKER_SUB_SECOND = """You are trying to add a ticker running faster +than once per second. This is not supported and also probably not useful: +Spamming messages to the user faster than once per second serves no purpose in +a text-game, and if you want to update some property, consider doing so +on-demand rather than using a ticker. +"""
    [docs]class Ticker(object): """ @@ -400,7 +407,8 @@ obj (Object, tuple or None): Subscribing object if any. If a tuple, this is a packed_obj tuple from dbserialize. path (str or None): Python-path to callable, if any. - interval (int): Ticker interval. + interval (int): Ticker interval. Floats will be converted to + nearest lower integer value. callfunc (callable or str): This is either the callable function or the name of the method to call. Note that the callable is never stored in the key; that is uniquely identified with the python-path. @@ -419,6 +427,9 @@ `idstring` and `persistent` are integers, strings and bools respectively. """ + if interval < 1: + raise RuntimeError(_ERROR_ADD_TICKER_SUB_SECOND) + interval = int(interval) persistent = bool(persistent) packed_obj = pack_dbobj(obj) @@ -717,6 +728,7 @@ +
    develop branch
    @@ -109,6 +110,7 @@ +
    develop branch
    @@ -336,6 +337,7 @@ +
    develop branch
    @@ -605,6 +606,7 @@ +
    develop branch
    @@ -208,6 +209,7 @@ +
    develop branch
    @@ -2378,6 +2379,7 @@ +
    develop branch
    @@ -263,6 +264,7 @@ +
    develop branch
    @@ -142,6 +143,7 @@ +
    develop branch
    @@ -323,6 +324,7 @@ +
    develop branch
    @@ -562,9 +563,8 @@ session=session, ) else: - # kwargs provided: persist them to the account object - for key, value in kwargs.items(): - clientoptions[key] = value
    + # kwargs provided: persist them to the account object. + clientoptions.update(kwargs)
    # OOB protocol-specific aliases and wrappers @@ -702,6 +702,7 @@ +
    develop branch
    @@ -137,6 +138,7 @@ +
    develop branch
    @@ -219,6 +220,7 @@ +
    develop branch
    @@ -87,6 +88,14 @@ AMP_MAXLEN = amp.MAX_VALUE_LENGTH # max allowed data length in AMP protocol (cannot be changed) +# amp internal +ASK = b'_ask' +ANSWER = b'_answer' +ERROR = b'_error' +ERROR_CODE = b'_error_code' +ERROR_DESCRIPTION = b'_error_description' +UNKNOWN_ERROR_CODE = b'UNKNOWN' + # buffers _SENDBATCH = defaultdict(list) _MSGBUFFER = defaultdict(list) @@ -342,6 +351,47 @@ # later twisted amp has its own __init__ super(AMPMultiConnectionProtocol, self).__init__(*args, **kwargs)
    + def _commandReceived(self, box): + """ + This overrides the default Twisted AMP error handling which is not + passing enough of the traceback through to the other side. Instead we + add a specific log of the problem on the erroring side. + + """ + def formatAnswer(answerBox): + answerBox[ANSWER] = box[ASK] + return answerBox + + def formatError(error): + if error.check(amp.RemoteAmpError): + code = error.value.errorCode + desc = error.value.description + + # Evennia extra logging + desc += " (error logged on other side)" + _get_logger().log_err(f"AMP caught exception ({desc}):\n{error.value}") + + if isinstance(desc, str): + desc = desc.encode("utf-8", "replace") + if error.value.fatal: + errorBox = amp.QuitBox() + else: + errorBox = amp.AmpBox() + else: + errorBox = amp.QuitBox() + _get_logger().log_err(error) # server-side logging if unhandled error + code = UNKNOWN_ERROR_CODE + desc = b"Unknown Error" + errorBox[ERROR] = box[ASK] + errorBox[ERROR_DESCRIPTION] = desc + errorBox[ERROR_CODE] = code + return errorBox + deferred = self.dispatchCommand(box) + if ASK in box: + deferred.addCallbacks(formatAnswer, formatError) + deferred.addCallback(self._safeEmit) + deferred.addErrback(self.unhandledError) +
    [docs] def dataReceived(self, data): """ Handle non-AMP messages, such as HTTP communication. @@ -426,7 +476,7 @@ """ e.trap(Exception) _get_logger().log_err( - "AMP Error for {info}: {trcbck} {err}".format( + "AMP Error from {info}: {trcbck} {err}".format( info=info, trcbck=e.getTraceback(), err=e.getErrorMessage() ) )
    @@ -575,6 +625,7 @@ +
    develop branch
    @@ -566,6 +567,7 @@ +
    develop branch
    @@ -443,6 +444,7 @@ +
    develop branch
    @@ -562,6 +563,7 @@ +
    develop branch
    @@ -174,6 +175,7 @@ +
    develop branch
    @@ -219,6 +220,7 @@ +
    develop branch
    @@ -168,6 +169,7 @@ +
    develop branch
    @@ -168,6 +169,7 @@ +
    develop branch
    @@ -521,6 +522,7 @@ +
    develop branch
    @@ -566,6 +567,7 @@ +
    develop branch
    @@ -247,6 +248,7 @@ +
    develop branch
    @@ -611,6 +612,7 @@ +
    develop branch
    @@ -201,6 +202,7 @@ +
    develop branch
    @@ -150,6 +151,7 @@ +
    develop branch
    @@ -128,7 +129,6 @@ super().dataReceived(data) except ValueError as err: from evennia.utils import logger - logger.log_err(f"Malformed telnet input: {err}")
    [docs] def connectionMade(self): @@ -576,6 +576,7 @@ +
    develop branch
    @@ -524,6 +525,7 @@ +
    develop branch
    @@ -239,6 +240,7 @@ +
    develop branch
    @@ -404,6 +405,7 @@ +
    develop branch
    @@ -270,6 +271,7 @@ +
    develop branch
    @@ -158,6 +159,10 @@ self.sessid = old_session.sessid self.sessionhandler.disconnect(old_session) + self.protocol_flags["CLIENTNAME"] = "Evennia Webclient (websocket)" + self.protocol_flags["UTF-8"] = True + self.protocol_flags["OOB"] = True + # watch for dead links self.transport.setTcpKeepAlive(1) # actually do the connection @@ -387,6 +392,7 @@ +
    develop branch
    @@ -551,6 +552,7 @@ +
    develop branch
    @@ -518,6 +519,7 @@ +
    develop branch
    @@ -376,6 +377,7 @@ +
    develop branch
    @@ -200,6 +201,7 @@ +
    develop branch
    @@ -127,6 +128,7 @@ +
    develop branch
    @@ -246,6 +247,7 @@ +
    develop branch
    @@ -124,6 +125,7 @@ +
    develop branch
    @@ -815,6 +816,7 @@ +
    develop branch
    @@ -509,6 +510,7 @@ +
    develop branch
    @@ -258,6 +259,7 @@ +
    develop branch
    @@ -932,6 +933,7 @@ +
    develop branch
    @@ -39,7 +40,8 @@

    Source code for evennia.server.throttle

    -from collections import defaultdict, deque
    +from django.core.cache import caches
    +from collections import deque
     from evennia.utils import logger
     import time
     
    @@ -53,8 +55,8 @@
     
         This version of the throttle is usable by both the terminal server as well
         as the web server, imposes limits on memory consumption by using deques
    -    with length limits instead of open-ended lists, and removes sparse keys when
    -    no recent failures have been recorded.
    +    with length limits instead of open-ended lists, and uses native Django 
    +    caches for automatic key eviction and persistence configurability.
         """
     
         error_msg = "Too many failed attempts; you must wait a few minutes before trying again."
    @@ -64,6 +66,7 @@
             Allows setting of throttle parameters.
     
             Keyword Args:
    +            name (str): Name of this throttle.
                 limit (int): Max number of failures before imposing limiter
                 timeout (int): number of timeout seconds after
                     max number of tries has been reached.
    @@ -71,9 +74,37 @@
                     rolling window; this is NOT the same as the limit after which
                     the throttle is imposed!
             """
    -        self.storage = defaultdict(deque)
    -        self.cache_size = self.limit = kwargs.get("limit", 5)
    +        try:
    +            self.storage = caches['throttle']
    +        except Exception as e:
    +            logger.log_trace("Throttle: Errors encountered; using default cache.")
    +            self.storage = caches['default']
    +            
    +        self.name = kwargs.get('name', 'undefined-throttle')
    +        self.limit = kwargs.get("limit", 5)
    +        self.cache_size = kwargs.get('cache_size', self.limit)
             self.timeout = kwargs.get("timeout", 5 * 60)
    + +
    [docs] def get_cache_key(self, *args, **kwargs): + """ + Creates a 'prefixed' key containing arbitrary terms to prevent key + collisions in the same namespace. + + """ + return '-'.join((self.name, *args))
    + +
    [docs] def touch(self, key, *args, **kwargs): + """ + Refreshes the timeout on a given key and ensures it is recorded in the + key register. + + Args: + key(str): Key of entry to renew. + + """ + cache_key = self.get_cache_key(key) + if self.storage.touch(cache_key, self.timeout): + self.record_key(key)
    [docs] def get(self, ip=None): """ @@ -91,9 +122,18 @@ """ if ip: - return self.storage.get(ip, deque(maxlen=self.cache_size)) + cache_key = self.get_cache_key(str(ip)) + return self.storage.get(cache_key, deque(maxlen=self.cache_size)) else: - return self.storage
    + keys_key = self.get_cache_key('keys') + keys = self.storage.get_or_set(keys_key, set(), self.timeout) + data = self.storage.get_many((self.get_cache_key(x) for x in keys)) + + found_keys = set(data.keys()) + if len(keys) != len(found_keys): + self.storage.set(keys_key, found_keys, self.timeout) + + return data
    [docs] def update(self, ip, failmsg="Exceeded threshold."): """ @@ -108,24 +148,77 @@ None """ + cache_key = self.get_cache_key(ip) + # Get current status previously_throttled = self.check(ip) - # Enforce length limits - if not self.storage[ip].maxlen: - self.storage[ip] = deque(maxlen=self.cache_size) - - self.storage[ip].append(time.time()) + # Get previous failures, if any + entries = self.storage.get(cache_key, []) + entries.append(time.time()) + + # Store updated record + self.storage.set(cache_key, deque(entries, maxlen=self.cache_size), self.timeout) # See if this update caused a change in status currently_throttled = self.check(ip) # If this makes it engage, log a single activation event if not previously_throttled and currently_throttled: - logger.log_sec( - "Throttle Activated: %s (IP: %s, %i hits in %i seconds.)" - % (failmsg, ip, self.limit, self.timeout) - )
    + logger.log_sec(f"Throttle Activated: {failmsg} (IP: {ip}, {self.limit} hits in {self.timeout} seconds.)") + + self.record_ip(ip)
    + +
    [docs] def remove(self, ip, *args, **kwargs): + """ + Clears data stored for an IP from the throttle. + + Args: + ip(str): IP to clear. + + """ + exists = self.get(ip) + if not exists: return False + + cache_key = self.get_cache_key(ip) + self.storage.delete(cache_key) + self.unrecord_ip(ip) + + # Return True if NOT exists + return ~bool(self.get(ip))
    + +
    [docs] def record_ip(self, ip, *args, **kwargs): + """ + Tracks keys as they are added to the cache (since there is no way to + get a list of keys after-the-fact). + + Args: + ip(str): IP being added to cache. This should be the original + IP, not the cache-prefixed key. + + """ + keys_key = self.get_cache_key('keys') + keys = self.storage.get(keys_key, set()) + keys.add(ip) + self.storage.set(keys_key, keys, self.timeout) + return True
    + +
    [docs] def unrecord_ip(self, ip, *args, **kwargs): + """ + Forces removal of a key from the key registry. + + Args: + ip(str): IP to remove from list of keys. + + """ + keys_key = self.get_cache_key('keys') + keys = self.storage.get(keys_key, set()) + try: + keys.remove(ip) + self.storage.set(keys_key, keys, self.timeout) + return True + except KeyError: + return False
    [docs] def check(self, ip): """ @@ -143,17 +236,20 @@ """ now = time.time() ip = str(ip) + + cache_key = self.get_cache_key(ip) # checking mode - latest_fails = self.storage[ip] + latest_fails = self.storage.get(cache_key) if latest_fails and len(latest_fails) >= self.limit: # too many fails recently if now - latest_fails[-1] < self.timeout: # too soon - timeout in play + self.touch(cache_key) return True else: # timeout has passed. clear faillist - del self.storage[ip] + self.remove(ip) return False else: return False
    @@ -202,6 +298,7 @@ +
    develop branch
    @@ -174,6 +175,7 @@ +
    develop branch
    @@ -384,6 +385,7 @@ +
    develop branch
    @@ -428,6 +429,7 @@ +
    develop branch
    @@ -479,7 +480,7 @@ """ key = key.strip().lower() if key else None - category = category.strip().lower() if category else None + category = category.strip().lower() if category is not None else None if key: return self._get_cache_key(key, category) return self._get_cache_category(category) @@ -1587,6 +1588,7 @@ +
    develop branch
    @@ -932,6 +933,7 @@ +
    develop branch
    @@ -1130,6 +1131,7 @@ +
    develop branch
    @@ -614,6 +615,7 @@ +
    develop branch
    @@ -42,19 +43,64 @@ """ ANSI - Gives colour to text. -Use the codes defined in ANSIPARSER in your text -to apply colour to text according to the ANSI standard. +Use the codes defined in the *ANSIParser* class to apply colour to text. The +`parse_ansi` function in this module parses text for markup and `strip_ansi` +removes it. -Examples: +You should usually not need to call `parse_ansi` explicitly; it is run by +Evennia just before returning data to/from the user. Alternative markup is +possible by overriding the parser class (see also contrib/ for deprecated +markup schemes). + + +Supported standards: + +- ANSI 8 bright and 8 dark fg (foreground) colors +- ANSI 8 dark bg (background) colors +- 'ANSI' 8 bright bg colors 'faked' with xterm256 (bright bg not included in ANSI standard) +- Xterm256 - 255 fg/bg colors + 26 greyscale fg/bg colors + +## Markup + +ANSI colors: `r` ed, `g` reen, `y` ellow, `b` lue, `m` agenta, `c` yan, `n` ormal (no color). Capital +letters indicate the 'dark' variant. + +- `|r` fg bright red +- `|R` fg dark red +- `|[r` bg bright red +- `|[R` bg dark red +- `|[R|g` bg dark red, fg bright green ```python "This is |rRed text|n and this is normal again." + ``` -Mostly you should not need to call `parse_ansi()` explicitly; -it is run by Evennia just before returning data to/from the -user. Depreciated example forms are available by extending -the ansi mapping. +Xterm256 colors are given as RGB (Red-Green-Blue), with values 0-5: + +- `|500` fg bright red +- `|050` fg bright green +- `|005` fg bright blue +- `|110` fg dark brown +- `|425` fg pink +- `|[431` bg orange + +Xterm256 greyscale: + +- `|=a` fg black +- `|=g` fg dark grey +- `|=o` fg middle grey +- `|=v` fg bright grey +- `|=z` fg white +- `|[=r` bg middle grey + +```python +"This is |500Red text|n and this is normal again." +"This is |[=jText on dark grey background" + +``` + +---- """ import functools @@ -126,8 +172,7 @@ to ANSI command sequences We also allow to escape colour codes - by prepending with a \ for xterm256, - an extra | for Merc-style codes + by prepending with an extra `|`. """ @@ -138,6 +183,7 @@ (r"|n", ANSI_NORMAL), # reset (r"|/", ANSI_RETURN), # line break (r"|-", ANSI_TAB), # tab + (r"|>", ANSI_SPACE * 4), # indent (4 spaces) (r"|_", ANSI_SPACE), # space (r"|*", ANSI_INVERSE), # invert (r"|^", ANSI_BLINK), # blinking text (very annoying and not supported by all clients) @@ -567,6 +613,13 @@ return string.replace("{", "{{").replace("|", "||")
    +# ------------------------------------------------------------ +# +# ANSIString - ANSI-aware string class +# +# ------------------------------------------------------------ + + def _spacing_preflight(func): """ This wrapper function is used to do some preflight checks on @@ -937,9 +990,23 @@ replayed. """ - slice_indexes = self._char_indexes[slc] + char_indexes = self._char_indexes + slice_indexes = char_indexes[slc] # If it's the end of the string, we need to append final color codes. if not slice_indexes: + # if we find no characters it may be because we are just outside + # of the interval, using an open-ended slice. We must replay all + # of the escape characters until/after this point. + if char_indexes: + if slc.start is None and slc.stop is None: + # a [:] slice of only escape characters + return ANSIString(self._raw_string[slc]) + if slc.start is None: + # this is a [:x] slice + return ANSIString(self._raw_string[:char_indexes[0]]) + if slc.stop is None: + # a [x:] slice + return ANSIString(self._raw_string[char_indexes[-1] + 1:]) return ANSIString("") try: string = self[slc.start or 0]._raw_string @@ -959,7 +1026,7 @@ # raw_string not long enough pass if i is not None: - append_tail = self._get_interleving(self._char_indexes.index(i) + 1) + append_tail = self._get_interleving(char_indexes.index(i) + 1) else: append_tail = "" return ANSIString(string + append_tail, decoded=True) @@ -1484,6 +1551,7 @@ +
    develop branch
    @@ -523,6 +524,7 @@ +
    develop branch
    @@ -326,6 +327,7 @@ +
    develop branch
    @@ -668,6 +669,7 @@ +
    develop branch
    @@ -341,6 +342,10 @@ def has_key(self, key): return key in self._data + @_save + def update(self, *args, **kwargs): + self._data.update(*args, **kwargs) + class _SaverSet(_SaverMutable, MutableSet): """ @@ -836,6 +841,7 @@ +
    develop branch
    @@ -1198,6 +1199,7 @@ +
    develop branch
    @@ -206,9 +207,12 @@ def _to_ansi(obj, regexable=False): "convert to ANSIString" - if isinstance(obj, str): + if isinstance(obj, ANSIString): + return obj + elif isinstance(obj, str): # since ansi will be parsed twice (here and in the normal ansi send), we have to - # escape the |-structure twice. + # escape the |-structure twice. TODO: This is tied to the default color-tag syntax + # which is not ideal for those wanting to replace/extend it ... obj = _ANSI_ESCAPE.sub(r"||||", obj) if isinstance(obj, dict): return dict((key, _to_ansi(value, regexable=regexable)) for key, value in obj.items()) @@ -218,7 +222,7 @@ return ANSIString(obj, regexable=regexable) -
    [docs]class EvForm(object): +
    [docs]class EvForm: """ This object is instantiated with a text file and parses it for rectangular form fields. It can then be fed a @@ -504,43 +508,6 @@ def __str__(self): "Prints the form" return str(ANSIString("\n").join([line for line in self.form]))
    - - -def _test(): - "test evform. This is used by the unittest system." - form = EvForm("evennia.utils.tests.data.evform_example") - - # add data to each tagged form cell - form.map( - cells={ - "AA": "|gTom the Bouncer", - 2: "|yGriatch", - 3: "A sturdy fellow", - 4: 12, - 5: 10, - 6: 5, - 7: 18, - 8: 10, - 9: 3, - "F": "rev 1", - } - ) - # create the EvTables - tableA = EvTable("HP", "MV", "MP", table=[["**"], ["*****"], ["***"]], border="incols") - tableB = EvTable( - "Skill", - "Value", - "Exp", - table=[ - ["Shooting", "Herbalism", "Smithing"], - [12, 14, 9], - ["550/1200", "990/1400", "205/900"], - ], - border="incols", - ) - # add the tables to the proper ids in the form - form.map(tables={"A": tableA, "B": tableB}) - return str(form)
    @@ -586,6 +553,7 @@ +
    develop branch
    @@ -1994,6 +1995,7 @@ +
    develop branch
    @@ -635,6 +636,7 @@ +
    develop branch
    @@ -1844,6 +1845,7 @@ +
    develop branch
    @@ -352,6 +353,7 @@ +
    develop branch
    @@ -117,6 +118,7 @@ +
    develop branch
    @@ -757,6 +758,7 @@ +
    develop branch
    @@ -162,6 +163,7 @@ +
    develop branch
    @@ -709,6 +710,7 @@ +
    develop branch
    @@ -408,7 +409,7 @@ logfile.LogFile.rotate(self) return lines = tail_log_file(self.path, 0, self.num_lines_to_append) - logfile.LogFile.rotate(self) + super().rotate() for line in lines: self.write(line)
    @@ -618,6 +619,7 @@ +
    develop branch
    @@ -407,6 +408,7 @@ +
    develop branch
    @@ -264,6 +265,7 @@ +
    develop branch
    @@ -386,6 +387,7 @@ +
    develop branch
    @@ -438,6 +439,7 @@ +
    develop branch
    @@ -259,6 +260,7 @@ +
    develop branch
    @@ -138,7 +139,7 @@ re_blink = re.compile("(?:%s)(.*?)(?=%s|%s)" % (blink.replace("[", r"\["), fgstop, bgstop)) re_inverse = re.compile("(?:%s)(.*?)(?=%s|%s)" % (inverse.replace("[", r"\["), fgstop, bgstop)) re_string = re.compile( - r"(?P<htmlchars>[<&>])|(?P<firstspace>(?<=\S) )|(?P<space> [ \t]+)|" + r"(?P<htmlchars>[<&>])|(?P<tab>[\t]+)|(?P<space> +)|" r"(?P<spacestart>^ )|(?P<lineend>\r\n|\r|\n)", re.S | re.M | re.I, ) @@ -348,13 +349,12 @@ return html_escape(cdict["htmlchars"]) elif cdict["lineend"]: return "<br>" - elif cdict["firstspace"]: - return " &nbsp;" - elif cdict["space"] == "\t": - return " " if self.tabstop == 1 else " " + "&nbsp;" * self.tabstop + elif cdict["tab"]: + text = cdict["tab"].replace("\t", " " + "&nbsp;" * (self.tabstop - 1)) + return text elif cdict["space"] or cdict["spacestart"]: - text = match.group().replace("\t", "&nbsp;" * self.tabstop) - text = text.replace(" ", "&nbsp;") + text = cdict["space"] + text = " " if len(text) == 1 else " " + text[1:].replace(" ", "&nbsp;") return text return None
    @@ -453,6 +453,7 @@ +
    develop branch
    @@ -2390,6 +2391,7 @@ +
    develop branch
    @@ -318,6 +319,7 @@ +
    develop branch
    @@ -207,6 +208,7 @@ +
    develop branch
    @@ -170,6 +171,7 @@ +
    develop branch
    @@ -313,6 +314,7 @@ +
    develop branch
    @@ -254,6 +255,7 @@ +
    develop branch
    @@ -207,6 +208,7 @@ +
    develop branch
    @@ -127,6 +128,7 @@ +
    develop branch
    @@ -182,6 +183,7 @@ +
    develop branch
    @@ -156,6 +157,7 @@ +
    develop branch
    @@ -155,6 +156,7 @@ +
    develop branch
    @@ -114,6 +115,7 @@ +
    develop branch
    @@ -256,6 +257,7 @@ +
    develop branch
    @@ -101,6 +102,7 @@ +
    develop branch
    @@ -373,6 +374,7 @@ +
    develop branch
    @@ -1205,6 +1206,7 @@ +
    develop branch
    @@ -931,6 +932,7 @@ +
    develop branch
    @@ -288,6 +289,7 @@ +
    develop branch
    @@ -478,6 +479,7 @@ +
    develop branch
    @@ -186,6 +187,7 @@ +
    develop branch
    @@ -144,6 +145,7 @@ +
    develop branch
    @@ -116,6 +117,7 @@ +
    develop branch
    @@ -244,6 +245,7 @@ +
    develop branch
    @@ -1078,6 +1079,7 @@ overriding the call (unused by default).

    +
    develop branch
    @@ -389,6 +390,7 @@ has a slightly different workflow.

    +
    develop branch
    @@ -499,6 +500,7 @@ triggered by the bot_data_in Inputfunc.

    +
    develop branch
    @@ -101,6 +102,7 @@ more Objects depending on settings. An Account has no in-game existence.

    +
    develop branch
    @@ -96,6 +97,7 @@ +
    develop branch
    @@ -417,6 +418,7 @@ class built by **create_forward_many_to_many_manager()** define +
    develop branch
    @@ -188,6 +189,7 @@ default Evennia.

    +
    develop branch
    @@ -211,6 +212,7 @@ the remaining arguments, and the matched cmdobject from the cmdset.

    +
    develop branch
    @@ -428,6 +429,7 @@ self.add().

    +
    develop branch
    @@ -396,6 +397,7 @@ handled automatically by @reload).

    +
    develop branch
    @@ -491,6 +492,7 @@ detailing the contents of the table.

    +
    develop branch
    @@ -864,6 +865,7 @@ to all the variables defined therein.

    +
    develop branch
    @@ -549,6 +550,7 @@ including all currently unlogged in.

    +
    develop branch
    @@ -224,6 +225,7 @@ object copies behind when testing out the script.

    +
    develop branch
    @@ -528,7 +529,7 @@ You can specify the /force switch to bypass this confirmation.

    -aliases = ['del', 'delete']
    +aliases = ['delete', 'del']
    @@ -569,7 +570,7 @@ You can specify the /force switch to bypass this confirmation.

    -search_index_entry = {'aliases': 'del delete', 'category': 'building', 'key': 'destroy', 'tags': '', 'text': '\n permanently delete objects\n\n Usage:\n destroy[/switches] [obj, obj2, obj3, [dbref-dbref], ...]\n\n Switches:\n override - The destroy command will usually avoid accidentally\n destroying account objects. This switch overrides this safety.\n force - destroy without confirmation.\n Examples:\n destroy house, roof, door, 44-78\n destroy 5-10, flower, 45\n destroy/force north\n\n Destroys one or many objects. If dbrefs are used, a range to delete can be\n given, e.g. 4-10. Also the end points will be deleted. This command\n displays a confirmation before destroying, to make sure of your choice.\n You can specify the /force switch to bypass this confirmation.\n '}
    +search_index_entry = {'aliases': 'delete del', 'category': 'building', 'key': 'destroy', 'tags': '', 'text': '\n permanently delete objects\n\n Usage:\n destroy[/switches] [obj, obj2, obj3, [dbref-dbref], ...]\n\n Switches:\n override - The destroy command will usually avoid accidentally\n destroying account objects. This switch overrides this safety.\n force - destroy without confirmation.\n Examples:\n destroy house, roof, door, 44-78\n destroy 5-10, flower, 45\n destroy/force north\n\n Destroys one or many objects. If dbrefs are used, a range to delete can be\n given, e.g. 4-10. Also the end points will be deleted. This command\n displays a confirmation before destroying, to make sure of your choice.\n You can specify the /force switch to bypass this confirmation.\n '}
    @@ -1267,7 +1268,7 @@ server settings.

    -aliases = ['swap', 'update', 'parent', 'type']
    +aliases = ['type', 'swap', 'update', 'parent']
    @@ -1298,7 +1299,7 @@ server settings.

    -search_index_entry = {'aliases': 'swap update parent type', 'category': 'building', 'key': 'typeclass', 'tags': '', 'text': "\n set or change an object's typeclass\n\n Usage:\n typeclass[/switch] <object> [= typeclass.path]\n typeclass/prototype <object> = prototype_key\n\n typeclass/list/show [typeclass.path]\n swap - this is a shorthand for using /force/reset flags.\n update - this is a shorthand for using the /force/reload flag.\n\n Switch:\n show, examine - display the current typeclass of object (default) or, if\n given a typeclass path, show the docstring of that typeclass.\n update - *only* re-run at_object_creation on this object\n meaning locks or other properties set later may remain.\n reset - clean out *all* the attributes and properties on the\n object - basically making this a new clean object.\n force - change to the typeclass also if the object\n already has a typeclass of the same name.\n list - show available typeclasses. Only typeclasses in modules actually\n imported or used from somewhere in the code will show up here\n (those typeclasses are still available if you know the path)\n prototype - clean and overwrite the object with the specified\n prototype key - effectively making a whole new object.\n\n Example:\n type button = examples.red_button.RedButton\n type/prototype button=a red button\n\n If the typeclass_path is not given, the current object's typeclass is\n assumed.\n\n View or set an object's typeclass. If setting, the creation hooks of the\n new typeclass will be run on the object. If you have clashing properties on\n the old class, use /reset. By default you are protected from changing to a\n typeclass of the same name as the one you already have - use /force to\n override this protection.\n\n The given typeclass must be identified by its location using python\n dot-notation pointing to the correct module and class. If no typeclass is\n given (or a wrong typeclass is given). Errors in the path or new typeclass\n will lead to the old typeclass being kept. The location of the typeclass\n module is searched from the default typeclass directory, as defined in the\n server settings.\n\n "}
    +search_index_entry = {'aliases': 'type swap update parent', 'category': 'building', 'key': 'typeclass', 'tags': '', 'text': "\n set or change an object's typeclass\n\n Usage:\n typeclass[/switch] <object> [= typeclass.path]\n typeclass/prototype <object> = prototype_key\n\n typeclass/list/show [typeclass.path]\n swap - this is a shorthand for using /force/reset flags.\n update - this is a shorthand for using the /force/reload flag.\n\n Switch:\n show, examine - display the current typeclass of object (default) or, if\n given a typeclass path, show the docstring of that typeclass.\n update - *only* re-run at_object_creation on this object\n meaning locks or other properties set later may remain.\n reset - clean out *all* the attributes and properties on the\n object - basically making this a new clean object.\n force - change to the typeclass also if the object\n already has a typeclass of the same name.\n list - show available typeclasses. Only typeclasses in modules actually\n imported or used from somewhere in the code will show up here\n (those typeclasses are still available if you know the path)\n prototype - clean and overwrite the object with the specified\n prototype key - effectively making a whole new object.\n\n Example:\n type button = examples.red_button.RedButton\n type/prototype button=a red button\n\n If the typeclass_path is not given, the current object's typeclass is\n assumed.\n\n View or set an object's typeclass. If setting, the creation hooks of the\n new typeclass will be run on the object. If you have clashing properties on\n the old class, use /reset. By default you are protected from changing to a\n typeclass of the same name as the one you already have - use /force to\n override this protection.\n\n The given typeclass must be identified by its location using python\n dot-notation pointing to the correct module and class. If no typeclass is\n given (or a wrong typeclass is given). Errors in the path or new typeclass\n will lead to the old typeclass being kept. The location of the typeclass\n module is searched from the default typeclass directory, as defined in the\n server settings.\n\n "}
    @@ -1582,7 +1583,7 @@ one is given.

    -aliases = ['locate', 'search']
    +aliases = ['search', 'locate']
    @@ -1613,7 +1614,7 @@ one is given.

    -search_index_entry = {'aliases': 'locate search', 'category': 'building', 'key': 'find', 'tags': '', 'text': '\n search the database for objects\n\n Usage:\n find[/switches] <name or dbref or *account> [= dbrefmin[-dbrefmax]]\n locate - this is a shorthand for using the /loc switch.\n\n Switches:\n room - only look for rooms (location=None)\n exit - only look for exits (destination!=None)\n char - only look for characters (BASE_CHARACTER_TYPECLASS)\n exact - only exact matches are returned.\n loc - display object location if exists and match has one result\n startswith - search for names starting with the string, rather than containing\n\n Searches the database for an object of a particular name or exact #dbref.\n Use *accountname to search for an account. The switches allows for\n limiting object matches to certain game entities. Dbrefmin and dbrefmax\n limits matches to within the given dbrefs range, or above/below if only\n one is given.\n '}
    +search_index_entry = {'aliases': 'search locate', 'category': 'building', 'key': 'find', 'tags': '', 'text': '\n search the database for objects\n\n Usage:\n find[/switches] <name or dbref or *account> [= dbrefmin[-dbrefmax]]\n locate - this is a shorthand for using the /loc switch.\n\n Switches:\n room - only look for rooms (location=None)\n exit - only look for exits (destination!=None)\n char - only look for characters (BASE_CHARACTER_TYPECLASS)\n exact - only exact matches are returned.\n loc - display object location if exists and match has one result\n startswith - search for names starting with the string, rather than containing\n\n Searches the database for an object of a particular name or exact #dbref.\n Use *accountname to search for an account. The switches allows for\n limiting object matches to certain game entities. Dbrefmin and dbrefmax\n limits matches to within the given dbrefs range, or above/below if only\n one is given.\n '}
    @@ -1991,6 +1992,7 @@ displays a list of available prototypes.

    +
    develop branch
    @@ -123,6 +124,7 @@ command method rather than caller.msg().

    +
    develop branch
    @@ -121,6 +122,7 @@ Account cmdset. Account commands remain available also to Characters.

    +
    develop branch
    @@ -118,6 +119,7 @@ +
    develop branch
    @@ -120,6 +121,7 @@ of the state instance in this module.

    +
    develop branch
    @@ -233,7 +234,7 @@ Use addcom/delcom to join and leave channels

    -aliases = ['all channels', 'comlist', 'chanlist', 'clist', 'channellist']
    +aliases = ['all channels', 'channellist', 'chanlist', 'clist', 'comlist']
    @@ -264,7 +265,7 @@ Use addcom/delcom to join and leave channels

    -search_index_entry = {'aliases': 'all channels comlist chanlist clist channellist', 'category': 'comms', 'key': 'channels', 'tags': '', 'text': "\n list all channels available to you\n\n Usage:\n channels\n clist\n comlist\n\n Lists all channels available to you, whether you listen to them or not.\n Use 'comlist' to only view your current channel subscriptions.\n Use addcom/delcom to join and leave channels\n "}
    +search_index_entry = {'aliases': 'all channels channellist chanlist clist comlist', 'category': 'comms', 'key': 'channels', 'tags': '', 'text': "\n list all channels available to you\n\n Usage:\n channels\n clist\n comlist\n\n Lists all channels available to you, whether you listen to them or not.\n Use 'comlist' to only view your current channel subscriptions.\n Use addcom/delcom to join and leave channels\n "}
    @@ -1067,6 +1068,7 @@ must be added to game settings.

    +
    develop branch
    @@ -204,7 +205,7 @@ for everyone to use, you need build privileges and the alias command.

    -aliases = ['nickname', 'nicks']
    +aliases = ['nicks', 'nickname']
    @@ -236,7 +237,7 @@ for everyone to use, you need build privileges and the alias command.

    -search_index_entry = {'aliases': 'nickname nicks', 'category': 'general', 'key': 'nick', 'tags': '', 'text': '\n define a personal alias/nick by defining a string to\n match and replace it with another on the fly\n\n Usage:\n nick[/switches] <string> [= [replacement_string]]\n nick[/switches] <template> = <replacement_template>\n nick/delete <string> or number\n nicks\n\n Switches:\n inputline - replace on the inputline (default)\n object - replace on object-lookup\n account - replace on account-lookup\n list - show all defined aliases (also "nicks" works)\n delete - remove nick by index in /list\n clearall - clear all nicks\n\n Examples:\n nick hi = say Hello, I\'m Sarah!\n nick/object tom = the tall man\n nick build $1 $2 = create/drop $1;$2\n nick tell $1 $2=page $1=$2\n nick tm?$1=page tallman=$1\n nick tm\\=$1=page tallman=$1\n\n A \'nick\' is a personal string replacement. Use $1, $2, ... to catch arguments.\n Put the last $-marker without an ending space to catch all remaining text. You\n can also use unix-glob matching for the left-hand side <string>:\n\n * - matches everything\n ? - matches 0 or 1 single characters\n [abcd] - matches these chars in any order\n [!abcd] - matches everything not among these chars\n \\= - escape literal \'=\' you want in your <string>\n\n Note that no objects are actually renamed or changed by this command - your nicks\n are only available to you. If you want to permanently add keywords to an object\n for everyone to use, you need build privileges and the alias command.\n\n '}
    +search_index_entry = {'aliases': 'nicks nickname', 'category': 'general', 'key': 'nick', 'tags': '', 'text': '\n define a personal alias/nick by defining a string to\n match and replace it with another on the fly\n\n Usage:\n nick[/switches] <string> [= [replacement_string]]\n nick[/switches] <template> = <replacement_template>\n nick/delete <string> or number\n nicks\n\n Switches:\n inputline - replace on the inputline (default)\n object - replace on object-lookup\n account - replace on account-lookup\n list - show all defined aliases (also "nicks" works)\n delete - remove nick by index in /list\n clearall - clear all nicks\n\n Examples:\n nick hi = say Hello, I\'m Sarah!\n nick/object tom = the tall man\n nick build $1 $2 = create/drop $1;$2\n nick tell $1 $2=page $1=$2\n nick tm?$1=page tallman=$1\n nick tm\\=$1=page tallman=$1\n\n A \'nick\' is a personal string replacement. Use $1, $2, ... to catch arguments.\n Put the last $-marker without an ending space to catch all remaining text. You\n can also use unix-glob matching for the left-hand side <string>:\n\n * - matches everything\n ? - matches 0 or 1 single characters\n [abcd] - matches these chars in any order\n [!abcd] - matches everything not among these chars\n \\= - escape literal \'=\' you want in your <string>\n\n Note that no objects are actually renamed or changed by this command - your nicks\n are only available to you. If you want to permanently add keywords to an object\n for everyone to use, you need build privileges and the alias command.\n\n '}
    @@ -259,7 +260,7 @@ inv

    -aliases = ['inv', 'i']
    +aliases = ['i', 'inv']
    @@ -290,7 +291,7 @@ inv

    -search_index_entry = {'aliases': 'inv i', 'category': 'general', 'key': 'inventory', 'tags': '', 'text': '\n view inventory\n\n Usage:\n inventory\n inv\n\n Shows your inventory.\n '}
    +search_index_entry = {'aliases': 'i inv', 'category': 'general', 'key': 'inventory', 'tags': '', 'text': '\n view inventory\n\n Usage:\n inventory\n inv\n\n Shows your inventory.\n '}
    @@ -640,7 +641,7 @@ automatically begin with your name.

    -aliases = ['emote', ':']
    +aliases = [':', 'emote']
    @@ -676,7 +677,7 @@ space.

    -search_index_entry = {'aliases': 'emote :', 'category': 'general', 'key': 'pose', 'tags': '', 'text': "\n strike a pose\n\n Usage:\n pose <pose text>\n pose's <pose text>\n\n Example:\n pose is standing by the wall, smiling.\n -> others will see:\n Tom is standing by the wall, smiling.\n\n Describe an action being taken. The pose text will\n automatically begin with your name.\n "}
    +search_index_entry = {'aliases': ': emote', 'category': 'general', 'key': 'pose', 'tags': '', 'text': "\n strike a pose\n\n Usage:\n pose <pose text>\n pose's <pose text>\n\n Example:\n pose is standing by the wall, smiling.\n -> others will see:\n Tom is standing by the wall, smiling.\n\n Describe an action being taken. The pose text will\n automatically begin with your name.\n "}
    @@ -699,7 +700,7 @@ which permission groups you are a member of.

    -aliases = ['groups', 'hierarchy']
    +aliases = ['hierarchy', 'groups']
    @@ -730,7 +731,7 @@ which permission groups you are a member of.

    -search_index_entry = {'aliases': 'groups hierarchy', 'category': 'general', 'key': 'access', 'tags': '', 'text': '\n show your current game access\n\n Usage:\n access\n\n This command shows you the permission hierarchy and\n which permission groups you are a member of.\n '}
    +search_index_entry = {'aliases': 'hierarchy groups', 'category': 'general', 'key': 'access', 'tags': '', 'text': '\n show your current game access\n\n Usage:\n access\n\n This command shows you the permission hierarchy and\n which permission groups you are a member of.\n '}
    @@ -786,6 +787,7 @@ which permission groups you are a member of.

    +
    develop branch
    @@ -324,6 +325,7 @@ is to let everyone read the help file.

    +
    develop branch
    @@ -110,6 +111,7 @@ +
    develop branch
    @@ -286,6 +287,7 @@ character is actually attached to this Account and Session.

    +
    develop branch
    @@ -361,6 +362,7 @@ the already formatted input.

    +
    develop branch
    @@ -373,7 +374,7 @@ given, <nr> defaults to 10.

    -aliases = ['listobjects', 'db', 'stats', 'listobjs']
    +aliases = ['db', 'listobjs', 'stats', 'listobjects']
    @@ -399,7 +400,7 @@ given, <nr> defaults to 10.

    -search_index_entry = {'aliases': 'listobjects db stats listobjs', 'category': 'system', 'key': 'objects', 'tags': '', 'text': '\n statistics on objects in the database\n\n Usage:\n objects [<nr>]\n\n Gives statictics on objects in database as well as\n a list of <nr> latest objects in database. If not\n given, <nr> defaults to 10.\n '}
    +search_index_entry = {'aliases': 'db listobjs stats listobjects', 'category': 'system', 'key': 'objects', 'tags': '', 'text': '\n statistics on objects in the database\n\n Usage:\n objects [<nr>]\n\n Gives statictics on objects in database as well as\n a list of <nr> latest objects in database. If not\n given, <nr> defaults to 10.\n '}
    @@ -687,6 +688,7 @@ the released memory will instead be re-used by the program.

    +
    develop branch
    @@ -712,6 +713,7 @@ set in self.parse())

    +
    develop branch
    @@ -117,7 +118,7 @@ create “account name” “pass word”

    -aliases = ['cr', 'cre']
    +aliases = ['cre', 'cr']
    @@ -148,7 +149,7 @@ create “account name” “pass word”

    -search_index_entry = {'aliases': 'cr cre', 'category': 'general', 'key': 'create', 'tags': '', 'text': '\n create a new account account\n\n Usage (at login screen):\n create <accountname> <password>\n create "account name" "pass word"\n\n This creates a new account account.\n\n If you have spaces in your name, enclose it in double quotes.\n '}
    +search_index_entry = {'aliases': 'cre cr', 'category': 'general', 'key': 'create', 'tags': '', 'text': '\n create a new account account\n\n Usage (at login screen):\n create <accountname> <password>\n create "account name" "pass word"\n\n This creates a new account account.\n\n If you have spaces in your name, enclose it in double quotes.\n '}
    @@ -271,7 +272,7 @@ for simplicity. It shows a pane of info.

    -aliases = ['?', 'h']
    +aliases = ['h', '?']
    @@ -297,7 +298,7 @@ for simplicity. It shows a pane of info.

    -search_index_entry = {'aliases': '? h', 'category': 'general', 'key': 'help', 'tags': '', 'text': '\n get help when in unconnected-in state\n\n Usage:\n help\n\n This is an unconnected version of the help command,\n for simplicity. It shows a pane of info.\n '}
    +search_index_entry = {'aliases': 'h ?', 'category': 'general', 'key': 'help', 'tags': '', 'text': '\n get help when in unconnected-in state\n\n Usage:\n help\n\n This is an unconnected version of the help command,\n for simplicity. It shows a pane of info.\n '}
    @@ -353,6 +354,7 @@ for simplicity. It shows a pane of info.

    +
    develop branch
    @@ -126,6 +127,7 @@ Evennia.

    +
    develop branch
    @@ -278,6 +279,7 @@ +
    develop branch
    @@ -314,6 +315,7 @@ or more channels.

    +
    develop branch
    @@ -782,6 +783,7 @@ responsibility.

    +
    develop branch
    @@ -101,6 +102,7 @@ as code related to external communication like IRC or RSS.

    +
    develop branch
    @@ -379,6 +380,7 @@ case sensitive) match.

    +
    develop branch
    @@ -731,6 +732,7 @@ object the first time, the query is executed.

    +
    develop branch
    @@ -552,6 +553,7 @@ so we just return that, else we have to localize and strip the tz

    +
    develop branch
    @@ -96,6 +97,7 @@ +
    develop branch
    @@ -306,6 +307,7 @@ +
    develop branch
    @@ -680,7 +681,7 @@ try to influence the other part in the deal.

    -aliases = ['deal', 'offers']
    +aliases = ['offers', 'deal']
    @@ -706,7 +707,7 @@ try to influence the other part in the deal.

    -search_index_entry = {'aliases': 'deal offers', 'category': 'trading', 'key': 'status', 'tags': '', 'text': "\n show a list of the current deal\n\n Usage:\n status\n deal\n offers\n\n Shows the currently suggested offers on each sides of the deal. To\n accept the current deal, use the 'accept' command. Use 'offer' to\n change your deal. You might also want to use 'say', 'emote' etc to\n try to influence the other part in the deal.\n "}
    +search_index_entry = {'aliases': 'offers deal', 'category': 'trading', 'key': 'status', 'tags': '', 'text': "\n show a list of the current deal\n\n Usage:\n status\n deal\n offers\n\n Shows the currently suggested offers on each sides of the deal. To\n accept the current deal, use the 'accept' command. Use 'offer' to\n change your deal. You might also want to use 'say', 'emote' etc to\n try to influence the other part in the deal.\n "}
    @@ -890,6 +891,7 @@ info to your choice.

    +
    develop branch
    @@ -928,6 +929,7 @@ set in self.parse())

    +
    develop branch
    @@ -232,6 +233,7 @@ attribute on ourselves to remember it.

    +
    develop branch
    @@ -627,7 +628,7 @@ inv

    -aliases = ['inv', 'i']
    +aliases = ['i', 'inv']
    @@ -658,7 +659,7 @@ inv

    -search_index_entry = {'aliases': 'inv i', 'category': 'general', 'key': 'inventory', 'tags': '', 'text': '\n view inventory\n\n Usage:\n inventory\n inv\n\n Shows your inventory.\n '}
    +search_index_entry = {'aliases': 'i inv', 'category': 'general', 'key': 'inventory', 'tags': '', 'text': '\n view inventory\n\n Usage:\n inventory\n inv\n\n Shows your inventory.\n '}
    @@ -740,6 +741,7 @@ items.

    +
    develop branch
    @@ -131,6 +132,7 @@ COLOR_ANSI_BRIGHT_BGS_EXTRA_MAP = color_markups.CURLY_COLOR_ANSI_BRIGHT_BGS_EXTR +
    develop branch
    @@ -318,6 +319,7 @@ The time is given in units as keyword arguments.

    +
    develop branch
    @@ -148,7 +149,7 @@ everyone but the person rolling.

    -aliases = ['@dice', 'roll']
    +aliases = ['roll', '@dice']
    @@ -174,7 +175,7 @@ everyone but the person rolling.

    -search_index_entry = {'aliases': '@dice roll', 'category': 'general', 'key': 'dice', 'tags': '', 'text': "\n roll dice\n\n Usage:\n dice[/switch] <nr>d<sides> [modifier] [success condition]\n\n Switch:\n hidden - tell the room the roll is being done, but don't show the result\n secret - don't inform the room about neither roll nor result\n\n Examples:\n dice 3d6 + 4\n dice 1d100 - 2 < 50\n\n This will roll the given number of dice with given sides and modifiers.\n So e.g. 2d6 + 3 means to 'roll a 6-sided die 2 times and add the result,\n then add 3 to the total'.\n Accepted modifiers are +, -, * and /.\n A success condition is given as normal Python conditionals\n (<,>,<=,>=,==,!=). So e.g. 2d6 + 3 > 10 means that the roll will succeed\n only if the final result is above 8. If a success condition is given, the\n outcome (pass/fail) will be echoed along with how much it succeeded/failed\n with. The hidden/secret switches will hide all or parts of the roll from\n everyone but the person rolling.\n "}
    +search_index_entry = {'aliases': 'roll @dice', 'category': 'general', 'key': 'dice', 'tags': '', 'text': "\n roll dice\n\n Usage:\n dice[/switch] <nr>d<sides> [modifier] [success condition]\n\n Switch:\n hidden - tell the room the roll is being done, but don't show the result\n secret - don't inform the room about neither roll nor result\n\n Examples:\n dice 3d6 + 4\n dice 1d100 - 2 < 50\n\n This will roll the given number of dice with given sides and modifiers.\n So e.g. 2d6 + 3 means to 'roll a 6-sided die 2 times and add the result,\n then add 3 to the total'.\n Accepted modifiers are +, -, * and /.\n A success condition is given as normal Python conditionals\n (<,>,<=,>=,==,!=). So e.g. 2d6 + 3 > 10 means that the roll will succeed\n only if the final result is above 8. If a success condition is given, the\n outcome (pass/fail) will be echoed along with how much it succeeded/failed\n with. The hidden/secret switches will hide all or parts of the roll from\n everyone but the person rolling.\n "}
    @@ -249,6 +250,7 @@ Add with @py self.cmdset.add(“contrib.dice.DiceCmdSet”)

    +
    develop branch
    @@ -125,7 +126,7 @@ there is no object yet before the account has logged in)

    -aliases = ['cr', 'cre']
    +aliases = ['cre', 'cr']
    @@ -161,7 +162,7 @@ name enclosed in quotes:

    -search_index_entry = {'aliases': 'cr cre', 'category': 'general', 'key': 'create', 'tags': '', 'text': '\n Create a new account.\n\n Usage (at login screen):\n create "accountname" <email> <password>\n\n This creates a new account account.\n\n '}
    +search_index_entry = {'aliases': 'cre cr', 'category': 'general', 'key': 'create', 'tags': '', 'text': '\n Create a new account.\n\n Usage (at login screen):\n create "accountname" <email> <password>\n\n This creates a new account account.\n\n '}
    @@ -269,7 +270,7 @@ for simplicity. It shows a pane of info.

    -aliases = ['?', 'h']
    +aliases = ['h', '?']
    @@ -295,7 +296,7 @@ for simplicity. It shows a pane of info.

    -search_index_entry = {'aliases': '? h', 'category': 'general', 'key': 'help', 'tags': '', 'text': '\n This is an unconnected version of the help command,\n for simplicity. It shows a pane of info.\n '}
    +search_index_entry = {'aliases': 'h ?', 'category': 'general', 'key': 'help', 'tags': '', 'text': '\n This is an unconnected version of the help command,\n for simplicity. It shows a pane of info.\n '}
    @@ -351,6 +352,7 @@ for simplicity. It shows a pane of info.

    +
    develop branch
    @@ -550,6 +551,7 @@ self.add().

    +
    develop branch
    @@ -449,6 +450,7 @@ send

    +
    develop branch
    @@ -228,6 +229,7 @@ All extra kwargs will be passed on to the protocol.

    +
    develop branch
    @@ -146,6 +147,7 @@ readers will be unable to read the graphical aspect of the bar.

    +
    develop branch
    @@ -193,6 +194,7 @@ useful but are deemed too game-specific to go into the core library.

    +
    develop branch
    @@ -324,6 +325,7 @@ the expected fields for a callback (code, author, valid…).

    +
    develop branch
    @@ -51,7 +52,7 @@
    -aliases = ['@calls', '@callbacks', '@callback']
    +aliases = ['@callbacks', '@callback', '@calls']
    @@ -132,7 +133,7 @@ on user permission.

    -search_index_entry = {'aliases': '@calls @callbacks @callback', 'category': 'building', 'key': '@call', 'tags': '', 'text': '\n Command to edit callbacks.\n '}
    +search_index_entry = {'aliases': '@callbacks @callback @calls', 'category': 'building', 'key': '@call', 'tags': '', 'text': '\n Command to edit callbacks.\n '}
    @@ -188,6 +189,7 @@ on user permission.

    +
    develop branch
    @@ -156,6 +157,7 @@ to be called from inside another event.

    +
    develop branch
    @@ -100,6 +101,7 @@ +
    develop branch
    @@ -445,6 +446,7 @@ restart only twice.

    +
    develop branch
    @@ -231,6 +232,7 @@ +
    develop branch
    @@ -482,6 +483,7 @@ deletion is aborted.

    +
    develop branch
    @@ -209,6 +210,7 @@ either “yes” or “okay” (maybe ‘say I don’t like it, but okay’).

    Evennia 1.0-dev » +
    develop branch
    @@ -348,6 +349,7 @@ reply - Replies to a received message, appending the original message to the b +
    develop branch
    @@ -290,6 +291,7 @@ how many times the map is iterated over.

    +
    develop branch
    @@ -199,6 +200,7 @@ to the menu’s own look command.

    +
    develop branch
    @@ -173,6 +174,7 @@ description in use and db.multidesc to store all descriptions.< +
    develop branch
    @@ -554,6 +555,7 @@ self.add().

    +
    develop branch
    @@ -304,6 +305,7 @@ calling the get method.

    +
    develop branch
    @@ -384,6 +385,7 @@ means fully obscured.

    +
    develop branch
    @@ -1293,6 +1294,7 @@ the evennia.contrib.rplanguage module.

    +
    develop branch
    @@ -96,6 +97,7 @@ +
    develop branch
    @@ -131,6 +132,7 @@ compromised or taken down, losing your logs along with it is no help!).

    +
    develop branch
    @@ -170,6 +171,7 @@ writing to log. Recording cleartext password attempts is bad policy.

    +
    develop branch
    @@ -110,6 +111,7 @@ parsed from the Session object.

    +
    develop branch
    @@ -99,6 +100,7 @@ +
    develop branch
    @@ -285,6 +286,7 @@ close <door>

    +
    develop branch
    @@ -235,6 +236,7 @@ stored deferred from the exit traversal above.

    +
    develop branch
    @@ -237,6 +238,7 @@ the conversation defined above.

    +
    develop branch
    @@ -487,6 +488,7 @@ +
    develop branch
    @@ -909,6 +910,7 @@ returned.

    +
    develop branch
    @@ -444,6 +445,7 @@ to determine the color the player chose.

    +
    develop branch
    @@ -98,6 +99,7 @@ +
    develop branch
    @@ -804,6 +805,7 @@ topics related to the game.

    +
    develop branch
    @@ -1103,6 +1104,7 @@ You can’t use this command in combat.

    +
    develop branch
    @@ -1083,6 +1084,7 @@ items using the same function work differently.

    +
    develop branch
    @@ -1032,6 +1033,7 @@ instead of creating objects directly.

    +
    develop branch
    @@ -1298,6 +1299,7 @@ topics related to the game.

    +
    develop branch
    @@ -144,6 +145,7 @@ a random check here so as to only return 33% of the time.

    +
    develop branch
    @@ -109,7 +110,7 @@ push the lid of the button away.

    -aliases = ['push', 'press button', 'press']
    +aliases = ['press button', 'press', 'push']
    @@ -140,7 +141,7 @@ lid-state respectively.

    -search_index_entry = {'aliases': 'push press button press', 'category': 'general', 'key': 'push button', 'tags': '', 'text': '\n Push the red button\n\n Usage:\n push button\n\n '}
    +search_index_entry = {'aliases': 'press button press push', 'category': 'general', 'key': 'push button', 'tags': '', 'text': '\n Push the red button\n\n Usage:\n push button\n\n '}
    @@ -162,7 +163,7 @@ lid-state respectively.

    -aliases = ['smash', 'smash lid', 'break lid']
    +aliases = ['smash lid', 'break lid', 'smash']
    @@ -189,7 +190,7 @@ of causing the lamp to break.

    -search_index_entry = {'aliases': 'smash smash lid break lid', 'category': 'general', 'key': 'smash glass', 'tags': '', 'text': '\n smash glass\n\n Usage:\n smash glass\n\n Try to smash the glass of the button.\n '}
    +search_index_entry = {'aliases': 'smash lid break lid smash', 'category': 'general', 'key': 'smash glass', 'tags': '', 'text': '\n smash glass\n\n Usage:\n smash glass\n\n Try to smash the glass of the button.\n '}
    @@ -210,7 +211,7 @@ of causing the lamp to break.

    -aliases = ['open', 'open button']
    +aliases = ['open button', 'open']
    @@ -236,7 +237,7 @@ of causing the lamp to break.

    -search_index_entry = {'aliases': 'open open button', 'category': 'general', 'key': 'open lid', 'tags': '', 'text': '\n open lid\n\n Usage:\n open lid\n\n '}
    +search_index_entry = {'aliases': 'open button open', 'category': 'general', 'key': 'open lid', 'tags': '', 'text': '\n open lid\n\n Usage:\n open lid\n\n '}
    @@ -306,7 +307,7 @@ of causing the lamp to break.

    -aliases = ['examine', 'get', 'feel', 'l', 'ex', 'listen']
    +aliases = ['get', 'ex', 'feel', 'listen', 'examine', 'l']
    @@ -332,7 +333,7 @@ of causing the lamp to break.

    -search_index_entry = {'aliases': 'examine get feel l ex listen', 'category': 'general', 'key': 'look', 'tags': '', 'text': "\n Looking around in darkness\n\n Usage:\n look <obj>\n\n ... not that there's much to see in the dark.\n\n "}
    +search_index_entry = {'aliases': 'get ex feel listen examine l', 'category': 'general', 'key': 'look', 'tags': '', 'text': "\n Looking around in darkness\n\n Usage:\n look <obj>\n\n ... not that there's much to see in the dark.\n\n "}
    @@ -567,6 +568,7 @@ the button is pushed.

    +
    develop branch
    @@ -100,6 +101,7 @@ +
    develop branch
    @@ -160,6 +161,7 @@ on all entities in it.

    +
    develop branch
    @@ -188,6 +189,7 @@ to how often the message is echoed.

    +
    develop branch
    @@ -433,6 +434,7 @@ called directly, regardless of the value of self.start_delay +
    develop branch
    @@ -125,6 +126,7 @@ +
    develop branch
    @@ -98,6 +99,7 @@ +
    develop branch
    @@ -280,6 +281,7 @@ option related to this node.

    +
    develop branch
    @@ -329,6 +330,7 @@ right away, also when patrolling on a very slow ticker.

    +
    develop branch
    @@ -360,7 +361,7 @@ of the object. We overload it with our own version.

    -aliases = ['burn', 'light']
    +aliases = ['light', 'burn']
    @@ -387,7 +388,7 @@ to sit on a “lightable” object, we operate only on self.obj.

    -search_index_entry = {'aliases': 'burn light', 'category': 'tutorialworld', 'key': 'on', 'tags': '', 'text': '\n Creates light where there was none. Something to burn.\n '}
    +search_index_entry = {'aliases': 'light burn', 'category': 'tutorialworld', 'key': 'on', 'tags': '', 'text': '\n Creates light where there was none. Something to burn.\n '}
    @@ -491,7 +492,7 @@ shift green root up/down

    -aliases = ['push', 'shiftroot', 'pull', 'move']
    +aliases = ['move', 'push', 'pull', 'shiftroot']
    @@ -527,7 +528,7 @@ yellow/green - horizontal roots

    -search_index_entry = {'aliases': 'push shiftroot pull move', 'category': 'tutorialworld', 'key': 'shift', 'tags': '', 'text': '\n Shifts roots around.\n\n Usage:\n shift blue root left/right\n shift red root left/right\n shift yellow root up/down\n shift green root up/down\n\n '}
    +search_index_entry = {'aliases': 'move push pull shiftroot', 'category': 'tutorialworld', 'key': 'shift', 'tags': '', 'text': '\n Shifts roots around.\n\n Usage:\n shift blue root left/right\n shift red root left/right\n shift yellow root up/down\n shift green root up/down\n\n '}
    @@ -544,7 +545,7 @@ yellow/green - horizontal roots

    -aliases = ['push button', 'press button', 'button']
    +aliases = ['press button', 'push button', 'button']
    @@ -570,7 +571,7 @@ yellow/green - horizontal roots

    -search_index_entry = {'aliases': 'push button press button button', 'category': 'tutorialworld', 'key': 'press', 'tags': '', 'text': '\n Presses a button.\n '}
    +search_index_entry = {'aliases': 'press button push button button', 'category': 'tutorialworld', 'key': 'press', 'tags': '', 'text': '\n Presses a button.\n '}
    @@ -714,7 +715,7 @@ parry - forgoes your attack but will make you harder to hit on next

    -aliases = ['kill', 'thrust', 'chop', 'hit', 'fight', 'bash', 'pierce', 'stab', 'slash', 'parry', 'defend']
    +aliases = ['chop', 'bash', 'slash', 'fight', 'defend', 'kill', 'thrust', 'pierce', 'parry', 'stab', 'hit']
    @@ -740,7 +741,7 @@ parry - forgoes your attack but will make you harder to hit on next

    -search_index_entry = {'aliases': 'kill thrust chop hit fight bash pierce stab slash parry defend', 'category': 'tutorialworld', 'key': 'attack', 'tags': '', 'text': '\n Attack the enemy. Commands:\n\n stab <enemy>\n slash <enemy>\n parry\n\n stab - (thrust) makes a lot of damage but is harder to hit with.\n slash - is easier to land, but does not make as much damage.\n parry - forgoes your attack but will make you harder to hit on next\n enemy attack.\n\n '}
    +search_index_entry = {'aliases': 'chop bash slash fight defend kill thrust pierce parry stab hit', 'category': 'tutorialworld', 'key': 'attack', 'tags': '', 'text': '\n Attack the enemy. Commands:\n\n stab <enemy>\n slash <enemy>\n parry\n\n stab - (thrust) makes a lot of damage but is harder to hit with.\n slash - is easier to land, but does not make as much damage.\n parry - forgoes your attack but will make you harder to hit on next\n enemy attack.\n\n '}
    @@ -995,6 +996,7 @@ pulling weapons from it indefinitely.

    +
    develop branch
    @@ -712,7 +713,7 @@ if they fall off the bridge.

    -aliases = ['?', 'h']
    +aliases = ['h', '?']
    @@ -738,7 +739,7 @@ if they fall off the bridge.

    -search_index_entry = {'aliases': '? h', 'category': 'tutorial world', 'key': 'help', 'tags': '', 'text': '\n Overwritten help command while on the bridge.\n '}
    +search_index_entry = {'aliases': 'h ?', 'category': 'tutorial world', 'key': 'help', 'tags': '', 'text': '\n Overwritten help command while on the bridge.\n '}
    @@ -864,7 +865,7 @@ to find something.

    -aliases = ['search', 'feel around', 'feel', 'l', 'fiddle']
    +aliases = ['feel', 'fiddle', 'feel around', 'l', 'search']
    @@ -892,7 +893,7 @@ random chance of eventually finding a light source.

    -search_index_entry = {'aliases': 'search feel around feel l fiddle', 'category': 'tutorialworld', 'key': 'look', 'tags': '', 'text': '\n Look around in darkness\n\n Usage:\n look\n\n Look around in the darkness, trying\n to find something.\n '}
    +search_index_entry = {'aliases': 'feel fiddle feel around l search', 'category': 'tutorialworld', 'key': 'look', 'tags': '', 'text': '\n Look around in darkness\n\n Usage:\n look\n\n Look around in the darkness, trying\n to find something.\n '}
    @@ -1262,6 +1263,7 @@ overriding the call (unused by default).

    +
    develop branch
    @@ -375,6 +376,7 @@ use its add_argument method.

    +
    develop branch
    @@ -716,6 +717,7 @@ coordinate.

    +
    develop branch
    @@ -215,6 +216,7 @@ +
    develop branch
    @@ -100,6 +101,7 @@ itself.

    +
    develop branch
    @@ -227,6 +228,7 @@ up in one easily separated category.

    +
    develop branch
    @@ -395,6 +396,7 @@ object the first time, the query is executed.

    +
    develop branch
    @@ -393,7 +394,10 @@ with ‘q’, remove the break line and restart server when finished.

  • evennia.utils
  • @@ -101,6 +102,7 @@ also contains the default lock functions used in lock definitions.

    +
    develop branch
    @@ -553,6 +554,7 @@ unpacked to their real value. We only support basic properties.

    +
    develop branch
    @@ -461,6 +462,7 @@ among the locks defined by lockstring.

    +
    develop branch
    @@ -348,6 +349,7 @@ +
    develop branch
    @@ -99,6 +100,7 @@ objects inherit from classes in this package.

    +
    develop branch
    @@ -96,6 +97,7 @@ +
    develop branch
    @@ -577,6 +578,7 @@ class built by **create_forward_many_to_many_manager()** define +
    develop branch
    @@ -329,7 +330,8 @@ the keyword attribute_name specifies otherwise.
    • me,self: self-reference to this object

    • -
      <num>-<string> - can be used to differentiate

      between multiple same-named matches

      +
      <num>-<string> - can be used to differentiate

      between multiple same-named matches. The exact form of this input +is given by settings.SEARCH_MULTIMATCH_REGEX.

    • @@ -1990,6 +1992,7 @@ read for an error string instead.

    +
    develop branch
    @@ -97,6 +98,7 @@ +
    develop branch
    @@ -202,6 +203,7 @@ prototype rather than creating a new one.

    +
    develop branch
    @@ -271,6 +272,7 @@ Validate that a #dbref input is valid.

    +
    develop branch
    @@ -76,6 +77,13 @@ the default reserved keys.

    +
    +
    +evennia.prototypes.prototypes.load_module_prototypes()[source]
    +

    This is called by evennia.__init__ as Evennia initializes. It’s important +to do this late so as to not interfere with evennia initialization.

    +
    +
    class evennia.prototypes.prototypes.DbPrototype(*args, **kwargs)[source]
    @@ -498,6 +506,7 @@ validator (callable, optional): If given, this will be called with the value to< +
    develop branch
    @@ -523,6 +524,7 @@ custom prototype_parents are given to this function.

    +
    develop branch
    @@ -213,6 +214,7 @@ +
    develop branch
    @@ -105,6 +106,7 @@ timed effects.

    +
    develop branch
    @@ -96,6 +97,7 @@ +
    develop branch
    @@ -387,6 +388,7 @@ class built by **create_forward_many_to_many_manager()** define +
    develop branch
    @@ -91,7 +92,7 @@ non-persistent tickers must be killed.

    at_update(obj, fieldname)[source]
    -

    Called by the field as it saves.

    +

    Called by the field/attribute as it saves.

    @@ -205,6 +206,7 @@ all kwargs must be possible to pickle!

    +
    develop branch
    @@ -209,6 +210,7 @@ be called regularly to crank the wheels.

    +
    develop branch
    @@ -440,6 +441,7 @@ to do it.

    +
    develop branch
    @@ -188,6 +189,7 @@ in the TaskHandler.

    +
    develop branch
    @@ -433,6 +434,7 @@ non-db objects.

    +
    develop branch
    @@ -136,6 +137,7 @@ +
    develop branch
    @@ -271,6 +272,7 @@ operation, as defined by the global variables in +
    develop branch
    @@ -210,6 +211,7 @@ fails (and is expected to echo why if so).

    +
    develop branch
    @@ -114,6 +115,7 @@ does not stop launch.

    +
    develop branch
    @@ -588,6 +589,7 @@ settings here. The result will be printed to the terminal.

    +
    develop branch
    @@ -200,6 +201,7 @@ to this Protocol. The connection has been closed.

    +
    develop branch
    @@ -95,6 +96,7 @@ +
    develop branch
    @@ -119,6 +120,7 @@ to the Evennia Game Index.

    +
    develop branch
    @@ -157,6 +158,7 @@ to connect to the game.

    +
    develop branch
    @@ -149,6 +150,7 @@ steps need to be redone.

    +
    develop branch
    @@ -388,6 +389,7 @@ logging a missing inputfunc for it.

    +
    develop branch
    @@ -127,6 +128,7 @@ value (str): If key was given, this is the stored value, or

    +
    develop branch
    @@ -181,6 +182,7 @@ object the first time, the query is executed.

    +
    develop branch
    @@ -564,6 +565,7 @@ function call

    +
    develop branch
    @@ -312,6 +313,7 @@ global variables in evennia/server/amp.py.

    +
    develop branch
    @@ -309,6 +310,7 @@ disconnect this protocol.

    +
    develop branch
    @@ -114,6 +115,7 @@ +
    develop branch
    @@ -425,6 +426,7 @@ sessions.

    +
    develop branch
    @@ -159,6 +160,7 @@ creating a zlib compression stream.

    +
    develop branch
    @@ -160,6 +161,7 @@ operation.

    +
    develop branch
    @@ -152,6 +153,7 @@ that supports it (mudlet, zmud, mushclient are a few)

    +
    develop branch
    @@ -148,6 +149,7 @@ operation.

    +
    develop branch
    @@ -147,6 +148,7 @@ case it always needs to be restarted manually.

    +
    develop branch
    @@ -348,6 +349,7 @@ method exixts, it sends the data to a method send_default.

    +
    develop branch
    @@ -189,6 +190,7 @@ on slow connections.

    +
    develop branch
    @@ -410,6 +411,7 @@ do not exist, the keypair is created.

    +
    develop branch
    @@ -130,6 +131,7 @@ server-side.

    +
    develop branch
    @@ -138,6 +139,7 @@ protocol to set it up.

    +
    develop branch
    @@ -331,6 +332,7 @@ Note that it must be actively turned back on again!

    +
    develop branch
    @@ -301,6 +302,7 @@ We assume the structure is valid JSON.

    +
    develop branch
    @@ -141,6 +142,7 @@ server-side.

    +
    develop branch
    @@ -197,6 +198,7 @@ its inverse gives the correct string.

    +
    develop branch
    @@ -147,6 +148,7 @@ stored on protocol.protocol_flags under the TTYPE key.

    +
    develop branch
    @@ -264,6 +265,7 @@ client instead.

    +
    develop branch
    @@ -389,6 +390,7 @@ client instead.

    +
    develop branch
    @@ -256,6 +257,7 @@ all “intelligence” of the dummy client.

    +
    develop branch
    @@ -220,6 +221,7 @@ commands (such as creating an account and logging in).

    +
    develop branch
    @@ -100,6 +101,7 @@ +
    develop branch
    @@ -134,6 +135,7 @@ the script will append to this file if it already exists.

    +
    develop branch
    @@ -96,6 +97,7 @@ servers!

    +
    develop branch
    @@ -98,6 +99,7 @@ to setup the environment to test.

    +
    develop branch
    @@ -192,6 +193,7 @@ +
    develop branch
    @@ -107,6 +108,7 @@ This message will get attached time stamp.

    +
    develop branch
    @@ -226,6 +227,7 @@ shutdown or a reset.

    +
    develop branch
    @@ -397,6 +398,7 @@ property, e.g. obj.ndb.attr = value etc.

    +
    develop branch
    @@ -202,6 +203,7 @@ should overload this to format/handle the outgoing data as needed.

    +
    develop branch
    @@ -613,6 +614,7 @@ on the form commandname=((args), {kwargs}).

    +
    develop branch
    @@ -103,6 +104,7 @@ without necessitating a full takeover of hooks that may be in high demand.

    +
    develop branch
    @@ -47,8 +48,8 @@ particular threshold.

    This version of the throttle is usable by both the terminal server as well as the web server, imposes limits on memory consumption by using deques -with length limits instead of open-ended lists, and removes sparse keys when -no recent failures have been recorded.

    +with length limits instead of open-ended lists, and uses native Django +caches for automatic key eviction and persistence configurability.

    error_msg = 'Too many failed attempts; you must wait a few minutes before trying again.'
    @@ -61,6 +62,7 @@ no recent failures have been recorded.

    Keyword Arguments
      +
    • name (str) – Name of this throttle.

    • limit (int) – Max number of failures before imposing limiter

    • timeout (int) – number of timeout seconds after max number of tries has been reached.

    • @@ -72,6 +74,25 @@ the throttle is imposed!

    +
    +
    +get_cache_key(*args, **kwargs)[source]
    +

    Creates a ‘prefixed’ key containing arbitrary terms to prevent key +collisions in the same namespace.

    +
    + +
    +
    +touch(key, *args, **kwargs)[source]
    +

    Refreshes the timeout on a given key and ensures it is recorded in the +key register.

    +
    +
    Parameters
    +

    key (str) – Key of entry to renew.

    +
    +
    +
    +
    get(ip=None)[source]
    @@ -112,6 +133,41 @@ of throttle.

    +
    +
    +remove(ip, *args, **kwargs)[source]
    +

    Clears data stored for an IP from the throttle.

    +
    +
    Parameters
    +

    ip (str) – IP to clear.

    +
    +
    +
    + +
    +
    +record_ip(ip, *args, **kwargs)[source]
    +

    Tracks keys as they are added to the cache (since there is no way to +get a list of keys after-the-fact).

    +
    +
    Parameters
    +

    ip (str) – IP being added to cache. This should be the original +IP, not the cache-prefixed key.

    +
    +
    +
    + +
    +
    +unrecord_ip(ip, *args, **kwargs)[source]
    +

    Forces removal of a key from the key registry.

    +
    +
    Parameters
    +

    ip (str) – IP to remove from list of keys.

    +
    +
    +
    +
    check(ip)[source]
    @@ -186,6 +242,7 @@ fails recently.

    +
    develop branch
    @@ -151,6 +152,7 @@ by this validator.

    +
    develop branch
    @@ -309,6 +310,7 @@ directory this path represents.

    +
    develop branch
    @@ -97,6 +98,7 @@ always be sure of what you have changed and what is default behaviour.

    +
    develop branch
    @@ -380,6 +381,7 @@ people used the admin at the same time

    +
    develop branch
    @@ -1410,6 +1411,7 @@ with nicks stored on the Account level.

    +
    develop branch
    @@ -104,6 +105,7 @@ Attribute and Tag models are defined along with their handlers.

    +
    develop branch
    @@ -496,6 +497,7 @@ Mutually exclusive to include_children.

    +
    develop branch
    @@ -758,6 +759,7 @@ developer’s responsibility.

    +
    develop branch
    @@ -468,6 +469,7 @@ of a latter tuple with the same category).

    +
    develop branch
    @@ -39,16 +40,57 @@

    evennia.utils.ansi

    ANSI - Gives colour to text.

    -

    Use the codes defined in ANSIPARSER in your text -to apply colour to text according to the ANSI standard.

    -

    Examples:

    +

    Use the codes defined in the ANSIParser class to apply colour to text. The +parse_ansi function in this module parses text for markup and strip_ansi +removes it.

    +

    You should usually not need to call parse_ansi explicitly; it is run by +Evennia just before returning data to/from the user. Alternative markup is +possible by overriding the parser class (see also contrib/ for deprecated +markup schemes).

    +

    Supported standards:

    +
      +
    • ANSI 8 bright and 8 dark fg (foreground) colors

    • +
    • ANSI 8 dark bg (background) colors

    • +
    • ‘ANSI’ 8 bright bg colors ‘faked’ with xterm256 (bright bg not included in ANSI standard)

    • +
    • Xterm256 - 255 fg/bg colors + 26 greyscale fg/bg colors

    • +
    +
    +

    Markup

    +

    ANSI colors: r ed, g reen, y ellow, b lue, m agenta, c yan, n ormal (no color). Capital +letters indicate the ‘dark’ variant.

    +
      +
    • |r fg bright red

    • +
    • |R fg dark red

    • +
    • |[r bg bright red

    • +
    • |[R bg dark red

    • +
    • |[R|g bg dark red, fg bright green

    • +
    "This is |rRed text|n and this is normal again."
     
    -

    Mostly you should not need to call parse_ansi() explicitly; -it is run by Evennia just before returning data to/from the -user. Depreciated example forms are available by extending -the ansi mapping.

    +

    Xterm256 colors are given as RGB (Red-Green-Blue), with values 0-5:

    +
      +
    • |500 fg bright red

    • +
    • |050 fg bright green

    • +
    • |005 fg bright blue

    • +
    • |110 fg dark brown

    • +
    • |425 fg pink

    • +
    • |[431 bg orange

    • +
    +

    Xterm256 greyscale:

    +
      +
    • |=a fg black

    • +
    • |=g fg dark grey

    • +
    • |=o fg middle grey

    • +
    • |=v fg bright grey

    • +
    • |=z fg white

    • +
    • |[=r bg middle grey

    • +
    +
    "This is |500Red text|n and this is normal again."
    +"This is |[=jText on dark grey background"
    +
    +
    +
    class evennia.utils.ansi.ANSIParser[source]
    @@ -56,11 +98,10 @@ the ansi mapping.

    A class that parses ANSI markup to ANSI command sequences

    We also allow to escape colour codes -by prepending with a for xterm256, -an extra | for Merc-style codes

    +by prepending with an extra |.

    -ansi_map = [('|n', '\x1b[0m'), ('|/', '\r\n'), ('|-', '\t'), ('|_', ' '), ('|*', '\x1b[7m'), ('|^', '\x1b[5m'), ('|u', '\x1b[4m'), ('|r', '\x1b[1m\x1b[31m'), ('|g', '\x1b[1m\x1b[32m'), ('|y', '\x1b[1m\x1b[33m'), ('|b', '\x1b[1m\x1b[34m'), ('|m', '\x1b[1m\x1b[35m'), ('|c', '\x1b[1m\x1b[36m'), ('|w', '\x1b[1m\x1b[37m'), ('|x', '\x1b[1m\x1b[30m'), ('|R', '\x1b[22m\x1b[31m'), ('|G', '\x1b[22m\x1b[32m'), ('|Y', '\x1b[22m\x1b[33m'), ('|B', '\x1b[22m\x1b[34m'), ('|M', '\x1b[22m\x1b[35m'), ('|C', '\x1b[22m\x1b[36m'), ('|W', '\x1b[22m\x1b[37m'), ('|X', '\x1b[22m\x1b[30m'), ('|h', '\x1b[1m'), ('|H', '\x1b[22m'), ('|!R', '\x1b[31m'), ('|!G', '\x1b[32m'), ('|!Y', '\x1b[33m'), ('|!B', '\x1b[34m'), ('|!M', '\x1b[35m'), ('|!C', '\x1b[36m'), ('|!W', '\x1b[37m'), ('|!X', '\x1b[30m'), ('|[R', '\x1b[41m'), ('|[G', '\x1b[42m'), ('|[Y', '\x1b[43m'), ('|[B', '\x1b[44m'), ('|[M', '\x1b[45m'), ('|[C', '\x1b[46m'), ('|[W', '\x1b[47m'), ('|[X', '\x1b[40m')]
    +ansi_map = [('|n', '\x1b[0m'), ('|/', '\r\n'), ('|-', '\t'), ('|>', ' '), ('|_', ' '), ('|*', '\x1b[7m'), ('|^', '\x1b[5m'), ('|u', '\x1b[4m'), ('|r', '\x1b[1m\x1b[31m'), ('|g', '\x1b[1m\x1b[32m'), ('|y', '\x1b[1m\x1b[33m'), ('|b', '\x1b[1m\x1b[34m'), ('|m', '\x1b[1m\x1b[35m'), ('|c', '\x1b[1m\x1b[36m'), ('|w', '\x1b[1m\x1b[37m'), ('|x', '\x1b[1m\x1b[30m'), ('|R', '\x1b[22m\x1b[31m'), ('|G', '\x1b[22m\x1b[32m'), ('|Y', '\x1b[22m\x1b[33m'), ('|B', '\x1b[22m\x1b[34m'), ('|M', '\x1b[22m\x1b[35m'), ('|C', '\x1b[22m\x1b[36m'), ('|W', '\x1b[22m\x1b[37m'), ('|X', '\x1b[22m\x1b[30m'), ('|h', '\x1b[1m'), ('|H', '\x1b[22m'), ('|!R', '\x1b[31m'), ('|!G', '\x1b[32m'), ('|!Y', '\x1b[33m'), ('|!B', '\x1b[34m'), ('|!M', '\x1b[35m'), ('|!C', '\x1b[36m'), ('|!W', '\x1b[37m'), ('|!X', '\x1b[30m'), ('|[R', '\x1b[41m'), ('|[G', '\x1b[42m'), ('|[Y', '\x1b[43m'), ('|[B', '\x1b[44m'), ('|[M', '\x1b[45m'), ('|[C', '\x1b[46m'), ('|[W', '\x1b[47m'), ('|[X', '\x1b[40m')]
    @@ -120,7 +161,7 @@ an extra | for Merc-style codes

    -ansi_sub = re.compile('\\|n|\\|/|\\|\\-|\\|_|\\|\\*|\\|\\^|\\|u|\\|r|\\|g|\\|y|\\|b|\\|m|\\|c|\\|w|\\|x|\\|R|\\|G|\\|Y|\\|B|\\|M|\\|C|\\|W|\\|X|\\|h|\\|H|\\|!R|\\|!G|\\|!Y|\\|!B|\\|!M|\\|!C|\\|!W|\\|!X|\\|\\[R|\\|\\[G|\\|\, re.DOTALL)
    +ansi_sub = re.compile('\\|n|\\|/|\\|\\-|\\|>|\\|_|\\|\\*|\\|\\^|\\|u|\\|r|\\|g|\\|y|\\|b|\\|m|\\|c|\\|w|\\|x|\\|R|\\|G|\\|Y|\\|B|\\|M|\\|C|\\|W|\\|X|\\|h|\\|H|\\|!R|\\|!G|\\|!Y|\\|!B|\\|!M|\\|!C|\\|!W|\\|!X|\\|\\[R|\\|\\[G, re.DOTALL)
    @@ -130,7 +171,7 @@ an extra | for Merc-style codes

    -ansi_map_dict = {'|!B': '\x1b[34m', '|!C': '\x1b[36m', '|!G': '\x1b[32m', '|!M': '\x1b[35m', '|!R': '\x1b[31m', '|!W': '\x1b[37m', '|!X': '\x1b[30m', '|!Y': '\x1b[33m', '|*': '\x1b[7m', '|-': '\t', '|/': '\r\n', '|B': '\x1b[22m\x1b[34m', '|C': '\x1b[22m\x1b[36m', '|G': '\x1b[22m\x1b[32m', '|H': '\x1b[22m', '|M': '\x1b[22m\x1b[35m', '|R': '\x1b[22m\x1b[31m', '|W': '\x1b[22m\x1b[37m', '|X': '\x1b[22m\x1b[30m', '|Y': '\x1b[22m\x1b[33m', '|[B': '\x1b[44m', '|[C': '\x1b[46m', '|[G': '\x1b[42m', '|[M': '\x1b[45m', '|[R': '\x1b[41m', '|[W': '\x1b[47m', '|[X': '\x1b[40m', '|[Y': '\x1b[43m', '|^': '\x1b[5m', '|_': ' ', '|b': '\x1b[1m\x1b[34m', '|c': '\x1b[1m\x1b[36m', '|g': '\x1b[1m\x1b[32m', '|h': '\x1b[1m', '|m': '\x1b[1m\x1b[35m', '|n': '\x1b[0m', '|r': '\x1b[1m\x1b[31m', '|u': '\x1b[4m', '|w': '\x1b[1m\x1b[37m', '|x': '\x1b[1m\x1b[30m', '|y': '\x1b[1m\x1b[33m'}
    +ansi_map_dict = {'|!B': '\x1b[34m', '|!C': '\x1b[36m', '|!G': '\x1b[32m', '|!M': '\x1b[35m', '|!R': '\x1b[31m', '|!W': '\x1b[37m', '|!X': '\x1b[30m', '|!Y': '\x1b[33m', '|*': '\x1b[7m', '|-': '\t', '|/': '\r\n', '|>': ' ', '|B': '\x1b[22m\x1b[34m', '|C': '\x1b[22m\x1b[36m', '|G': '\x1b[22m\x1b[32m', '|H': '\x1b[22m', '|M': '\x1b[22m\x1b[35m', '|R': '\x1b[22m\x1b[31m', '|W': '\x1b[22m\x1b[37m', '|X': '\x1b[22m\x1b[30m', '|Y': '\x1b[22m\x1b[33m', '|[B': '\x1b[44m', '|[C': '\x1b[46m', '|[G': '\x1b[42m', '|[M': '\x1b[45m', '|[R': '\x1b[41m', '|[W': '\x1b[47m', '|[X': '\x1b[40m', '|[Y': '\x1b[43m', '|^': '\x1b[5m', '|_': ' ', '|b': '\x1b[1m\x1b[34m', '|c': '\x1b[1m\x1b[36m', '|g': '\x1b[1m\x1b[32m', '|h': '\x1b[1m', '|m': '\x1b[1m\x1b[35m', '|n': '\x1b[0m', '|r': '\x1b[1m\x1b[31m', '|u': '\x1b[4m', '|w': '\x1b[1m\x1b[37m', '|x': '\x1b[1m\x1b[30m', '|y': '\x1b[1m\x1b[33m'}
    @@ -845,6 +886,7 @@ with.

    +
    @@ -867,6 +909,14 @@ with.

    +

    Table of Contents

    + +
    +
    develop branch
    @@ -401,6 +402,7 @@ namespace.

    +
    develop branch
    @@ -236,6 +237,7 @@ scripts defined in settings.

    +
    develop branch
    @@ -306,6 +307,7 @@ operations and is thus not suitable for play-testing the game.

    +
    develop branch
    @@ -171,6 +172,7 @@ _SaverList, _SaverDict and _SaverSet counterparts.

    +
    develop branch
    @@ -273,7 +274,7 @@ indentation.

    -aliases = [':dw', ':::', ':UU', ':r', ':<', ':w', ':x', ':u', ':p', ':fd', ':wq', ':y', ':>', ':A', ':DD', ':', ':i', ':h', ':dd', ':j', ':=', ':I', ':q!', ':q', ':s', ':echo', ':uu', ':S', ':fi', ':f', ':!', '::']
    +aliases = [':dw', ':p', ':r', ':q!', ':DD', ':i', ':echo', ':<', ':>', ':fd', ':wq', ':j', '::', ':!', ':A', ':S', ':fi', ':UU', ':f', ':q', ':s', ':uu', ':y', ':I', ':::', ':u', ':x', ':h', ':=', ':dd', ':w', ':']
    @@ -301,7 +302,7 @@ efficient presentation.

    -search_index_entry = {'aliases': ':dw ::: :UU :r :< :w :x :u :p :fd :wq :y :> :A :DD : :i :h :dd :j := :I :q! :q :s :echo :uu :S :fi :f :! ::', 'category': 'general', 'key': ':editor_command_group', 'tags': '', 'text': '\n Commands for the editor\n '}
    +search_index_entry = {'aliases': ':dw :p :r :q! :DD :i :echo :< :> :fd :wq :j :: :! :A :S :fi :UU :f :q :s :uu :y :I ::: :u :x :h := :dd :w :', 'category': 'general', 'key': ':editor_command_group', 'tags': '', 'text': '\n Commands for the editor\n '}
    @@ -538,6 +539,7 @@ formatting information.

    +
    develop branch
    @@ -267,6 +268,7 @@ If this is given, filename is not read.

    +
    develop branch
    @@ -1014,6 +1015,7 @@ Must be on the form callable(caller, raw_string, **kwargs).

    +
    develop branch
    @@ -74,7 +75,7 @@ the caller.msg() construct every time the page is updated.

    -aliases = ['n', 'next', 'back', 'abort', 'end', 'q', 'a', 't', 'quit', 'top', 'b', 'e']
    +aliases = ['q', 'end', 'abort', 'e', 'back', 'next', 't', 'top', 'b', 'a', 'quit', 'n']
    @@ -100,7 +101,7 @@ the caller.msg() construct every time the page is updated.

    -search_index_entry = {'aliases': 'n next back abort end q a t quit top b e', 'category': 'general', 'key': '__noinput_command', 'tags': '', 'text': '\n Manipulate the text paging\n '}
    +search_index_entry = {'aliases': 'q end abort e back next t top b a quit n', 'category': 'general', 'key': '__noinput_command', 'tags': '', 'text': '\n Manipulate the text paging\n '}
    @@ -547,6 +548,7 @@ the evmore commands will be available when this is run).

    +
    develop branch
    @@ -656,6 +657,7 @@ given from 0 to Ncolumns-1.

    +
    develop branch
    @@ -278,6 +279,7 @@ the epoch set by settings.TIME_GAME_EPOCH will still apply.

    +
    develop branch
    @@ -43,7 +44,10 @@ modules in Evennia. It also holds the idmapper in-memory caching functionality.

    @@ -97,6 +98,7 @@ +
    develop branch
    @@ -102,6 +103,7 @@ +
    develop branch
    @@ -314,6 +315,7 @@ catch in an easy way here. Ideas are appreciated. /Griatch

    +
    develop branch
    @@ -419,6 +420,7 @@ object the first time, the query is executed.

    +
    develop branch
    @@ -382,6 +383,7 @@ etc to match the regex.

    +
    develop branch
    @@ -445,6 +446,7 @@ all if the file is shorter than nlines.

    +
    develop branch
    @@ -904,6 +905,7 @@ entries are processed.

    +
    develop branch
    @@ -212,6 +213,7 @@ than their values.

    +
    develop branch
    @@ -256,6 +257,7 @@ This is used by the serialization framework.

    +
    develop branch
    @@ -363,6 +364,7 @@ matches were found.

    +
    develop branch
    @@ -218,6 +219,7 @@ It helps ensure your tests are run with your own objects.

    +
    develop branch
    @@ -180,7 +181,7 @@ snippet #577349 on
    -re_string = re.compile('(?P<htmlchars>[<&>])|(?P<firstspace>(?<=\\S) )|(?P<space> [ \\t]+)|(?P<spacestart>^ )|(?P<lineend>\\r\\n|\\r|\\n)', re.IGNORECASE|re.MULTILINE|re.DOTALL)
    +re_string = re.compile('(?P<htmlchars>[<&>])|(?P<tab>[\\t]+)|(?P<space> +)|(?P<spacestart>^ )|(?P<lineend>\\r\\n|\\r|\\n)', re.IGNORECASE|re.MULTILINE|re.DOTALL)
    @@ -446,6 +447,7 @@ into html statements.

    +
    develop branch
    @@ -1497,6 +1498,7 @@ function has no arg or kwarg named ‘caller’.

    +
    develop branch
    @@ -209,6 +210,7 @@ If neither one is provided, defaults to UTC.

    +
    develop branch
    @@ -283,6 +284,7 @@ documentation specifically regarding DRF integration.

    +
    develop branch
    @@ -99,6 +100,7 @@ +
    develop branch
    @@ -184,6 +185,7 @@ complete the action.

    +
    develop branch
    @@ -377,6 +378,7 @@ not have them render PK-related fields.

    +
    develop branch
    @@ -155,6 +156,7 @@ +
    develop branch
    @@ -103,6 +104,7 @@ set attribute: action: POST, url: /objects/<:pk>/set-attribute, view nam +
    develop branch
    @@ -385,6 +386,7 @@ based on your DefaultCharacter typeclass path.

    +
    develop branch
    @@ -134,6 +135,7 @@ found under the server package).

    +
    develop branch
    @@ -89,6 +90,7 @@ +
    develop branch
    @@ -115,6 +116,7 @@ an already authenticated account and bypass authentication.

    +
    develop branch
    @@ -114,6 +115,7 @@ is automatically added to context of all views.

    +
    develop branch
    @@ -97,6 +98,7 @@ +
    develop branch
    @@ -107,6 +108,7 @@ +
    develop branch
    @@ -115,6 +116,7 @@ +
    develop branch
    @@ -95,6 +96,7 @@ +
    develop branch
    @@ -91,6 +92,7 @@ webpage ‘application’.

    +
    develop branch
    @@ -97,6 +98,7 @@ page and serve it eventual static content.

    +
    develop branch
    @@ -327,6 +328,7 @@ wish to allow.

    +
    develop branch
    @@ -105,6 +106,7 @@ +
    develop branch
    @@ -94,6 +95,7 @@ +
    develop branch
    @@ -94,6 +95,7 @@ +
    develop branch
    @@ -460,6 +461,7 @@ +
    develop branch
    @@ -90,6 +91,7 @@ +
    develop branch
    @@ -876,6 +877,7 @@ instead of pk and slug.

    +
    develop branch
    +
    develop branch
    @@ -42,13 +43,13 @@

    Warning

    -

    This is the experimental and unstable documentation for the -development branch of Evennia (v1.0-dev). It’s based on converted docs -from the Evennia wiki (https://github.com/evennia/evennia/wiki/) at -2020-06-12 22:36:53. There are known conversion issues and missing links. -This will slowly be ironed out as this is developed.

    -

    For now you are best off using the original wiki, or the less changing v0.9.5 -of these docs. You have been warned.

    +

    This is the WIP documentation for the +development branch of Evennia (v1.0-dev). The text is based on the +original Evennia wiki +but it’s being refactored heavily. There are known conversion issues +and missing links. This will slowly be ironed out as this is developed.

    +

    New things will be added to this version only, but for now you are best +off using v0.9.5 of the docs, or the original wiki. You have been warned.

    Evennia Documentation

    @@ -151,6 +152,7 @@ of these docs. You have been warned.

    +
    develop branch
    @@ -1255,6 +1256,7 @@ +
    develop branch
    @@ -94,6 +95,7 @@ +
    develop branch
    @@ -269,6 +270,7 @@ +
    develop branch