From b7d96690835a615f5b425dc96506365c9188a343 Mon Sep 17 00:00:00 2001
From: Evennia docbuilder action
__unloggedin_look_command [l, look] (cmdset: UnloggedinCmdSet, help-category: General)
__unloggedin_look_command [look, l] (cmdset: UnloggedinCmdSet, help-category: General)
about [version] (cmdset: CharacterCmdSet, help-category: System)
access [hierarchy, groups] (cmdset: CharacterCmdSet, help-category: General)
access [groups, hierarchy] (cmdset: CharacterCmdSet, help-category: General)
accounts [listaccounts, account] (cmdset: CharacterCmdSet, help-category: System)
addcom [chanalias, aliaschan] (cmdset: AccountCmdSet, help-category: Comms)
alias [setobjalias] (cmdset: CharacterCmdSet, help-category: Building)
allcom (cmdset: AccountCmdSet, help-category: Comms)
batchcode [batchcodes] (cmdset: CharacterCmdSet, help-category: Building)
batchcommands [batchcommand, batchcmd] (cmdset: CharacterCmdSet, help-category: Building)
batchcommands [batchcmd, batchcommand] (cmdset: CharacterCmdSet, help-category: Building)
cboot (cmdset: AccountCmdSet, help-category: Comms)
ccreate [channelcreate] (cmdset: AccountCmdSet, help-category: Comms)
cdesc (cmdset: AccountCmdSet, help-category: Comms)
cdestroy (cmdset: AccountCmdSet, help-category: Comms)
cemit [cmsg] (cmdset: AccountCmdSet, help-category: Comms)
channels [chanlist, all channels, comlist, channellist, clist] (cmdset: AccountCmdSet, help-category: Comms)
channels [comlist, chanlist, channellist, clist, all channels] (cmdset: AccountCmdSet, help-category: Comms)
charcreate (cmdset: AccountCmdSet, help-category: General)
chardelete (cmdset: AccountCmdSet, help-category: General)
clock (cmdset: AccountCmdSet, help-category: Comms)
cmdsets [listcmsets] (cmdset: CharacterCmdSet, help-category: Building)
color (cmdset: AccountCmdSet, help-category: General)
connect [co, con, conn] (cmdset: UnloggedinCmdSet, help-category: General)
connect [con, co, conn] (cmdset: UnloggedinCmdSet, help-category: General)
copy (cmdset: CharacterCmdSet, help-category: Building)
cpattr (cmdset: CharacterCmdSet, help-category: Building)
create (cmdset: CharacterCmdSet, help-category: Building)
create [cr, cre] (cmdset: UnloggedinCmdSet, help-category: General)
create [cre, cr] (cmdset: UnloggedinCmdSet, help-category: General)
cwho (cmdset: AccountCmdSet, help-category: Comms)
delcom [delaliaschan, delchanalias] (cmdset: AccountCmdSet, help-category: Comms)
delcom [delchanalias, delaliaschan] (cmdset: AccountCmdSet, help-category: Comms)
desc [describe] (cmdset: CharacterCmdSet, help-category: Building)
destroy [del, delete] (cmdset: CharacterCmdSet, help-category: Building)
dig (cmdset: CharacterCmdSet, help-category: Building)
drop (cmdset: CharacterCmdSet, help-category: General)
encoding [encode] (cmdset: UnloggedinCmdSet, help-category: General)
examine [exam, ex] (cmdset: AccountCmdSet, help-category: Building)
find [search, locate] (cmdset: CharacterCmdSet, help-category: Building)
find [locate, search] (cmdset: CharacterCmdSet, help-category: Building)
get [grab] (cmdset: CharacterCmdSet, help-category: General)
give (cmdset: CharacterCmdSet, help-category: General)
grapevine2chan (cmdset: AccountCmdSet, help-category: Comms)
help [?] (cmdset: AccountCmdSet, help-category: General)
help [h, ?] (cmdset: UnloggedinCmdSet, help-category: General)
help [?, h] (cmdset: UnloggedinCmdSet, help-category: General)
home (cmdset: CharacterCmdSet, help-category: General)
ic [puppet] (cmdset: AccountCmdSet, help-category: General)
info (cmdset: UnloggedinCmdSet, help-category: General)
inventory [inv, i] (cmdset: CharacterCmdSet, help-category: General)
inventory [i, inv] (cmdset: CharacterCmdSet, help-category: General)
irc2chan (cmdset: AccountCmdSet, help-category: Comms)
ircstatus (cmdset: AccountCmdSet, help-category: Comms)
link (cmdset: CharacterCmdSet, help-category: Building)
name [rename] (cmdset: CharacterCmdSet, help-category: Building)
nick [nicks, nickname] (cmdset: AccountCmdSet, help-category: General)
objects [db, listobjs, listobjects, stats] (cmdset: CharacterCmdSet, help-category: System)
objects [db, stats, listobjects, listobjs] (cmdset: CharacterCmdSet, help-category: System)
ooc [unpuppet] (cmdset: AccountCmdSet, help-category: General)
open (cmdset: CharacterCmdSet, help-category: Building)
option [options] (cmdset: AccountCmdSet, help-category: General)
page [tell] (cmdset: AccountCmdSet, help-category: Comms)
password (cmdset: AccountCmdSet, help-category: General)
pose [emote, :] (cmdset: CharacterCmdSet, help-category: General)
pose [:, emote] (cmdset: CharacterCmdSet, help-category: General)
py [!] (cmdset: AccountCmdSet, help-category: System)
quell [unquell] (cmdset: AccountCmdSet, help-category: General)
quit (cmdset: AccountCmdSet, help-category: General)
script [addscript] (cmdset: CharacterCmdSet, help-category: Building)
scripts [listscripts, globalscript] (cmdset: CharacterCmdSet, help-category: System)
server [serverprocess, serverload] (cmdset: CharacterCmdSet, help-category: System)
server [serverload, serverprocess] (cmdset: CharacterCmdSet, help-category: System)
service [services] (cmdset: CharacterCmdSet, help-category: System)
sessions (cmdset: SessionCmdSet, help-category: General)
set (cmdset: CharacterCmdSet, help-category: Building)
time [uptime] (cmdset: CharacterCmdSet, help-category: System)
tunnel [tun] (cmdset: CharacterCmdSet, help-category: Building)
typeclass [swap, parent, update, type] (cmdset: CharacterCmdSet, help-category: Building)
typeclass [update, type, swap, parent] (cmdset: CharacterCmdSet, help-category: Building)
unlink (cmdset: CharacterCmdSet, help-category: Building)
whisper (cmdset: CharacterCmdSet, help-category: General)
who [doing] (cmdset: AccountCmdSet, help-category: General)
aliases = ['pemit', 'remit']¶aliases = ['remit', 'pemit']¶
aliases = ['batchcommand', 'batchcmd']¶aliases = ['batchcmd', 'batchcommand']¶
aliases = ['swap', 'parent', 'update', 'type']¶aliases = ['update', 'type', 'swap', 'parent']¶
aliases = ['search', 'locate']¶aliases = ['locate', 'search']¶
aliases = ['delaliaschan', 'delchanalias']¶aliases = ['delchanalias', 'delaliaschan']¶
aliases = ['chanlist', 'all channels', 'comlist', 'channellist', 'clist']¶aliases = ['comlist', 'chanlist', 'channellist', 'clist', 'all channels']¶
aliases = ['inv', 'i']¶aliases = ['i', 'inv']¶
aliases = ['emote', ':']¶aliases = [':', 'emote']¶
aliases = ['hierarchy', 'groups']¶aliases = ['groups', 'hierarchy']¶
aliases = ['db', 'listobjs', 'listobjects', 'stats']¶aliases = ['db', 'stats', 'listobjects', 'listobjs']¶
aliases = ['serverprocess', 'serverload']¶aliases = ['serverload', 'serverprocess']¶
aliases = ['co', 'con', 'conn']¶aliases = ['con', 'co', 'conn']¶
aliases = ['cr', 'cre']¶aliases = ['cre', 'cr']¶
aliases = ['l', 'look']¶aliases = ['look', 'l']¶
aliases = ['h', '?']¶aliases = ['?', 'h']¶
aliases = ['inv', 'i']¶aliases = ['i', 'inv']¶
aliases = ['@dice', 'roll']¶aliases = ['roll', '@dice']¶
aliases = ['co', 'con', 'conn']¶aliases = ['con', 'co', 'conn']¶
aliases = ['cr', 'cre']¶aliases = ['cre', 'cr']¶
aliases = ['l', 'look']¶aliases = ['look', 'l']¶
aliases = ['h', '?']¶aliases = ['?', 'h']¶
aliases = ['@callback', '@calls', '@callbacks']¶aliases = ['@callbacks', '@callback', '@calls']¶
aliases = ['recognize', 'forget']¶aliases = ['forget', 'recognize']¶
aliases = ['press', 'push', 'press button']¶
aliases = ['feel', 'get', 'l', 'listen', 'examine', 'ex']¶
aliases = ['light', 'burn']¶aliases = ['burn', 'light']¶
aliases = ['shiftroot', 'push', 'pull', 'move']¶aliases = ['shiftroot', 'push', 'move', 'pull']¶
aliases = ['button', 'press button', 'push button']¶aliases = ['button', 'push button', 'press button']¶
aliases = ['fight', 'stab', 'pierce', 'slash', 'chop', 'hit', 'kill', 'bash', 'thrust', 'parry', 'defend']¶aliases = ['fight', 'defend', 'hit', 'slash', 'pierce', 'kill', 'thrust', 'chop', 'parry', 'bash', 'stab']¶
aliases = ['h', '?']¶aliases = ['?', 'h']¶
aliases = ['feel', 'fiddle', 'search', 'l', 'feel around']¶aliases = ['feel', 'feel around', 'search', 'fiddle', 'l']¶
aliases = ['::', ':', ':fi', ':echo', ':y', ':UU', ':::', ':dd', ':i', ':wq', ':u', ':fd', ':I', ':A', ':p', ':w', ':r', ':uu', ':S', ':!', ':dw', ':>', ':x', ':s', ':j', ':=', ':<', ':q!', ':q', ':h', ':DD', ':f']¶aliases = [':i', ':<', ':uu', ':>', ':!', ':s', ':p', ':A', ':u', ':dd', ':j', ':=', ':r', ':y', ':dw', ':q!', ':UU', ':wq', ':I', ':w', ':f', ':S', ':::', '::', ':h', ':echo', ':q', ':', ':x', ':fi', ':fd', ':DD']¶
aliases = ['next', 'a', 'abort', 'n', 'top', 'end', 'q', 'quit', 'back', 'e', 't', 'b']¶aliases = ['back', 'next', 'q', 'end', 'quit', 'abort', 't', 'b', 'n', 'e', 'a', 'top']¶
-Note: this article has been updated for Evennia 0.9. If you’re not yet using this version, be -careful, as the django wiki doesn’t support Python 2 anymore. (Remove this note when enough time -has passed.)
-
The Django-wiki offers a lot of features associated with -wikis, is -actively maintained (at this time, anyway), and isn’t too difficult to install in Evennia. You can +wikis, is actively maintained (at this time, anyway), and isn’t too difficult to install in Evennia. You can see a demonstration of Django-wiki here.
You should begin by shutting down the Evennia server if it is running. We will run migrations and
alter the virtual environment just a bit. Open a terminal and activate your Python environment, the
one you use to run the evennia command.
If you used the default location from the Evennia installation instructions, it should be one of the following:
On Linux:
source evenv/bin/activate
@@ -88,26 +83,14 @@ one you use to run the pip install wiki
-Note: this will install the last version of Django wiki. Version >0.4 doesn’t support Python 2, so
-install wiki 0.3 if you haven’t updated to Python 3 yet.
-
It might take some time, the Django-wiki having some dependencies.
You will need to add a few settings to have the wiki app on your website. Open your
server/conf/settings.py file and add the following at the bottom (but before importing
-secret_settings). Here’s what you’ll find in my own setting file (add the whole Django-wiki
-section):
r"""
-Evennia settings file.
-
-...
-
-"""
-
-# Use the defaults from Evennia unless explicitly overridden
+secret_settings). Here’s an example of a settings file with the Django-wiki added:
+# Use the defaults from Evennia unless explicitly overridden
from evennia.settings_default import *
######################################################################
@@ -145,62 +128,77 @@ section):
print("secret_settings.py file not found or failed to import.")
+Everything in the section “Django-wiki settings” is what you’ll need to include.
Adding the new URLs¶
-Next we need to add two URLs in our web/urls.py file. Open it and compare the following output:
-you will need to add two URLs in custom_patterns and add one import line:
-from django.conf.urls import url, include
-from django.urls import path # NEW!
-
-# default evenni a patterns
-from evennia.web.urls import urlpatterns
-
-# eventual custom patterns
-custom_patterns = [
- # url(r'/desired/url/', view, name='example'),
- url('notifications/', include('django_nyt.urls')), # NEW!
- url('wiki/', include('wiki.urls')), # NEW!
+Next you will need to add two URLs to the file web/urls.py. You’ll do that by modifying
+urlpatterns to look something like this:
+# add patterns
+urlpatterns = [
+ # website
+ path("", include("web.website.urls")),
+ # webclient
+ path("webclient/", include("web.webclient.urls")),
+ # web admin
+ path("admin/", include("web.admin.urls")),
+ # wiki
+ path("wiki/", include("wiki.urls")),
+ path("notifications/", include("django_nyt.urls")),
]
-
-# this is required by Django.
-urlpatterns = custom_patterns + urlpatterns
-You will probably need to copy line 2, 10, and 11. Be sure to place them correctly, as shown in
-the example above.
+The last two lines are what you’ll need to add.
Running migrations¶
-It’s time to run the new migrations. The wiki app adds a few tables in our database. We’ll need to
-run:
+Next you’ll need to run migrations, since the wiki app adds a few tables in our database:
evennia migrate
-And that’s it, you can start the server. If you go to http://localhost:4001/wiki , you should see
-the wiki. Use your account’s username and password to connect to it. That’s how simple it is.
+
+
+Initializing the wiki¶
+Last step! Go ahead and start up your server again.
+evennia start
+
+
+Once that’s finished booting, go to your evennia website (e.g. http://localhost:4001 ) and log in
+with your superuser account, if you aren’t already. Then, go to your new wiki (e.g.
+http://localhost:4001/wiki ). It’ll prompt you to create a starting page - put whatever you want,
+you can change it later.
+Congratulations! You’re all done!
-
-Customizing privileges¶
-A wiki can be a great collaborative tool, but who can see it? Who can modify it? Django-wiki comes
-with a privilege system centered around four values per wiki page. The owner of an article can
-always read and write in it (which is somewhat logical). The group of the article defines who can
-read and who can write, if the user seeing the page belongs to this group. The topic of groups in
-wiki pages will not be discussed here. A last setting determines which other user (that is, these
-who aren’t in the groups, and aren’t the article’s owner) can read and write. Each article has
-these four settings (group read, group write, other read, other write). Depending on your purpose,
-it might not be a good default choice, particularly if you have to remind every builder to keep the
-pages private. Fortunately, Django-wiki gives us additional settings to customize who can read, and
-who can write, a specific article.
-These settings must be placed, as usual, in your server/conf/settings.py file. They take a
-function as argument, said function (or callback) will be called with the article and the user.
-Remember, a Django user, for us, is an account. So we could check lockstrings on them if needed.
-Here is a default setting to restrict the wiki: only builders can write in it, but anyone (including
-non-logged in users) can read it. The superuser has some additional privileges.
+
+Defining wiki permissions¶
+A wiki is usually intended as a collaborative effort - but you probably still want to set
+some rules about who is allowed to do what. Who can create new articles? Edit them? Delete
+them? Etc.
+The two simplest ways to do this are to use Django-wiki’s group-based permissions
+system - or, since this is an Evennia site, to define your own custom permission rules
+tied to Evennia’s permissions system in your settings file.
+
+Group permissions¶
+The wiki itself controls reading/editing permissions per article. The creator of an article will
+always have read/write permissions on that article. Additionally, the article will have Group-based
+permissions and general permissions.
+By default, Evennia’s permission groups won’t be recognized by the wiki, so you’ll have to create your own.
+Go to the Groups page of your game’s Django admin panel (e.g. http://localhost:4001/admin/auth/group )
+and add whichever permission groups you want for your wiki here.
+Note: If you want to connect those groups to your game’s permission levels, you’ll need to modify the game to apply both to accounts.
+Once you’ve added those groups, they’ll be usable in your wiki right away!
+
+
+Settings permissions¶
+Django-wiki also allows you to bypass its article-based permissions with custom site-wide permissions
+rules in your settings file. If you don’t want to use the Group system, or if you want a simple
+solution for connecting the Evennia permission levels to wiki access, this is the way to go.
+Here’s an example of a basic set-up that would go in your settings.py file:
# In server/conf/settings.py
# ...
+# Custom methods to link wiki permissions to game perms
def is_superuser(article, user):
"""Return True if user is a superuser, False otherwise."""
return not user.is_anonymous() and user.is_superuser
@@ -209,68 +207,41 @@ non-logged in users) can read it. The superuser has some additional privileges.
"""Return True if user is a builder, False otherwise."""
return not user.is_anonymous() and user.locks.check_lockstring(user, "perm(Builders)")
-def is_anyone(article, user):
- """Return True even if the user is anonymous."""
- return True
+def is_player(article, user):
+ """Return True if user is a builder, False otherwise."""
+ return not user.is_anonymous() and user.locks.check_lockstring(user, "perm(Players)")
-# Who can create new groups and users from the wiki?
+# Create new users
WIKI_CAN_ADMIN = is_superuser
-# Who can change owner and group membership?
+
+# Change the owner and group for an article
WIKI_CAN_ASSIGN = is_superuser
-# Who can change group membership?
+
+# Change the GROUP of an article, despite the name
WIKI_CAN_ASSIGN_OWNER = is_superuser
-# Who can change read/write access to groups or others?
+
+# Change read/write permissions on an article
WIKI_CAN_CHANGE_PERMISSIONS = is_superuser
-# Who can soft-delete an article?
+
+# Mark an article as deleted
WIKI_CAN_DELETE = is_builder
-# Who can lock an article and permanently delete it?
+
+# Lock or permanently delete an article
WIKI_CAN_MODERATE = is_superuser
-# Who can edit articles?
+
+# Create or edit any pages
WIKI_CAN_WRITE = is_builder
-# Who can read articles?
-WIKI_CAN_READ = is_anyone
+
+# Read any pages
+WIKI_CAN_READ = is_player
+
+# Completely disallow editing and article creation when not logged in
+WIKI_ANONYMOUS_WRITE = False
-Here, we have created three functions: one to return True if the user is the superuser, one to
-return True if the user is a builder, one to return True no matter what (this includes if the
-user is anonymous, E.G. if it’s not logged-in). We then change settings to allow either the
-superuser or
-each builder to moderate, read, write, delete, and more. You can, of course, add more functions,
-adapting them to your need. This is just a demonstration.
-Providing the WIKI_CAN*... settings will bypass the original permission system. The superuser
-could change permissions of an article, but still, only builders would be able to write it. If you
-need something more custom, you will have to expand on the functions you use.
-
-Managing wiki pages from Evennia¶
-Unfortunately, Django wiki doesn’t provide a clear and clean entry point to read and write articles
-from Evennia and it doesn’t seem to be a very high priority. If you really need to keep Django wiki
-and to create and manage wiki pages from your code, you can do so, but this article won’t elaborate,
-as this is somewhat more technical.
-However, it is a good opportunity to present a small project that has been created more recently:
-evennia-wiki has been created to provide a simple
-wiki, more tailored to Evennia and easier to connect. It doesn’t, as yet, provide as many options
-as does Django wiki, but it’s perfectly usable:
-
-Pages have an inherent and much-easier to understand hierarchy based on URLs.
-Article permissions are connected to Evennia groups and are much easier to accommodate specific
-requirements.
-Articles can easily be created, read or updated from the Evennia code itself.
-Markdown is fully-supported with a default integration to Bootstrap to look good on an Evennia
-website. Tables and table of contents are supported as well as wiki links.
-The process to override wiki templates makes full use of the template_overrides directory.
-
-However evennia-wiki doesn’t yet support:
-
-Images in markdown and the uploading schema. If images are important to you, please consider
-contributing to this new project.
-Modifying permissions on a per page/setting basis.
-Moving pages to new locations.
-Viewing page history.
-
-Considering the list of features in Django wiki, obviously other things could be added to the list.
-However, these features may be the most important and useful. Additional ones might not be that
-necessary. If you’re interested in supporting this little project, you are more than welcome to
-contribute to it. Thanks!
+The permission functions can check anything you like on the accessing user, so long as the function
+returns either True (they’re allowed) or False (they’re not).
+For a full list of possible settings, you can check out the django-wiki documentation.
@@ -303,10 +274,12 @@ necessary. If you’re interested in supporting this little project, you are mo
- Adding the wiki in the settings
- Adding the new URLs
- Running migrations
+- Initializing the wiki
-- Customizing privileges
diff --git a/docs/1.0-dev/_sources/Howtos/Add-a-wiki-on-your-website.md.txt b/docs/1.0-dev/_sources/Howtos/Add-a-wiki-on-your-website.md.txt
index 884dd573b6..32be202a35 100644
--- a/docs/1.0-dev/_sources/Howtos/Add-a-wiki-on-your-website.md.txt
+++ b/docs/1.0-dev/_sources/Howtos/Add-a-wiki-on-your-website.md.txt
@@ -1,8 +1,7 @@
# Add a wiki on your website
-
-**Before doing this tutorial you will probably want to read the intro in
-[Basic Web tutorial](Beginner-Tutorial/Part5/Web-Tutorial.md).** Reading the three first parts of the
+**Before doing this tutorial you will probably want to read the intro in
+[Basic Web tutorial](Beginner-Tutorial/Part5/Web-Tutorial.md).** Reading the three first parts of the
[Django tutorial](https://docs.djangoproject.com/en/1.9/intro/tutorial01/) might help as well.
This tutorial will provide a step-by-step process to installing a wiki on your website.
@@ -10,13 +9,8 @@ Fortunately, you don't have to create the features manually, since it has been d
we can integrate their work quite easily with Django. I have decided to focus on
the [Django-wiki](https://django-wiki.readthedocs.io/).
-> Note: this article has been updated for Evennia 0.9. If you're not yet using this version, be
-careful, as the django wiki doesn't support Python 2 anymore. (Remove this note when enough time
-has passed.)
-
The [Django-wiki](https://django-wiki.readthedocs.io/) offers a lot of features associated with
-wikis, is
-actively maintained (at this time, anyway), and isn't too difficult to install in Evennia. You can
+wikis, is actively maintained (at this time, anyway), and isn't too difficult to install in Evennia. You can
see a [demonstration of Django-wiki here](https://demo.django-wiki.org).
## Basic installation
@@ -25,6 +19,8 @@ You should begin by shutting down the Evennia server if it is running. We will
alter the virtual environment just a bit. Open a terminal and activate your Python environment, the
one you use to run the `evennia` command.
+If you used the default location from the Evennia installation instructions, it should be one of the following:
+
* On Linux:
```
source evenv/bin/activate
@@ -40,26 +36,15 @@ Install the wiki using pip:
pip install wiki
-> Note: this will install the last version of Django wiki. Version >0.4 doesn't support Python 2, so
-install wiki 0.3 if you haven't updated to Python 3 yet.
-
It might take some time, the Django-wiki having some dependencies.
### Adding the wiki in the settings
You will need to add a few settings to have the wiki app on your website. Open your
`server/conf/settings.py` file and add the following at the bottom (but before importing
-`secret_settings`). Here's what you'll find in my own setting file (add the whole Django-wiki
-section):
+`secret_settings`). Here's an example of a settings file with the Django-wiki added:
```python
-r"""
-Evennia settings file.
-
-...
-
-"""
-
# Use the defaults from Evennia unless explicitly overridden
from evennia.settings_default import *
@@ -98,65 +83,87 @@ except ImportError:
print("secret_settings.py file not found or failed to import.")
```
+Everything in the section "Django-wiki settings" is what you'll need to include.
+
### Adding the new URLs
-Next we need to add two URLs in our `web/urls.py` file. Open it and compare the following output:
-you will need to add two URLs in `custom_patterns` and add one import line:
+Next you will need to add two URLs to the file `web/urls.py`. You'll do that by modifying
+`urlpatterns` to look something like this:
```python
-from django.conf.urls import url, include
-from django.urls import path # NEW!
-
-# default evenni a patterns
-from evennia.web.urls import urlpatterns
-
-# eventual custom patterns
-custom_patterns = [
- # url(r'/desired/url/', view, name='example'),
- url('notifications/', include('django_nyt.urls')), # NEW!
- url('wiki/', include('wiki.urls')), # NEW!
+# add patterns
+urlpatterns = [
+ # website
+ path("", include("web.website.urls")),
+ # webclient
+ path("webclient/", include("web.webclient.urls")),
+ # web admin
+ path("admin/", include("web.admin.urls")),
+ # wiki
+ path("wiki/", include("wiki.urls")),
+ path("notifications/", include("django_nyt.urls")),
]
-
-# this is required by Django.
-urlpatterns = custom_patterns + urlpatterns
```
-You will probably need to copy line 2, 10, and 11. Be sure to place them correctly, as shown in
-the example above.
+The last two lines are what you'll need to add.
### Running migrations
-It's time to run the new migrations. The wiki app adds a few tables in our database. We'll need to
-run:
+Next you'll need to run migrations, since the wiki app adds a few tables in our database:
evennia migrate
-And that's it, you can start the server. If you go to http://localhost:4001/wiki , you should see
-the wiki. Use your account's username and password to connect to it. That's how simple it is.
-## Customizing privileges
+### Initializing the wiki
-A wiki can be a great collaborative tool, but who can see it? Who can modify it? Django-wiki comes
-with a privilege system centered around four values per wiki page. The owner of an article can
-always read and write in it (which is somewhat logical). The group of the article defines who can
-read and who can write, if the user seeing the page belongs to this group. The topic of groups in
-wiki pages will not be discussed here. A last setting determines which other user (that is, these
-who aren't in the groups, and aren't the article's owner) can read and write. Each article has
-these four settings (group read, group write, other read, other write). Depending on your purpose,
-it might not be a good default choice, particularly if you have to remind every builder to keep the
-pages private. Fortunately, Django-wiki gives us additional settings to customize who can read, and
-who can write, a specific article.
+Last step! Go ahead and start up your server again.
-These settings must be placed, as usual, in your `server/conf/settings.py` file. They take a
-function as argument, said function (or callback) will be called with the article and the user.
-Remember, a Django user, for us, is an account. So we could check lockstrings on them if needed.
-Here is a default setting to restrict the wiki: only builders can write in it, but anyone (including
-non-logged in users) can read it. The superuser has some additional privileges.
+ evennia start
+
+Once that's finished booting, go to your evennia website (e.g. http://localhost:4001 ) and log in
+with your superuser account, if you aren't already. Then, go to your new wiki (e.g.
+http://localhost:4001/wiki ). It'll prompt you to create a starting page - put whatever you want,
+you can change it later.
+
+Congratulations! You're all done!
+
+## Defining wiki permissions
+
+A wiki is usually intended as a collaborative effort - but you probably still want to set
+some rules about who is allowed to do what. Who can create new articles? Edit them? Delete
+them? Etc.
+
+The two simplest ways to do this are to use Django-wiki's group-based permissions
+system - or, since this is an Evennia site, to define your own custom permission rules
+tied to Evennia's permissions system in your settings file.
+
+### Group permissions
+
+The wiki itself controls reading/editing permissions per article. The creator of an article will
+always have read/write permissions on that article. Additionally, the article will have Group-based
+permissions and general permissions.
+
+By default, Evennia's permission groups *won't* be recognized by the wiki, so you'll have to create your own.
+Go to the Groups page of your game's Django admin panel (e.g. http://localhost:4001/admin/auth/group )
+and add whichever permission groups you want for your wiki here.
+
+***Note:*** *If you want to connect those groups to your game's permission levels, you'll need to modify the game to apply both to accounts.*
+
+Once you've added those groups, they'll be usable in your wiki right away!
+
+### Settings permissions
+
+Django-wiki also allows you to bypass its article-based permissions with custom site-wide permissions
+rules in your settings file. If you don't want to use the Group system, or if you want a simple
+solution for connecting the Evennia permission levels to wiki access, this is the way to go.
+
+Here's an example of a basic set-up that would go in your `settings.py` file:
```python
# In server/conf/settings.py
# ...
+# Custom methods to link wiki permissions to game perms
def is_superuser(article, user):
"""Return True if user is a superuser, False otherwise."""
return not user.is_anonymous() and user.is_superuser
@@ -165,68 +172,39 @@ def is_builder(article, user):
"""Return True if user is a builder, False otherwise."""
return not user.is_anonymous() and user.locks.check_lockstring(user, "perm(Builders)")
-def is_anyone(article, user):
- """Return True even if the user is anonymous."""
- return True
+def is_player(article, user):
+ """Return True if user is a builder, False otherwise."""
+ return not user.is_anonymous() and user.locks.check_lockstring(user, "perm(Players)")
-# Who can create new groups and users from the wiki?
+# Create new users
WIKI_CAN_ADMIN = is_superuser
-# Who can change owner and group membership?
+
+# Change the owner and group for an article
WIKI_CAN_ASSIGN = is_superuser
-# Who can change group membership?
+
+# Change the GROUP of an article, despite the name
WIKI_CAN_ASSIGN_OWNER = is_superuser
-# Who can change read/write access to groups or others?
+
+# Change read/write permissions on an article
WIKI_CAN_CHANGE_PERMISSIONS = is_superuser
-# Who can soft-delete an article?
+
+# Mark an article as deleted
WIKI_CAN_DELETE = is_builder
-# Who can lock an article and permanently delete it?
+
+# Lock or permanently delete an article
WIKI_CAN_MODERATE = is_superuser
-# Who can edit articles?
+
+# Create or edit any pages
WIKI_CAN_WRITE = is_builder
-# Who can read articles?
-WIKI_CAN_READ = is_anyone
+
+# Read any pages
+WIKI_CAN_READ = is_player
+
+# Completely disallow editing and article creation when not logged in
+WIKI_ANONYMOUS_WRITE = False
```
-Here, we have created three functions: one to return `True` if the user is the superuser, one to
-return `True` if the user is a builder, one to return `True` no matter what (this includes if the
-user is anonymous, E.G. if it's not logged-in). We then change settings to allow either the
-superuser or
-each builder to moderate, read, write, delete, and more. You can, of course, add more functions,
-adapting them to your need. This is just a demonstration.
+The permission functions can check anything you like on the accessing user, so long as the function
+returns either True (they're allowed) or False (they're not).
-Providing the `WIKI_CAN*...` settings will bypass the original permission system. The superuser
-could change permissions of an article, but still, only builders would be able to write it. If you
-need something more custom, you will have to expand on the functions you use.
-
-### Managing wiki pages from Evennia
-
-Unfortunately, Django wiki doesn't provide a clear and clean entry point to read and write articles
-from Evennia and it doesn't seem to be a very high priority. If you really need to keep Django wiki
-and to create and manage wiki pages from your code, you can do so, but this article won't elaborate,
-as this is somewhat more technical.
-
-However, it is a good opportunity to present a small project that has been created more recently:
-[evennia-wiki](https://github.com/vincent-lg/evennia-wiki) has been created to provide a simple
-wiki, more tailored to Evennia and easier to connect. It doesn't, as yet, provide as many options
-as does Django wiki, but it's perfectly usable:
-
-- Pages have an inherent and much-easier to understand hierarchy based on URLs.
-- Article permissions are connected to Evennia groups and are much easier to accommodate specific
-requirements.
-- Articles can easily be created, read or updated from the Evennia code itself.
-- Markdown is fully-supported with a default integration to Bootstrap to look good on an Evennia
-website. Tables and table of contents are supported as well as wiki links.
-- The process to override wiki templates makes full use of the `template_overrides` directory.
-
-However evennia-wiki doesn't yet support:
-
-- Images in markdown and the uploading schema. If images are important to you, please consider
-contributing to this new project.
-- Modifying permissions on a per page/setting basis.
-- Moving pages to new locations.
-- Viewing page history.
-
-Considering the list of features in Django wiki, obviously other things could be added to the list.
-However, these features may be the most important and useful. Additional ones might not be that
-necessary. If you're interested in supporting this little project, you are more than welcome to
-[contribute to it](https://github.com/vincent-lg/evennia-wiki). Thanks!
+For a full list of possible settings, you can check out [the django-wiki documentation](https://django-wiki.readthedocs.io/en/latest/settings.html).
diff --git a/docs/1.0-dev/api/evennia.commands.default.account.html b/docs/1.0-dev/api/evennia.commands.default.account.html
index 4b41f8be9e..f1fc66fbaa 100644
--- a/docs/1.0-dev/api/evennia.commands.default.account.html
+++ b/docs/1.0-dev/api/evennia.commands.default.account.html
@@ -84,7 +84,7 @@ method. Otherwise all text will be returned to all connected sessions.
@@ -115,7 +115,7 @@ method. Otherwise all text will be returned to all connected sessions.
-
-
search_index_entry = {'aliases': 'l ls', 'category': 'general', 'key': 'look', 'no_prefix': ' l ls', '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', 'no_prefix': ' ls l', 'tags': '', 'text': '\n look while out-of-character\n\n Usage:\n look\n\n Look in the ooc state.\n '}¶
diff --git a/docs/1.0-dev/api/evennia.commands.default.building.html b/docs/1.0-dev/api/evennia.commands.default.building.html
index 6067c1589d..93846f5c50 100644
--- a/docs/1.0-dev/api/evennia.commands.default.building.html
+++ b/docs/1.0-dev/api/evennia.commands.default.building.html
@@ -1296,7 +1296,7 @@ server settings.
-
-
aliases = ['@update', '@swap', '@type', '@typeclasses', '@parent']¶
+aliases = ['@parent', '@update', '@typeclasses', '@type', '@swap']¶
@@ -1327,7 +1327,7 @@ server settings.
-
-
search_index_entry = {'aliases': '@update @swap @type @typeclasses @parent', 'category': 'building', 'key': '@typeclass', 'no_prefix': 'typeclass update swap type typeclasses parent', '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 typeclasses or 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. This will also\n reset cmdsets!\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': '@parent @update @typeclasses @type @swap', 'category': 'building', 'key': '@typeclass', 'no_prefix': 'typeclass parent update typeclasses type swap', '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 typeclasses or 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. This will also\n reset cmdsets!\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 "}¶
@@ -1482,7 +1482,7 @@ If object is not specified, the current location is examined.
@@ -1750,7 +1750,7 @@ the cases, see the module doc.
-
-
search_index_entry = {'aliases': '@ex @exam', 'category': 'building', 'key': '@examine', 'no_prefix': 'examine ex exam', '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 script - examine a Script\n channel - examine a Channel\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': '@exam @ex', 'category': 'building', 'key': '@examine', 'no_prefix': 'examine exam ex', '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 script - examine a Script\n channel - examine a Channel\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 '}¶
diff --git a/docs/1.0-dev/api/evennia.commands.default.general.html b/docs/1.0-dev/api/evennia.commands.default.general.html
index 9e53a5c439..aaf8775f74 100644
--- a/docs/1.0-dev/api/evennia.commands.default.general.html
+++ b/docs/1.0-dev/api/evennia.commands.default.general.html
@@ -126,7 +126,7 @@ look *<account&g
@@ -157,7 +157,7 @@ look *<account&g
-
-
search_index_entry = {'aliases': 'l ls', 'category': 'general', 'key': 'look', 'no_prefix': ' l ls', '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', 'no_prefix': ' ls l', '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 '}¶
@@ -274,7 +274,7 @@ inv
@@ -305,7 +305,7 @@ inv
-
-
search_index_entry = {'aliases': 'inv i', 'category': 'general', 'key': 'inventory', 'no_prefix': ' inv i', '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', 'no_prefix': ' i inv', 'tags': '', 'text': '\n view inventory\n\n Usage:\n inventory\n inv\n\n Shows your inventory.\n '}¶
@@ -549,7 +549,7 @@ placing it in their inventory.
@@ -580,7 +580,7 @@ placing it in their inventory.
-
-
search_index_entry = {'aliases': '\' "', 'category': 'general', 'key': 'say', 'no_prefix': ' \' "', 'tags': '', 'text': '\n speak as your character\n\n Usage:\n say <message>\n\n Talk to those in your current location.\n '}¶
+search_index_entry = {'aliases': '" \'', 'category': 'general', 'key': 'say', 'no_prefix': ' " \'', 'tags': '', 'text': '\n speak as your character\n\n Usage:\n say <message>\n\n Talk to those in your current location.\n '}¶
diff --git a/docs/1.0-dev/api/evennia.commands.default.tests.html b/docs/1.0-dev/api/evennia.commands.default.tests.html
index a5a9350be7..e7464a4b2c 100644
--- a/docs/1.0-dev/api/evennia.commands.default.tests.html
+++ b/docs/1.0-dev/api/evennia.commands.default.tests.html
@@ -853,7 +853,7 @@ main test suite started with
Test the batch processor.
+red_button = <module 'evennia.contrib.tutorials.red_button.red_button' from '/tmp/tmpzppa5y0b/12ce6a23f49ff3c4adaf9587deeadc4012b0e1b8/evennia/contrib/tutorials/red_button/red_button.py'>¶
diff --git a/docs/1.0-dev/api/evennia.commands.default.unloggedin.html b/docs/1.0-dev/api/evennia.commands.default.unloggedin.html
index 1fe9681bd7..22b060282e 100644
--- a/docs/1.0-dev/api/evennia.commands.default.unloggedin.html
+++ b/docs/1.0-dev/api/evennia.commands.default.unloggedin.html
@@ -73,7 +73,7 @@ connect “account name” “pass word”
@@ -108,7 +108,7 @@ there is no object yet before the account has logged in)
-
-
search_index_entry = {'aliases': 'con co conn', 'category': 'general', 'key': 'connect', 'no_prefix': ' con co conn', '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': 'co conn con', 'category': 'general', 'key': 'connect', 'no_prefix': ' co conn con', '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 '}¶
@@ -132,7 +132,7 @@ create “account name” “pass word”
@@ -163,7 +163,7 @@ create “account name” “pass word”
-
-
search_index_entry = {'aliases': 'cre cr', 'category': 'general', 'key': 'create', 'no_prefix': ' cre cr', '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': 'cr cre', 'category': 'general', 'key': 'create', 'no_prefix': ' cr cre', '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 '}¶
@@ -187,7 +187,7 @@ version is a bit more complicated.
@@ -213,7 +213,7 @@ version is a bit more complicated.
-
-
search_index_entry = {'aliases': 'q qu', 'category': 'general', 'key': 'quit', 'no_prefix': ' q qu', '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', 'no_prefix': ' qu q', '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 '}¶
@@ -237,7 +237,7 @@ All it does is display the connect screen.
@@ -263,7 +263,7 @@ All it does is display the connect screen.
-
-
search_index_entry = {'aliases': 'look l', 'category': 'general', 'key': '__unloggedin_look_command', 'no_prefix': ' look l', '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': 'l look', 'category': 'general', 'key': '__unloggedin_look_command', 'no_prefix': ' l look', '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 '}¶
diff --git a/docs/1.0-dev/api/evennia.contrib.base_systems.email_login.email_login.html b/docs/1.0-dev/api/evennia.contrib.base_systems.email_login.email_login.html
index 41b945da46..9ec684f2cb 100644
--- a/docs/1.0-dev/api/evennia.contrib.base_systems.email_login.email_login.html
+++ b/docs/1.0-dev/api/evennia.contrib.base_systems.email_login.email_login.html
@@ -90,7 +90,7 @@ the module given by settings.CONNECTION_SCREEN_MODULE.
@@ -120,7 +120,7 @@ there is no object yet before the account has logged in)
-
-
search_index_entry = {'aliases': 'con co conn', 'category': 'general', 'key': 'connect', 'no_prefix': ' con co conn', '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': 'co conn con', 'category': 'general', 'key': 'connect', 'no_prefix': ' co conn con', '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 '}¶
@@ -142,7 +142,7 @@ there is no object yet before the account has logged in)
@@ -178,7 +178,7 @@ name enclosed in quotes:
-
-
search_index_entry = {'aliases': 'cre cr', 'category': 'general', 'key': 'create', 'no_prefix': ' cre cr', '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': 'cr cre', 'category': 'general', 'key': 'create', 'no_prefix': ' cr cre', '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 '}¶
@@ -197,7 +197,7 @@ version is a bit more complicated.
@@ -223,7 +223,7 @@ version is a bit more complicated.
-
-
search_index_entry = {'aliases': 'q qu', 'category': 'general', 'key': 'quit', 'no_prefix': ' q qu', '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', 'no_prefix': ' qu q', '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 '}¶
@@ -242,7 +242,7 @@ All it does is display the connect screen.
@@ -268,7 +268,7 @@ All it does is display the connect screen.
-
-
search_index_entry = {'aliases': 'look l', 'category': 'general', 'key': '__unloggedin_look_command', 'no_prefix': ' look l', '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': 'l look', 'category': 'general', 'key': '__unloggedin_look_command', 'no_prefix': ' l look', '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 '}¶
diff --git a/docs/1.0-dev/api/evennia.contrib.base_systems.ingame_python.commands.html b/docs/1.0-dev/api/evennia.contrib.base_systems.ingame_python.commands.html
index f7befa7b2d..f3d7571665 100644
--- a/docs/1.0-dev/api/evennia.contrib.base_systems.ingame_python.commands.html
+++ b/docs/1.0-dev/api/evennia.contrib.base_systems.ingame_python.commands.html
@@ -67,7 +67,7 @@
@@ -148,7 +148,7 @@ on user permission.
-
-
search_index_entry = {'aliases': '@callback @calls @callbacks', 'category': 'building', 'key': '@call', 'no_prefix': 'call callback calls callbacks', 'tags': '', 'text': '\n Command to edit callbacks.\n '}¶
+search_index_entry = {'aliases': '@callbacks @callback @calls', 'category': 'building', 'key': '@call', 'no_prefix': 'call callbacks callback calls', 'tags': '', 'text': '\n Command to edit callbacks.\n '}¶
diff --git a/docs/1.0-dev/api/evennia.contrib.base_systems.mux_comms_cmds.mux_comms_cmds.html b/docs/1.0-dev/api/evennia.contrib.base_systems.mux_comms_cmds.mux_comms_cmds.html
index 9c93eb1707..a32382d911 100644
--- a/docs/1.0-dev/api/evennia.contrib.base_systems.mux_comms_cmds.mux_comms_cmds.html
+++ b/docs/1.0-dev/api/evennia.contrib.base_systems.mux_comms_cmds.mux_comms_cmds.html
@@ -168,7 +168,7 @@ for that channel.
@@ -199,7 +199,7 @@ for that channel.
-
-
search_index_entry = {'aliases': 'delaliaschan delchanalias', 'category': 'comms', 'key': 'delcom', 'no_prefix': ' delaliaschan delchanalias', 'tags': '', 'text': "\n remove a channel alias and/or unsubscribe from channel\n\n Usage:\n delcom <alias or channel>\n delcom/all <channel>\n\n If the full channel name is given, unsubscribe from the\n channel. If an alias is given, remove the alias but don't\n unsubscribe. If the 'all' switch is used, remove all aliases\n for that channel.\n "}¶
+search_index_entry = {'aliases': 'delchanalias delaliaschan', 'category': 'comms', 'key': 'delcom', 'no_prefix': ' delchanalias delaliaschan', 'tags': '', 'text': "\n remove a channel alias and/or unsubscribe from channel\n\n Usage:\n delcom <alias or channel>\n delcom/all <channel>\n\n If the full channel name is given, unsubscribe from the\n channel. If an alias is given, remove the alias but don't\n unsubscribe. If the 'all' switch is used, remove all aliases\n for that channel.\n "}¶
diff --git a/docs/1.0-dev/api/evennia.contrib.full_systems.evscaperoom.commands.html b/docs/1.0-dev/api/evennia.contrib.full_systems.evscaperoom.commands.html
index ca47de1938..09c587595f 100644
--- a/docs/1.0-dev/api/evennia.contrib.full_systems.evscaperoom.commands.html
+++ b/docs/1.0-dev/api/evennia.contrib.full_systems.evscaperoom.commands.html
@@ -162,7 +162,7 @@ the operation will be general or on the room.
@@ -186,7 +186,7 @@ set in self.parse())
-
-
search_index_entry = {'aliases': 'abort q quit chicken out', 'category': 'evscaperoom', 'key': 'give up', 'no_prefix': ' abort q quit chicken out', 'tags': '', 'text': '\n Give up\n\n Usage:\n give up\n\n Abandons your attempts at escaping and of ever winning the pie-eating contest.\n\n '}¶
+search_index_entry = {'aliases': 'chicken out q quit abort', 'category': 'evscaperoom', 'key': 'give up', 'no_prefix': ' chicken out q quit abort', 'tags': '', 'text': '\n Give up\n\n Usage:\n give up\n\n Abandons your attempts at escaping and of ever winning the pie-eating contest.\n\n '}¶
@@ -207,7 +207,7 @@ set in self.parse())
@@ -241,7 +241,7 @@ set in self.parse())
-
-
search_index_entry = {'aliases': 'l ls', 'category': 'evscaperoom', 'key': 'look', 'no_prefix': ' l ls', 'tags': '', 'text': '\n Look at the room, an object or the currently focused object\n\n Usage:\n look [obj]\n\n '}¶
+search_index_entry = {'aliases': 'ls l', 'category': 'evscaperoom', 'key': 'look', 'no_prefix': ' ls l', 'tags': '', 'text': '\n Look at the room, an object or the currently focused object\n\n Usage:\n look [obj]\n\n '}¶
@@ -322,7 +322,7 @@ shout
@@ -351,7 +351,7 @@ set in self.parse())
-
-
search_index_entry = {'aliases': 'shout whisper ;', 'category': 'general', 'key': 'say', 'no_prefix': ' shout whisper ;', 'tags': '', 'text': '\n Perform an communication action.\n\n Usage:\n say <text>\n whisper\n shout\n\n '}¶
+search_index_entry = {'aliases': 'shout ; whisper', 'category': 'general', 'key': 'say', 'no_prefix': ' shout ; whisper', 'tags': '', 'text': '\n Perform an communication action.\n\n Usage:\n say <text>\n whisper\n shout\n\n '}¶
@@ -441,7 +441,7 @@ looks and what actions is available.
@@ -470,7 +470,7 @@ set in self.parse())
-
-
search_index_entry = {'aliases': 'examine ex e unfocus', 'category': 'evscaperoom', 'key': 'focus', 'no_prefix': ' examine ex e unfocus', 'tags': '', 'text': '\n Focus your attention on a target.\n\n Usage:\n focus <obj>\n\n Once focusing on an object, use look to get more information about how it\n looks and what actions is available.\n\n '}¶
+search_index_entry = {'aliases': 'e examine ex unfocus', 'category': 'evscaperoom', 'key': 'focus', 'no_prefix': ' e examine ex unfocus', 'tags': '', 'text': '\n Focus your attention on a target.\n\n Usage:\n focus <obj>\n\n Once focusing on an object, use look to get more information about how it\n looks and what actions is available.\n\n '}¶
@@ -532,7 +532,7 @@ set in self.parse())
@@ -556,7 +556,7 @@ set in self.parse())
-
-
search_index_entry = {'aliases': 'give inv inventory i', 'category': 'evscaperoom', 'key': 'get', 'no_prefix': ' give inv inventory i', 'tags': '', 'text': '\n Use focus / examine instead.\n\n '}¶
+search_index_entry = {'aliases': 'give i inventory inv', 'category': 'evscaperoom', 'key': 'get', 'no_prefix': ' give i inventory inv', 'tags': '', 'text': '\n Use focus / examine instead.\n\n '}¶
@@ -577,7 +577,7 @@ set in self.parse())
@@ -600,7 +600,7 @@ to all the variables defined therein.
-
-
search_index_entry = {'aliases': '@open @dig', 'category': 'general', 'key': 'open', 'no_prefix': ' open dig', 'tags': '', 'text': '\n Interact with an object in focus.\n\n Usage:\n <action> [arg]\n\n '}¶
+search_index_entry = {'aliases': '@dig @open', 'category': 'general', 'key': 'open', 'no_prefix': ' dig open', 'tags': '', 'text': '\n Interact with an object in focus.\n\n Usage:\n <action> [arg]\n\n '}¶
diff --git a/docs/1.0-dev/api/evennia.contrib.game_systems.clothing.clothing.html b/docs/1.0-dev/api/evennia.contrib.game_systems.clothing.clothing.html
index 3304dc8c6d..735d68fcf6 100644
--- a/docs/1.0-dev/api/evennia.contrib.game_systems.clothing.clothing.html
+++ b/docs/1.0-dev/api/evennia.contrib.game_systems.clothing.clothing.html
@@ -643,7 +643,7 @@ inv
@@ -674,7 +674,7 @@ inv
-
-
search_index_entry = {'aliases': 'inv i', 'category': 'general', 'key': 'inventory', 'no_prefix': ' inv i', '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', 'no_prefix': ' i inv', 'tags': '', 'text': '\n view inventory\n\n Usage:\n inventory\n inv\n\n Shows your inventory.\n '}¶
diff --git a/docs/1.0-dev/api/evennia.contrib.game_systems.turnbattle.tb_basic.html b/docs/1.0-dev/api/evennia.contrib.game_systems.turnbattle.tb_basic.html
index 8556688b9e..a0cfe3814c 100644
--- a/docs/1.0-dev/api/evennia.contrib.game_systems.turnbattle.tb_basic.html
+++ b/docs/1.0-dev/api/evennia.contrib.game_systems.turnbattle.tb_basic.html
@@ -623,7 +623,7 @@ if there are still any actions you can take.
@@ -649,7 +649,7 @@ if there are still any actions you can take.
-
-
search_index_entry = {'aliases': 'wait hold', 'category': 'combat', 'key': 'pass', 'no_prefix': ' wait hold', 'tags': '', 'text': '\n Passes on your turn.\n\n Usage:\n pass\n\n When in a fight, you can use this command to end your turn early, even\n if there are still any actions you can take.\n '}¶
+search_index_entry = {'aliases': 'hold wait', 'category': 'combat', 'key': 'pass', 'no_prefix': ' hold wait', 'tags': '', 'text': '\n Passes on your turn.\n\n Usage:\n pass\n\n When in a fight, you can use this command to end your turn early, even\n if there are still any actions you can take.\n '}¶
diff --git a/docs/1.0-dev/api/evennia.contrib.game_systems.turnbattle.tb_equip.html b/docs/1.0-dev/api/evennia.contrib.game_systems.turnbattle.tb_equip.html
index ea6c9eab80..4917940612 100644
--- a/docs/1.0-dev/api/evennia.contrib.game_systems.turnbattle.tb_equip.html
+++ b/docs/1.0-dev/api/evennia.contrib.game_systems.turnbattle.tb_equip.html
@@ -518,7 +518,7 @@ if there are still any actions you can take.
@@ -538,7 +538,7 @@ if there are still any actions you can take.
-
-
search_index_entry = {'aliases': 'wait hold', 'category': 'combat', 'key': 'pass', 'no_prefix': ' wait hold', 'tags': '', 'text': '\n Passes on your turn.\n\n Usage:\n pass\n\n When in a fight, you can use this command to end your turn early, even\n if there are still any actions you can take.\n '}¶
+search_index_entry = {'aliases': 'hold wait', 'category': 'combat', 'key': 'pass', 'no_prefix': ' hold wait', 'tags': '', 'text': '\n Passes on your turn.\n\n Usage:\n pass\n\n When in a fight, you can use this command to end your turn early, even\n if there are still any actions you can take.\n '}¶
diff --git a/docs/1.0-dev/api/evennia.contrib.game_systems.turnbattle.tb_items.html b/docs/1.0-dev/api/evennia.contrib.game_systems.turnbattle.tb_items.html
index d352f4e704..7f0b2673e0 100644
--- a/docs/1.0-dev/api/evennia.contrib.game_systems.turnbattle.tb_items.html
+++ b/docs/1.0-dev/api/evennia.contrib.game_systems.turnbattle.tb_items.html
@@ -641,7 +641,7 @@ if there are still any actions you can take.
@@ -661,7 +661,7 @@ if there are still any actions you can take.
-
-
search_index_entry = {'aliases': 'wait hold', 'category': 'combat', 'key': 'pass', 'no_prefix': ' wait hold', 'tags': '', 'text': '\n Passes on your turn.\n\n Usage:\n pass\n\n When in a fight, you can use this command to end your turn early, even\n if there are still any actions you can take.\n '}¶
+search_index_entry = {'aliases': 'hold wait', 'category': 'combat', 'key': 'pass', 'no_prefix': ' hold wait', 'tags': '', 'text': '\n Passes on your turn.\n\n Usage:\n pass\n\n When in a fight, you can use this command to end your turn early, even\n if there are still any actions you can take.\n '}¶
diff --git a/docs/1.0-dev/api/evennia.contrib.game_systems.turnbattle.tb_magic.html b/docs/1.0-dev/api/evennia.contrib.game_systems.turnbattle.tb_magic.html
index 069c94c28f..1fbdf077da 100644
--- a/docs/1.0-dev/api/evennia.contrib.game_systems.turnbattle.tb_magic.html
+++ b/docs/1.0-dev/api/evennia.contrib.game_systems.turnbattle.tb_magic.html
@@ -420,7 +420,7 @@ if there are still any actions you can take.
@@ -440,7 +440,7 @@ if there are still any actions you can take.
-
-
search_index_entry = {'aliases': 'wait hold', 'category': 'combat', 'key': 'pass', 'no_prefix': ' wait hold', 'tags': '', 'text': '\n Passes on your turn.\n\n Usage:\n pass\n\n When in a fight, you can use this command to end your turn early, even\n if there are still any actions you can take.\n '}¶
+search_index_entry = {'aliases': 'hold wait', 'category': 'combat', 'key': 'pass', 'no_prefix': ' hold wait', 'tags': '', 'text': '\n Passes on your turn.\n\n Usage:\n pass\n\n When in a fight, you can use this command to end your turn early, even\n if there are still any actions you can take.\n '}¶
diff --git a/docs/1.0-dev/api/evennia.contrib.game_systems.turnbattle.tb_range.html b/docs/1.0-dev/api/evennia.contrib.game_systems.turnbattle.tb_range.html
index 47fe6be620..66421ba3be 100644
--- a/docs/1.0-dev/api/evennia.contrib.game_systems.turnbattle.tb_range.html
+++ b/docs/1.0-dev/api/evennia.contrib.game_systems.turnbattle.tb_range.html
@@ -880,7 +880,7 @@ if there are still any actions you can take.
@@ -900,7 +900,7 @@ if there are still any actions you can take.
-
-
search_index_entry = {'aliases': 'wait hold', 'category': 'combat', 'key': 'pass', 'no_prefix': ' wait hold', 'tags': '', 'text': '\n Passes on your turn.\n\n Usage:\n pass\n\n When in a fight, you can use this command to end your turn early, even\n if there are still any actions you can take.\n '}¶
+search_index_entry = {'aliases': 'hold wait', 'category': 'combat', 'key': 'pass', 'no_prefix': ' hold wait', 'tags': '', 'text': '\n Passes on your turn.\n\n Usage:\n pass\n\n When in a fight, you can use this command to end your turn early, even\n if there are still any actions you can take.\n '}¶
diff --git a/docs/1.0-dev/api/evennia.contrib.grid.extended_room.extended_room.html b/docs/1.0-dev/api/evennia.contrib.grid.extended_room.extended_room.html
index e97c9c1631..d284ddea0f 100644
--- a/docs/1.0-dev/api/evennia.contrib.grid.extended_room.extended_room.html
+++ b/docs/1.0-dev/api/evennia.contrib.grid.extended_room.extended_room.html
@@ -291,7 +291,7 @@ look *<account&g
@@ -311,7 +311,7 @@ look *<account&g
-
-
search_index_entry = {'aliases': 'l ls', 'category': 'general', 'key': 'look', 'no_prefix': ' l ls', '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', 'no_prefix': ' ls l', '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 '}¶
diff --git a/docs/1.0-dev/api/evennia.contrib.rpg.rpsystem.rpsystem.html b/docs/1.0-dev/api/evennia.contrib.rpg.rpsystem.rpsystem.html
index c233c74027..8fd88953ce 100644
--- a/docs/1.0-dev/api/evennia.contrib.rpg.rpsystem.rpsystem.html
+++ b/docs/1.0-dev/api/evennia.contrib.rpg.rpsystem.rpsystem.html
@@ -643,7 +643,7 @@ a different language.
@@ -674,7 +674,7 @@ a different language.
-
-
search_index_entry = {'aliases': '\' "', 'category': 'general', 'key': 'say', 'no_prefix': ' \' "', 'tags': '', 'text': '\n speak as your character\n\n Usage:\n say <message>\n\n Talk to those in your current location.\n '}¶
+search_index_entry = {'aliases': '" \'', 'category': 'general', 'key': 'say', 'no_prefix': ' " \'', 'tags': '', 'text': '\n speak as your character\n\n Usage:\n say <message>\n\n Talk to those in your current location.\n '}¶
diff --git a/docs/1.0-dev/api/evennia.contrib.tutorials.evadventure.commands.html b/docs/1.0-dev/api/evennia.contrib.tutorials.evadventure.commands.html
index 9063972971..710fc51f46 100644
--- a/docs/1.0-dev/api/evennia.contrib.tutorials.evadventure.commands.html
+++ b/docs/1.0-dev/api/evennia.contrib.tutorials.evadventure.commands.html
@@ -207,7 +207,7 @@ set in self.parse())
@@ -231,7 +231,7 @@ set in self.parse())
-
-
search_index_entry = {'aliases': 'inv i', 'category': 'general', 'key': 'inventory', 'no_prefix': ' inv i', 'tags': '', 'text': '\n View your inventory\n\n Usage:\n inventory\n\n '}¶
+search_index_entry = {'aliases': 'i inv', 'category': 'general', 'key': 'inventory', 'no_prefix': ' i inv', 'tags': '', 'text': '\n View your inventory\n\n Usage:\n inventory\n\n '}¶
@@ -308,7 +308,7 @@ unwear <item>
@@ -332,7 +332,7 @@ set in self.parse())
-
-
search_index_entry = {'aliases': 'unwield unwear', 'category': 'general', 'key': 'remove', 'no_prefix': ' unwield unwear', 'tags': '', 'text': '\n Remove a remove a weapon/shield, armor or helmet.\n\n Usage:\n remove <item>\n unwield <item>\n unwear <item>\n\n To remove an item from the backpack, use |wdrop|n instead.\n\n '}¶
+search_index_entry = {'aliases': 'unwear unwield', 'category': 'general', 'key': 'remove', 'no_prefix': ' unwear unwield', 'tags': '', 'text': '\n Remove a remove a weapon/shield, armor or helmet.\n\n Usage:\n remove <item>\n unwield <item>\n unwear <item>\n\n To remove an item from the backpack, use |wdrop|n instead.\n\n '}¶
diff --git a/docs/1.0-dev/api/evennia.contrib.tutorials.red_button.red_button.html b/docs/1.0-dev/api/evennia.contrib.tutorials.red_button.red_button.html
index 67476c3ed0..35849a5e19 100644
--- a/docs/1.0-dev/api/evennia.contrib.tutorials.red_button.red_button.html
+++ b/docs/1.0-dev/api/evennia.contrib.tutorials.red_button.red_button.html
@@ -96,7 +96,7 @@ such as when closing the lid and un-blinding a character.
+aliases = ['push', 'press', 'press button']¶
@@ -125,7 +125,7 @@ check if the lid is open or closed.
+search_index_entry = {'aliases': 'push press press button', 'category': 'general', 'key': 'push button', 'no_prefix': ' push press press button', 'tags': '', 'text': '\n Push the red button (lid closed)\n\n Usage:\n push button\n\n '}¶
@@ -195,7 +195,7 @@ check if the lid is open or closed.
+aliases = ['break lid', 'smash', 'smash lid']¶
@@ -222,7 +222,7 @@ break.
+search_index_entry = {'aliases': 'break lid smash smash lid', 'category': 'general', 'key': 'smash glass', 'no_prefix': ' break lid smash smash lid', 'tags': '', 'text': '\n Smash the protective glass.\n\n Usage:\n smash glass\n\n Try to smash the glass of the button.\n\n '}¶
@@ -322,7 +322,7 @@ be mutually exclusive.
+aliases = ['push', 'press', 'press button']¶
@@ -351,7 +351,7 @@ set in self.parse())
+search_index_entry = {'aliases': 'push press press button', 'category': 'general', 'key': 'push button', 'no_prefix': ' push press press button', 'tags': '', 'text': '\n Push the red button\n\n Usage:\n push button\n\n '}¶
@@ -449,7 +449,7 @@ be mutually exclusive.
+aliases = ['examine', 'get', 'ex', 'listen', 'l', 'feel']¶
@@ -475,7 +475,7 @@ be mutually exclusive.
+search_index_entry = {'aliases': 'examine get ex listen l feel', 'category': 'general', 'key': 'look', 'no_prefix': ' examine get ex listen l feel', '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 "}¶
diff --git a/docs/1.0-dev/api/evennia.contrib.tutorials.tutorial_world.objects.html b/docs/1.0-dev/api/evennia.contrib.tutorials.tutorial_world.objects.html
index ea4863363a..54f08b5e75 100644
--- a/docs/1.0-dev/api/evennia.contrib.tutorials.tutorial_world.objects.html
+++ b/docs/1.0-dev/api/evennia.contrib.tutorials.tutorial_world.objects.html
@@ -376,7 +376,7 @@ of the object. We overload it with our own version.
@@ -403,7 +403,7 @@ to sit on a “lightable” object, we operate only on self.obj.
-
-
search_index_entry = {'aliases': 'burn light', 'category': 'tutorialworld', 'key': 'on', 'no_prefix': ' burn light', 'tags': '', 'text': '\n Creates light where there was none. Something to burn.\n '}¶
+search_index_entry = {'aliases': 'light burn', 'category': 'tutorialworld', 'key': 'on', 'no_prefix': ' light burn', 'tags': '', 'text': '\n Creates light where there was none. Something to burn.\n '}¶
@@ -507,7 +507,7 @@ shift green root up/down
@@ -543,7 +543,7 @@ yellow/green - horizontal roots
-
-
search_index_entry = {'aliases': 'shiftroot pull move push', 'category': 'tutorialworld', 'key': 'shift', 'no_prefix': ' shiftroot pull move push', '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 shiftroot pull move', 'category': 'tutorialworld', 'key': 'shift', 'no_prefix': ' push shiftroot pull move', '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 '}¶
@@ -560,7 +560,7 @@ yellow/green - horizontal roots
-
-
aliases = ['press button', 'push button', 'button']¶
+aliases = ['push button', 'button', 'press button']¶
@@ -586,7 +586,7 @@ yellow/green - horizontal roots
-
-
search_index_entry = {'aliases': 'press button push button button', 'category': 'tutorialworld', 'key': 'press', 'no_prefix': ' press button push button button', 'tags': '', 'text': '\n Presses a button.\n '}¶
+search_index_entry = {'aliases': 'push button button press button', 'category': 'tutorialworld', 'key': 'press', 'no_prefix': ' push button button press button', 'tags': '', 'text': '\n Presses a button.\n '}¶
@@ -730,7 +730,7 @@ parry - forgoes your attack but will make you harder to hit on next
-
-
aliases = ['chop', 'kill', 'parry', 'stab', 'fight', 'defend', 'thrust', 'pierce', 'hit', 'slash', 'bash']¶
+aliases = ['slash', 'pierce', 'stab', 'fight', 'bash', 'defend', 'thrust', 'chop', 'kill', 'hit', 'parry']¶
@@ -756,7 +756,7 @@ parry - forgoes your attack but will make you harder to hit on next
-
-
search_index_entry = {'aliases': 'chop kill parry stab fight defend thrust pierce hit slash bash', 'category': 'tutorialworld', 'key': 'attack', 'no_prefix': ' chop kill parry stab fight defend thrust pierce hit slash bash', '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': 'slash pierce stab fight bash defend thrust chop kill hit parry', 'category': 'tutorialworld', 'key': 'attack', 'no_prefix': ' slash pierce stab fight bash defend thrust chop kill hit parry', '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 '}¶
diff --git a/docs/1.0-dev/api/evennia.contrib.tutorials.tutorial_world.rooms.html b/docs/1.0-dev/api/evennia.contrib.tutorials.tutorial_world.rooms.html
index 2588dda8f0..ba131c3ce0 100644
--- a/docs/1.0-dev/api/evennia.contrib.tutorials.tutorial_world.rooms.html
+++ b/docs/1.0-dev/api/evennia.contrib.tutorials.tutorial_world.rooms.html
@@ -199,7 +199,7 @@ code except for adding in the details.
@@ -214,7 +214,7 @@ code except for adding in the details.
-
-
search_index_entry = {'aliases': 'l ls', 'category': 'tutorialworld', 'key': 'look', 'no_prefix': ' l ls', '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', 'no_prefix': ' ls l', '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 '}¶
@@ -919,7 +919,7 @@ to find something.
-
-
aliases = ['feel around', 'feel', 'fiddle', 'search', 'l']¶
+aliases = ['feel around', 'fiddle', 'l', 'feel', 'search']¶
@@ -947,7 +947,7 @@ random chance of eventually finding a light source.
-
-
search_index_entry = {'aliases': 'feel around feel fiddle search l', 'category': 'tutorialworld', 'key': 'look', 'no_prefix': ' feel around feel fiddle search l', '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 around fiddle l feel search', 'category': 'tutorialworld', 'key': 'look', 'no_prefix': ' feel around fiddle l feel search', '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 '}¶
diff --git a/docs/1.0-dev/api/evennia.utils.eveditor.html b/docs/1.0-dev/api/evennia.utils.eveditor.html
index 46c89e456d..c56042592b 100644
--- a/docs/1.0-dev/api/evennia.utils.eveditor.html
+++ b/docs/1.0-dev/api/evennia.utils.eveditor.html
@@ -287,7 +287,7 @@ indentation.
-
-
aliases = ['::', ':p', ':i', ':::', ':S', ':y', ':j', ':>', ':w', ':fi', ':f', ':u', ':I', ':echo', ':!', ':dw', ':', ':=', ':q', ':q!', ':DD', ':A', ':r', ':wq', ':<', ':fd', ':UU', ':x', ':dd', ':h', ':uu', ':s']¶
+aliases = [':uu', ':I', '::', ':', ':fi', ':UU', ':=', ':f', ':i', ':echo', ':<', ':r', ':::', ':dw', ':j', ':s', ':q', ':>', ':DD', ':A', ':S', ':u', ':h', ':dd', ':wq', ':fd', ':y', ':!', ':q!', ':w', ':p', ':x']¶
@@ -315,7 +315,7 @@ efficient presentation.
-
-
search_index_entry = {'aliases': ':: :p :i ::: :S :y :j :> :w :fi :f :u :I :echo :! :dw : := :q :q! :DD :A :r :wq :< :fd :UU :x :dd :h :uu :s', 'category': 'general', 'key': ':editor_command_group', 'no_prefix': ' :: :p :i ::: :S :y :j :> :w :fi :f :u :I :echo :! :dw : := :q :q! :DD :A :r :wq :< :fd :UU :x :dd :h :uu :s', 'tags': '', 'text': '\n Commands for the editor\n '}¶
+search_index_entry = {'aliases': ':uu :I :: : :fi :UU := :f :i :echo :< :r ::: :dw :j :s :q :> :DD :A :S :u :h :dd :wq :fd :y :! :q! :w :p :x', 'category': 'general', 'key': ':editor_command_group', 'no_prefix': ' :uu :I :: : :fi :UU := :f :i :echo :< :r ::: :dw :j :s :q :> :DD :A :S :u :h :dd :wq :fd :y :! :q! :w :p :x', 'tags': '', 'text': '\n Commands for the editor\n '}¶
diff --git a/docs/1.0-dev/api/evennia.utils.evmenu.html b/docs/1.0-dev/api/evennia.utils.evmenu.html
index ca40667f4f..2e1c33a46b 100644
--- a/docs/1.0-dev/api/evennia.utils.evmenu.html
+++ b/docs/1.0-dev/api/evennia.utils.evmenu.html
@@ -954,7 +954,7 @@ single question.
+aliases = ['yes', 'no', 'a', 'y', 'n', '__nomatch_command', 'abort']¶
@@ -980,7 +980,7 @@ single question.
+search_index_entry = {'aliases': 'yes no a y n __nomatch_command abort', 'category': 'general', 'key': '__noinput_command', 'no_prefix': ' yes no a y n __nomatch_command abort', 'tags': '', 'text': '\n Handle a prompt for yes or no. Press [return] for the default choice.\n\n '}¶
diff --git a/docs/1.0-dev/api/evennia.utils.evmore.html b/docs/1.0-dev/api/evennia.utils.evmore.html
index 8fa034a9cb..b6a94345be 100644
--- a/docs/1.0-dev/api/evennia.utils.evmore.html
+++ b/docs/1.0-dev/api/evennia.utils.evmore.html
@@ -88,7 +88,7 @@ the caller.msg() construct every time the page is updated.
-
-
aliases = ['p', 'next', 'previous', 'q', 'a', 'abort', 't', 'e', 'end', 'quit', 'top', 'n']¶
+aliases = ['t', 'e', 'next', 'quit', 'a', 'p', 'n', 'top', 'q', 'previous', 'end', 'abort']¶
@@ -114,7 +114,7 @@ the caller.msg() construct every time the page is updated.
-
-
search_index_entry = {'aliases': 'p next previous q a abort t e end quit top n', 'category': 'general', 'key': '__noinput_command', 'no_prefix': ' p next previous q a abort t e end quit top n', 'tags': '', 'text': '\n Manipulate the text paging. Catch no-input with aliases.\n '}¶
+search_index_entry = {'aliases': 't e next quit a p n top q previous end abort', 'category': 'general', 'key': '__noinput_command', 'no_prefix': ' t e next quit a p n top q previous end abort', 'tags': '', 'text': '\n Manipulate the text paging. Catch no-input with aliases.\n '}¶
diff --git a/docs/1.0-dev/objects.inv b/docs/1.0-dev/objects.inv
index 9eaec71802b60f0c82ee5590fe0d97d97225edef..c0f84c9d9f83682ba08ea17a6190af0968a1b65e 100644
GIT binary patch
delta 96770
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