Grapevine¶
+Connect Evennia channels to Grapevine¶
Grapevine is a new chat network for MU**** games. By
connecting an in-game channel to the grapevine network, players on your game
can chat with players in other games, also non-Evennia ones.
diff --git a/docs/1.0-dev/.buildinfo b/docs/1.0-dev/.buildinfo index e1a635ae08..6a3e8c0dfe 100644 --- a/docs/1.0-dev/.buildinfo +++ b/docs/1.0-dev/.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: a62091330c1ccd02fd5643736f633492 +config: ff994fe83233749663200558bc3cc4fd tags: 645f666f9bcd5a90fca523b33c5a78b7 diff --git a/docs/1.0-dev/Howtos/Howtos-Overview.html b/docs/1.0-dev/Howtos/Howtos-Overview.html index a5c0485966..c66793c164 100644 --- a/docs/1.0-dev/Howtos/Howtos-Overview.html +++ b/docs/1.0-dev/Howtos/Howtos-Overview.html @@ -18,7 +18,7 @@ - +
This tutorial will create a simple script that will send a tweet to your already configured twitter -account. Please see: How to connect Evennia to Twitter if you +account. Please see: How to connect Evennia to Twitter if you haven’t already done so.
The script could be expanded to cover a variety of statistics you might wish to tweet about regularly, from player deaths to how much currency is in the economy etc.
diff --git a/docs/1.0-dev/Setup/Grapevine.html b/docs/1.0-dev/Setup/Channels-to-Grapevine.html similarity index 86% rename from docs/1.0-dev/Setup/Grapevine.html rename to docs/1.0-dev/Setup/Channels-to-Grapevine.html index ca2e84641b..5c2730e8b1 100644 --- a/docs/1.0-dev/Setup/Grapevine.html +++ b/docs/1.0-dev/Setup/Channels-to-Grapevine.html @@ -6,7 +6,7 @@ -Connect Evennia channels to IRC
Connect Evennia channels to RSS
Grapevine is a new chat network for MU**** games. By
connecting an in-game channel to the grapevine network, players on your game
can chat with players in other games, also non-Evennia ones.
Connect Evennia channels to Grapevine
IRC (Internet Relay Chat) is a long standing chat protocol used by many open-source projects for communicating in real time. By connecting one of Evennia’s Channels to an IRC channel you can communicate also with people not on @@ -200,14 +200,14 @@ name of the IRC channel you used (#evennia here).
modules |Connect Evennia channels to Grapevine
How to connect Evennia to Twitter
+RSS is a format for easily tracking updates on websites. The principle is simple - whenever a site is updated, a small text file is updated. An RSS reader can then regularly go online, check this file for updates and let the user know what’s new.
@@ -130,8 +128,9 @@ module. @rss2chan <evennia_channel> = <rss_url>
You can connect RSS to any Evennia channel, but for testing, let’s set up a new channel “rss”.
@ccreate rss = RSS feeds are echoed to this channel!
You can connect any number of RSS feeds to a channel this way. You could also connect them to the -same channels as IRC to have the feed echo to external chat channels as well.
- +same channels as Channels-to-IRC to have the feed echo to external chat channels as well. @@ -170,14 +168,14 @@ same channels as modules |Connect Evennia channels to RSS
Twitter is an online social networking service that enables -users to send and read short 280-character messages called “tweets”. Following is a short tutorial -explaining how to enable users to send tweets from inside Evennia.
+Twitter is an online social networking service that enables users to send and read short messages called “tweets”. Following is a short tutorial explaining how to enable users to send tweets from inside Evennia.
You must first have a Twitter account. Log in and register an App at the Twitter Dev -Site. Make sure you enable access to “write” tweets!
-To tweet from Evennia you will need both the “API Token” and the “API secret” strings as well as the -“Access Token” and “Access Secret” strings.
-Twitter changed their requirements to require a Mobile number on the Twitter account to register new -apps with write access. If you’re unable to do this, please see this Dev -post which describes how to get around -it.
-You must first have a Twitter account. Log in and register an App at the Twitter Dev Site. Make sure you enable access to “write” tweets!
+To tweet from Evennia you will need both the “API Token” and the “API secret” strings as well as the “Access Token” and “Access Secret” strings.
+Twitter changed their requirements to require a Mobile number on the Twitter account to register new apps with write access. If you’re unable to do this, please see this Dev post which describes how to get around it.
To use Twitter you must install the Twitter Python module:
pip install python-twitter
Evennia doesn’t have a tweet command out of the box so you need to write your own little
-Command in order to tweet. If you are unsure about how commands work and how to add
-them, it can be an idea to go through the Adding a Command Tutorial
-before continuing.
You can create the command in a separate command module (something like mygame/commands/tweet.py)
-or together with your other custom commands, as you prefer.
This is how it can look:
-import twitter
+A basic tweet command¶
+Evennia doesn’t have a tweet command out of the box so you need to write your own little Command in order to tweet. If you are unsure about how commands work and how to add them, it can be an idea to go through the Adding a Command Tutorial before continuing.
+You can create the command in a separate command module (something like mygame/commands/tweet.py) or together with your other custom commands, as you prefer.
+This is how it can look:
+# in mygame/commands.tweet.py, for example
+
+import twitter
from evennia import Command
# here you insert your unique App tokens
@@ -186,15 +178,16 @@ or together with your other custom commands, as you prefer.
Be sure to substitute your own actual API/Access keys and secrets in the appropriate places.
-We default to limiting tweet access to players with Developers-level access or to those players
-that have the permission “tweet” (allow individual characters to tweet with @perm/player playername = tweet). You may change the lock as you feel is appropriate. Change the overall
-permission to Players if you want everyone to be able to tweet.
-Now add this command to your default command set (e.g in mygame/commands/defalt_cmdsets.py”) and
-reload the server. From now on those with access can simply use tweet <message> to see the tweet
-posted from the game’s Twitter account.
+We default to limiting tweet access to players with Developers-level access or to those players that have the permission “tweet”
+To allow allow individual characters to tweet, set the tweet permission with
+perm/player playername = tweet
+
+
+You may change the lock as you feel is appropriate. Change the overall permission to Players if you want everyone to be able to tweet.
+Now add this command to your default command set (e.g in mygame/commands/defalt_cmdsets.py) and reload the server. From now on those with access can simply use tweet <message> to see the tweet posted from the game’s Twitter account.
-Next Steps¶
+Next Steps¶
This shows only a basic tweet setup, other things to do could be:
Auto-Adding the character name to the tweet
@@ -202,9 +195,8 @@ posted from the game’s Twitter account.
Changing locks to make tweeting open to more people
Echo your tweets to an in-game channel
-Rather than using an explicit command you can set up a Script to send automatic tweets, for example
-to post updated game stats. See the Tweeting Game Stats tutorial for
-help.
+Rather than using an explicit command you can set up a Script to send automatic tweets, for example to post updated game stats. See the Tweeting Game Stats tutorial for help.
+
@@ -224,14 +216,14 @@ help.
modules |
Connect Evennia channels to IRC
This page gives an overview of the supported SQL databases as well as instructions on install:
SQLite3 (default)
PostgreSQL
MySQL / MariaDB
Since Evennia uses Django, most of our notes are based off of what we
-know from the community and their documentation. While the information below may be useful, you can
-always find the most up-to-date and “correct” information at Django’s Notes about supported
+ Since Evennia uses Django, most of our notes are based off of what we know from the community and their documentation. While the information below may be useful, you can always find the most up-to-date and “correct” information at Django’s Notes about supported
Databases page. SQLite3 is a light weight single-file database. It is our default database
and Evennia will set this up for you automatically if you give no other options. SQLite stores the
database in a single file ( SQLite will generally be much faster than MySQL/PostgreSQL but its performance comes with two
drawbacks: SQLite ignores length constraints by design; it is possible
-to store very large strings and numbers in fields that technically should not accept them. This is
-not something you will notice; your game will read and write them and function normally, but this
-can create some data migration problems requiring careful thought if you do need to change
-databases later. SQLite can scale well to storage of millions of objects, but if you end up with a thundering herd
-of users trying to access your MUD and web site at the same time, or you find yourself writing long-
-running functions to update large numbers of objects on a live game, either will yield errors and
-interference. SQLite does not work reliably with multiple concurrent threads or processes accessing
-its records. This has to do with file-locking clashes of the database file. So for a production
-server making heavy use of process- or thread pools (or when using a third-party webserver like
-Apache), a proper database is a more appropriate choice. SQLite ignores length constraints by design; it is possible to store very large strings and numbers in fields that technically should not accept them. This is not something you will notice; your game will read and write them and function normally, but this can create some data migration problems requiring careful thought if you do need to change databases later. SQLite can scale well to storage of millions of objects, but if you end up with a thundering herd of users trying to access your MUD and web site at the same time, or you find yourself writing long- running functions to update large numbers of objects on a live game, either will yield errors and interference. SQLite does not work reliably with multiple concurrent threads or processes accessing its records. This has to do with file-locking clashes of the database file. So for a production server making heavy use of process- or thread pools, a proper database is a more appropriate choice. This is installed and configured as part of Evennia. The database file is created as
- This is installed and configured as part of Evennia. The database file is created as without changing any database options. An optional requirement is the without changing any database options. An optional requirement is the To inspect the default Evennia database (once it’s been created), go to your game dir and do This will bring you into the sqlite command line. Use To reset your database and start from scratch, simply stop Evennia and delete the How to connect Evennia to Twitter 2.0.0b16 No MXP, MCCP support. Win 32bit does not understand Making Evennia, HTTPS and WSS (Secure Websockets) play nicely together Warning: This information is presented as a convenience, using another webserver than Evennia’s
-own is not directly supported and you are on your own if you want to do so. Evennia’s webserver
-works out of the box without any extra configuration and also runs in-process making sure to avoid
-caching race conditions. The browser web client will most likely not work (at least not without
-tweaking) on a third-party web server. One reason for wanting to use an external webserver like Apache would be to act as a proxy in
-front of the Evennia webserver. Getting this working with TLS (encryption) requires some extra work
-covered at the end of this page. Note that the Apache instructions below might be outdated. If something is not working right, or you
-use Evennia with a different server, please let us know. Also, if there is a particular Linux distro
-you would like covered, please let us know. Fedora/RHEL - Apache HTTP Server and Evennia has its own webserver. This should usually not be replaced. But another reason for wanting to use an external webserver like Apache would be to act as a proxy in front of the Evennia webserver. Getting this working with TLS (encryption) requires some extra work covered at the end of this page. Warning Possibly outdated
+The Apache instructions below might be outdated. If something is not working right, or you use Evennia with a different server, please let us know. Ubuntu/Debian - Apache HTTP Server and After Read the comments and change the paths to point to the appropriate locations within your setup. You’ll then want to reload or restart apache2 after changing the configurations. Fedora/RHEL/Ubuntu Ubuntu/Debian With any luck, you’ll be able to point your browser at your domain or subdomain that you set up in
-your vhost and see the nifty default Evennia webpage. If not, read the hopefully informative error
-message and work from there. Questions may be directed to our Evennia Community
-site. If your If you are not running in daemon mode or want to force the issue, simply restart or reload apache2
-to apply your changes. If you get strange (and usually uninformative) One user commented that they had to add the following to their Apache config to get things to work.
-Not confirmed, but worth trying if there are trouble. Below are steps on running Evennia using a front-end proxy (Apache HTTP), Below are steps to run Evennia using a front-end proxy (Apache HTTP), Fedora/RHEL - Apache HTTP Server and Fedora/RHEL - Apache HTTP Server and Ubuntu/Debian - Apache HTTP Server and Ubuntu/Debian - Apache HTTP Server and The setting above is what the client’s browser will actually use. Note the use of The setting above is what the client’s browser will actually use. Note the use of Warning This is not supported, nor recommended.
+This is covered because it has been asked about. The webclient would not work. It would also run out-of-process, leading to race conditions. This is not directly supported, so if you try this you are on your own. Fedora/RHEL - Apache HTTP Server and Ubuntu/Debian - Apache HTTP Server and After Read the comments and change the paths to point to the appropriate locations within your setup. You’ll then want to reload or restart apache2 after changing the configurations. Fedora/RHEL/Ubuntu Ubuntu/Debian With any luck, you’ll be able to point your browser at your domain or subdomain that you set up in
+your vhost and see the nifty default Evennia webpage. If not, read the hopefully informative error
+message and work from there. Questions may be directed to our Evennia Community
+site. If your If you are not running in daemon mode or want to force the issue, simply restart or reload apache2
+to apply your changes. If you get strange (and usually uninformative) One user commented that they had to add the following to their Apache config to get things to work.
+Not confirmed, but worth trying if there are trouble. A modern public-facing website should these days be served via encrypted
connections. So Remember that you need to re-activate the virtualenv like this every time you
-start a new terminal/console to get access to the Python packages (notably the
-important If you are running Windows10, consider using the Windows Subsystem for Linux
+ If you are running Windows10+, consider using the Windows Subsystem for Linux
(WSL) instead. Just set up WSL with an Ubuntu image and follow the Linux install instructions above. The Evennia server itself is a command line program. In the Windows launch
@@ -266,8 +265,7 @@ new folder for all your Evennia development (let’s call it If Next we fetch Evennia itself: These envvars will only be used on the very first server start and then ignored. For example: Important If you are converting an existing game from a previous Evennia version, see here. Installing Evennia doesn’t make anything visible online. Apart from installation and updating, you can develop your game without any internet connection. Evennia requires Python 3.9, 3.10 or 3.11 (recommended) Windows: In the installer, make sure you select Using a light-weight Python virtual environment is optional, but highly recommended in order to keep your Evennia installation independent from the system libraries. Using virtualenvs is common Python praxis. Using a light-weight Python virtual environment is optional, but highly recommended in order to keep your Evennia installation independent from the system libraries. Using virtualenvs like this is common Python praxis. Don’t install Evennia as administrator or superuser. If you run into trouble, see installation troubleshooting. The fastest way to install Evennia is to use the Evennia is managed from the terminal (console/Command Prompt on Windows). Once you have Python, you install Evennia with Windows users only: You now need to run Note Windows users only -
+You now need to run Once installed, make sure the You can also clone Evennia from github or use docker. Some users have also experimented with installing Evennia on Android. We will create a new “game dir” for you do create your game in. Here (and in
the rest of the Evennia documentation) we refer to this game dir as This will create a new folder The game dir doesn’t need to have the exact same name as your game. You can set the name of your game later by editing Evennia development can be made without any Internet connection beyond fetching updates. At some
-point however, you are likely to want to make your game visible online, either as part opening it to
-the public or to allow other developers or beta testers access to it. Evennia development can be made without any Internet connection beyond fetching updates. At some point however, you are likely to want to make your game visible online, either as part opening it to the public or to allow other developers or beta testers access to it. Accessing your Evennia server from the outside is not hard on its own. Any issues are usually due to the various security measures your computer, network or hosting service has. These will generally (and correctly) block outside access to servers on your machine unless you tell them otherwise. We will start by showing how to host your server on your own local computer. Even if you plan to
host your “real” game on a remote host later, setting it up locally is useful practice. We cover
remote hosting later in this document. Out of the box, Evennia uses three ports for outward communication. If your computer has a firewall,
-these should be open for in/out communication (and only these, other ports used by Evennia are
-internal to your computer only). Out of the box, Evennia uses three ports for outward communication. If your computer has a firewall, these should be open for in/out communication (and only these, other ports used by Evennia are internal to your computer only). Evennia will by default accept incoming connections on all interfaces ( Evennia will by default accept incoming connections on all interfaces ( Note If you need to reconfigure a router, the router’s Internet-facing ports do not have to have to have the same numbers as your computer’s (and Evennia’s) ports! For example, you might want
-to connect Evennia’s outgoing port 4001 to an outgoing router port 80 - this is the port HTTP
-requests use and web browsers automatically look for - if you do that you could go to
- If you need to reconfigure a router, the router’s Internet-facing ports do not have to have to have the same numbers as your computer’s (and Evennia’s) ports! For example, you might want to connect Evennia’s outgoing port 4001 to an outgoing router port 80 - this is the port HTTP requests use and web browsers automatically look for - if you do that you could go to You can connect Evennia to the Internet without any changes to your settings. The default settings
-are easy to use but are not necessarily the safest. You can customize your online presence in your
-settings file. To have Evennia recognize changed port settings you have
-to do a full Below is an example of a simple set of settings, mostly using the defaults. Evennia will require
-access to five computer ports, of which three (only) should be open to the outside world. Below we
+ You can connect Evennia to the Internet without any changes to your settings. The default settings are easy to use but are not necessarily the safest. You can customize your online presence in your settings file. To have Evennia recognize changed port settings you have to do a full Below is an example of a simple set of settings, mostly using the defaults. Evennia will require access to five computer ports, of which three (only) should be open to the outside world. Below we
continue to assume that our server address is The The The web server is always configured with two ports at a time. The outgoing port ( The internal port ( The websocket-based web client needs to be able to call back to the server, and these settings must
-be changed for it to find where to look. If it cannot find the server you will get an warning in
-your browser’s Console (in the dev tools of the browser), and the client will revert to the AJAX-
+ The websocket-based web client needs to be able to call back to the server, and these settings must be changed for it to find where to look. If it cannot find the server you will get an warning in your browser’s Console (in the dev tools of the browser), and the client will revert to the AJAX-
based of the client instead, which tends to be slower. The The Once your game is online you should make sure to register it with the Evennia Game
-Index. Registering with the index will help people find your server,
-drum up interest for your game and also shows people that Evennia is being used. You can do this
-even if you are just starting development - if you don’t give any telnet/web address it will appear
-as Not yet public and just be a teaser. If so, pick pre-alpha as the development status. Once your game is online you should make sure to register it with the Evennia Game Index. Registering with the index will help people find your server, drum up interest for your game and also shows people that Evennia is being used. You can do this even if you are just starting development - if you don’t give any telnet/web address it will appear as Not yet public and just be a teaser. If so, pick pre-alpha as the development status. To register, stand in your game dir, run Let’s Encrypt is a certificate authority offering free certificates to
-secure a website with HTTPS. To get started issuing a certificate for your web server using Let’s
-Encrypt, see these links: Let’s Encrypt is a certificate authority offering free certificates to secure a website with HTTPS. To get started issuing a certificate for your web server using Let’s Encrypt, see these links: The CertBot Client is a program for automatically obtaining a
-certificate, use it and maintain it with your website. The CertBot Client is a program for automatically obtaining a certificate, use it and maintain it with your website. Also, on Freenode visit the #letsencrypt channel for assistance from the community. For an
-additional resource, Let’s Encrypt has a very active community
-forum. [A blog where someone sets up Let’s Encrypt](https://www.digitalocean.com/community/tutorials/how-
-to-secure-apache-with-let-s-encrypt-on-ubuntu-16-04) The only process missing from all of the above documentation is how to pass verification. This is
-how Let’s Encrypt verifies that you have control over your domain (not necessarily ownership, it’s
-Domain Validation (DV)). This can be done either with configuring a certain path on your web server
-or through a TXT record in your DNS. Which one you will want to do is a personal preference, but can
-also be based on your hosting choice. In a controlled/cPanel environment, you will most likely have
-to use DNS verification. Also, on Freenode visit the #letsencrypt channel for assistance from the community. For an additional resource, Let’s Encrypt has a very active community forum. [A blog where someone sets up Let’s Encrypt](https://www.digitalocean.com/community/tutorials/how- to-secure-apache-with-let-s-encrypt-on-ubuntu-16-04) The only process missing from all of the above documentation is how to pass verification. This is how Let’s Encrypt verifies that you have control over your domain (not necessarily ownership, it’s Domain Validation (DV)). This can be done either with configuring a certain path on your web server or through a TXT record in your DNS. Which one you will want to do is a personal preference, but can also be based on your hosting choice. In a controlled/cPanel environment, you will most likely have to use DNS verification. Apache webserver configuration (optional) Apache webserver configuration (optional) What we showed above is by far the simplest and probably cheapest option: Run Evennia on your own
-home computer. Moreover, since Evennia is its own web server, you don’t need to install anything
-extra to have a website. What we showed above is by far the simplest and probably cheapest option: Run Evennia on your own home computer. Moreover, since Evennia is its own web server, you don’t need to install anything extra to have a website. Advantages Free (except for internet costs and the electrical bill). No support or safety - if your house burns down, so will your game. Also, you are yourself
responsible for doing regular backups. Potentially not as easy if you don’t know how to open ports in your firewall or router. Home IP numbers are often dynamically allocated, so for permanent online time you need to set up a
-DNS to always re-point to the right place (see below). You are personally responsible for any use/misuse of your internet connection– though unlikely
-(but not impossible) if running your server somehow causes issues for other customers on the
-network, goes against your ISP’s terms of service (many ISPs insist on upselling you to a business-
-tier connection) or you are the subject of legal action by a copyright holder, you may find your
-main internet connection terminated as a consequence. Home IP numbers are often dynamically allocated, so for permanent online time you need to set up a DNS to always re-point to the right place (see below). - You are personally responsible for any use/misuse of your internet connection– though unlikely (but not impossible) if running your server somehow causes issues for other customers on the network, goes against your ISP’s terms of service (many ISPs insist on upselling you to a business- tier connection) or you are the subject of legal action by a copyright holder, you may find your main internet connection terminated as a consequence. The first section of this page describes how to do this
-and allow users to connect to the IP address of your machine/router. The first section of this page describes how to do this and allow users to connect to the IP address of your machine/router. A complication with using a specific IP address like this is that your home IP might not remain the
same. Many ISPs (Internet Service Providers) allocates a dynamic IP to you which could change at
any time. When that happens, that IP you told people to go to will be worthless. Also, that long
@@ -581,10 +537,10 @@ sufficient resources to operate a Cloud9 development environment without charge.
modules |
Making Evennia, HTTPS and WSS (Secure Websockets) play nicely together Hackers these days aren’t discriminating, and their backgrounds range from bored teenagers to
-international intelligence agencies. Their scripts and bots endlessly crawl the web, looking for
-vulnerable systems they can break into. Who owns the system is irrelevant– it doesn’t matter if it
-belongs to you or the Pentagon, the goal is to take advantage of poorly-secured systems and see what
-resources can be controlled or stolen from them. If you’re considering deploying to a cloud-based host, you have a vested interest in securing your
-applications– you likely have a credit card on file that your host can freely bill. Hackers pegging
-your CPU to mine cryptocurrency or saturating your network connection to participate in a botnet or
-send spam can run up your hosting bill, get your service suspended or get your address/site
+ Hackers these days aren’t discriminating, and their backgrounds range from bored teenagers to international intelligence agencies. Their scripts and bots endlessly crawl the web, looking for vulnerable systems they can break into. Who owns the system is irrelevant– it doesn’t matter if it belongs to you or the Pentagon, the goal is to take advantage of poorly-secured systems and see what resources can be controlled or stolen from them. If you’re considering deploying to a cloud-based host, you have a vested interest in securing your applications– you likely have a credit card on file that your host can freely bill. Hackers pegging your CPU to mine cryptocurrency or saturating your network connection to participate in a botnet or send spam can run up your hosting bill, get your service suspended or get your address/site
blacklisted by ISPs. It can be a difficult legal or political battle to undo this damage after the
fact. As a developer about to expose a web application to the threat landscape of the modern internet,
@@ -130,65 +123,39 @@ here are a few tips to consider to increase the security of your Evennia install
In case of emergency, check your logs! By default they are located in the There are a few Evennia/Django options that are set when you first create your game to make it more
-obvious to you where problems arise. These options should be disabled before you push your game into
-production– leaving them on can expose variables or code someone with malicious intent can easily
-abuse to compromise your environment. There are a few Evennia/Django options that are set when you first create your game to make it more obvious to you where problems arise. These options should be disabled before you push your game into production– leaving them on can expose variables or code someone with malicious intent can easily abuse to compromise your environment. In as-is.
-# Note the leading period– it is not a typo!
-ALLOWED_HOSTS = [‘.example.com’] If you decide to allow users to upload their own images to be served from your site, special care
-must be taken. Django will read the file headers to confirm it’s an image (as opposed to a document
-or zip archive), but code can be injected into an image
-file after the headers
-that can be interpreted as HTML and/or give an attacker a web shell through which they can access
+ If you decide to allow users to upload their own images to be served from your site, special care must be taken. Django will read the file headers to confirm it’s an image (as opposed to a document or zip archive), but code can be injected into an image file after the headers that can be interpreted as HTML and/or give an attacker a web shell through which they can access
other filesystem resources. Django has a more comprehensive overview of how to handle user-uploaded
-files, but
-in short you should take care to do one of two things– Django has a more comprehensive overview of how to handle user-uploaded files, but
+in short you should take care to do one of two things: Serve all user-uploaded assets from a separate domain or CDN (not a subdomain of the one you
-already have!). For example, you may be browsing If you don’t want to pay for a second domain, don’t understand what any of this means or can’t be
-bothered with additional infrastructure, then simply reprocess user images upon receipt using an
-image library. Convert them to a different format, for example. Destroy the originals! Serve all user-uploaded assets from a separate domain or CDN (not a subdomain of the one you already have!). For example, you may be browsing If you don’t want to pay for a second domain, don’t understand what any of this means or can’t be bothered with additional infrastructure, then simply reprocess user images upon receipt using an image library. Convert them to a different format, for example. Destroy the originals! The web interface allows visitors to see an informational page as well as log into a browser-based
-telnet client with which to access Evennia. It also provides authentication endpoints against which
-an attacker can attempt to validate stolen lists of credentials to see which ones might be shared by
-your users. Django’s security is robust, but if you don’t want/need these features and fully intend
+ The web interface allows visitors to see an informational page as well as log into a browser-based telnet client with which to access Evennia. It also provides authentication endpoints against which an attacker can attempt to validate stolen lists of credentials to see which ones might be shared by your users. Django’s security is robust, but if you don’t want/need these features and fully intend
to force your users to use traditional clients to access your game, you might consider disabling
either/both to minimize your attack surface. In Automated attacks will often target port 22 seeing as how it’s the standard port for SSH traffic.
-Also,
-many public wifi hotspots block ssh traffic over port 22 so you might not be able to access your
-server from these locations if you like to work remotely or don’t have a home internet connection. If you don’t intend on running a website or securing it with TLS, you can mitigate both problems by
-changing the port used for ssh to 443, which most/all hotspot providers assume is HTTPS traffic and
-allows through. Automated attacks will often target port 22 seeing as how it’s the standard port for SSH traffic. Also, many public wifi hotspots block ssh traffic over port 22 so you might not be able to access your server from these locations if you like to work remotely or don’t have a home internet connection. If you don’t intend on running a website or securing it with TLS, you can mitigate both problems by changing the port used for ssh to 443, which most/all hotspot providers assume is HTTPS traffic and allows through. (Ubuntu) In /etc/ssh/sshd_config, change the following variable: UFW’s default policy is to deny everything. We must specify what we want to allow through our
-firewall. UFW’s default policy is to deny everything. We must specify what we want to allow through our firewall. Now the only ports open will be your administrative ssh port (whichever you chose), and Evennia on
-4000-4001. Now the only ports open will be your administrative ssh port (whichever you chose), and Evennia on 4000-4001. Though not officially supported, there are some benefits to deploying a webserver
-to handle/proxy traffic to your Evennia instance. For example, Evennia’s game engine and webservice are tightly integrated. If you bring your game
-down for maintenance (or if it simply crashes) your website will go down with it. In these cases a
-standalone webserver can still be used to display a maintenance page or otherwise communicate to
-your users the reason for the downtime, instead of disappearing off the face of the earth and
-returning opaque Proper webservers are also written in more efficient programming languages than Python, and while
-Twisted can handle its own, putting a webserver in front of it is like hiring a bouncer to deal with
-nuisances and crowds before they even get in the door. Many of the popular webservers also let you plug in additional modules (like
-mod_security for Apache) that can be used to detect
-(and block!) malicious users or requests before they even touch your game or site. There are also
-automated solutions for installing and configuring TLS (via Certbot/Let’s
-Encrypt) to secure your website against hotspot and
-ISP snooping. There are some benefits to deploying a proxy in front of your Evennia server; notably it means you can serve Evennia website and webclient data from an HTTPS: url (with encryption). Any proxy can be used, for example: Game Settings and Configuration directory Evennia runs out of the box without any changes to its settings. But there are several important
ways to customize the server and expand it with your own plugins. All game-specific settings are located in the You should never edit Warning: It may be tempting to copy everything from Warning Don’t copy everything!
+It may be tempting to copy everything from In code, the settings is accessed through Each setting appears as a property on the imported Each setting appears as a property on the imported When importing Some other Evennia systems can be customized by plugin modules but has no explicit template in
cmdparser.py - a custom module can be used to totally replace Evennia’s default command parser.
-All this does is to split the incoming string into “command name” and “the rest”. It also handles
-things like error messages for no-matches and multiple-matches among other things that makes this
-more complex than it sounds. The default parser is very generic, so you are most often best served
-by modifying things further down the line (on the command parse level) than here. at_search.py - this allows for replacing the way Evennia handles search results. It allows to
-change how errors are echoed and how multi-matches are resolved and reported (like how the default
-understands that “2-ball” should match the second “ball” object if there are two of them in the
-room). cmdparser.py - a custom module can be used to totally replace Evennia’s default command parser. All this does is to split the incoming string into “command name” and “the rest”. It also handles things like error messages for no-matches and multiple-matches among other things that makes this more complex than it sounds. The default parser is very generic, so you are most often best served by modifying things further down the line (on the command parse level) than here. at_search.py - this allows for replacing the way Evennia handles search results. It allows to change how errors are echoed and how multi-matches are resolved and reported (like how the default understands that “2-ball” should match the second “ball” object if there are two of them in the room). Game Settings and Configuration directory Test the batch processor.SQLite3¶
mygame/server/evennia.db3). This means it’s very easy to reset this
-database - just delete (or move) that evennia.db3 file and run evennia migrate again! No server
-process is needed and the administrative overhead and resource consumption is tiny. It is also very
-fast since it’s run in-memory. For the vast majority of Evennia installs it will probably be all
+database - just delete (or move) that evennia.db3 file and run evennia migrate again! No server process is needed and the administrative overhead and resource consumption is tiny. It is also very fast since it’s run in-memory. For the vast majority of Evennia installs it will probably be all
that’s ever needed.
-
Install of SQlite3¶
-mygame/server/evennia.db3 when you runmygame/server/evennia.db3 when you runevennia migrate
sqlite3 client program -
-this is required if you want to inspect the database data manually. A shortcut for using it with the
-evennia database is evennia dbshell. Linux users should look for the sqlite3 package for their
-distro while Mac/Windows should get the sqlite-tools package from this
-page.sqlite3 client program - this is required if you want to inspect the database data manually. A shortcut for using it with the
+evennia database is evennia dbshell. Linux users should look for the sqlite3 package for their distro while Mac/Windows should get the sqlite-tools package from this page. sqlite3 server/evennia.db3
# or
@@ -177,6 +160,14 @@ page.
.help for instructions and .quit to exit.
See here for a cheat-sheet of commands.Resetting SQLite3 database¶
+mygame/server/evennia.db3. Then run evennia migrate again.PostgreSQL¶
@@ -440,14 +431,14 @@ others. If you try other databases out, consider expanding this page with instru
modules |
Navigation
@@ -30,10 +30,10 @@
modules |
Previous topic
- Next topic
+ title="previous chapter">Online Setup
+ Next topic
+
@@ -153,7 +153,7 @@ new
+
@@ -283,10 +283,10 @@ parameter to disable it for that Evennia account permanently.
modules |
Navigation
@@ -29,15 +27,8 @@
Table of Contents
-
-
mod_wsgi Setup
-mod_proxy and mod_ssl setup
+
- Previous topic
- Next topic
-
Links
@@ -110,7 +94,7 @@
Versions
-
Apache Config¶
-
-mod_wsgi Setup¶Install
-mod_wsgi¶
-
mod_wsgi are available in the standard package
-repositories for Fedora and RHEL:$ dnf install httpd mod_wsgi
-or
-$ yum install httpd mod_wsgi
-
Configuring an Apache Proxy¶
+mod_wsgi are available in the standard package
-repositories for Ubuntu and Debian:$ apt-get update
-$ apt-get install apache2 libapache2-mod-wsgi
-
Copy and modify the VHOST¶
-mod_wsgi is installed, copy the evennia/web/utils/evennia_wsgi_apache.conf file to your
-apache2 vhosts/sites folder. On Debian/Ubuntu, this is /etc/apache2/sites-enabled/. Make your
-modifications after copying the file there.Restart/Reload Apache¶
-
-
-$ systemctl restart httpd
-
$ systemctl restart apache2
-
Enjoy¶
-A note on code reloading¶
-mod_wsgi is set up to run on daemon mode (as will be the case by default on Debian and
-Ubuntu), you may tell mod_wsgi to reload by using the touch command on
-evennia/game/web/utils/apache_wsgi.conf. When mod_wsgi sees that the file modification time has
-changed, it will force a code reload. Any modifications to the code will not be propagated to the
-live instance of your site until reloaded.Further notes and hints:¶
-Permission denied errors from Apache, make sure
-that your evennia directory is located in a place the webserver may actually access. For example,
-some Linux distributions may default to very restrictive access permissions on a user’s /home
-directory.<Directory "/home/<yourname>/evennia/game/web">
- Options +ExecCGI
- Allow from all
-</Directory>
-
-mod_proxy and mod_ssl setup¶mod_proxy_http,
+Running Apache as a proxy in front of Evennia¶
+mod_proxy_http,
mod_proxy_wstunnel, and mod_ssl. mod_proxy_http and mod_proxy_wstunnel will simply be
-referred to as
-mod_proxy below.mod_proxy below.Install
mod_ssl¶
-
mod_ssl are available in the standard package
-repositories for Fedora and RHEL:mod_ssl are available in the standard package repositories for Fedora and RHEL:$ dnf install httpd mod_ssl
or
$ yum install httpd mod_ssl
@@ -230,10 +129,7 @@ $ yum install httpd mod_ssl
mod_ssljkl are installed together in the apache2
-package and available in the
-standard package repositories for Ubuntu and Debian. mod_ssl needs to be enabled after
-installation:mod_ssljkl are installed together in the apache2 package and available in the standard package repositories for Ubuntu and Debian. mod_ssl needs to be enabled after installation:$ apt-get update
$ apt-get install apache2
$ a2enmod ssl
@@ -289,14 +185,92 @@ proxy. You must set the
WEBSOCKET_CLIENT_URL = "wss://external.example.com/ws"
wss:// is
-because our client will be communicating over an encrypted connection (“wss” indicates websocket
-over SSL/TLS). Also, especially note the additional path /ws at the end of the URL. This is how
+wss:// is because our client will be communicating over an encrypted connection (“wss” indicates websocket over SSL/TLS). Also, especially note the additional path /ws at the end of the URL. This is how
Apache HTTP Server identifies that a particular request should be proxied to Evennia’s websocket
port but this should be applicable also to other types of proxies (like nginx).Run Apache instead of the Evennia webserver¶
+Install
+mod_wsgi¶
+
+mod_wsgi are available in the standard package
+repositories for Fedora and RHEL:$ dnf install httpd mod_wsgi
+or
+$ yum install httpd mod_wsgi
+
mod_wsgi are available in the standard package
+repositories for Ubuntu and Debian:$ apt-get update
+$ apt-get install apache2 libapache2-mod-wsgi
+
Copy and modify the VHOST¶
+mod_wsgi is installed, copy the evennia/web/utils/evennia_wsgi_apache.conf file to your
+apache2 vhosts/sites folder. On Debian/Ubuntu, this is /etc/apache2/sites-enabled/. Make your
+modifications after copying the file there.Restart/Reload Apache¶
+
+
+$ systemctl restart httpd
+
$ systemctl restart apache2
+
A note on code reloading¶
+mod_wsgi is set up to run on daemon mode (as will be the case by default on Debian and
+Ubuntu), you may tell mod_wsgi to reload by using the touch command on
+evennia/game/web/utils/apache_wsgi.conf. When mod_wsgi sees that the file modification time has
+changed, it will force a code reload. Any modifications to the code will not be propagated to the
+live instance of your site until reloaded.Further notes and hints:¶
+Permission denied errors from Apache, make sure
+that your evennia directory is located in a place the webserver may actually access. For example,
+some Linux distributions may default to very restrictive access permissions on a user’s /home
+directory.<Directory "/home/<yourname>/evennia/game/web">
+ Options +ExecCGI
+ Allow from all
+</Directory>
+
Navigation
@@ -30,14 +30,14 @@
modules |
Table of Contents
-
+
Previous topic
-
+
Next topic
-
+
Links
@@ -95,7 +95,7 @@
Versions
-
Making Evennia, HTTPS and WSS (Secure Websockets) play nicely together¶
+ Configuring HAProxy¶
https: rather than http: for the website and
wss: rather than vs ws: for websocket connections used by webclient.Navigation
@@ -30,10 +30,10 @@
modules |
Previous topic
-
+
Next topic
-
+
@@ -193,10 +193,10 @@ if you are not ready for players yet.
modules |
evennia program) you installed in the virtualenv!evennia command will not be available.
Windows Install¶
-
cd isn’t working you can use pushd instead to force the
-directory change.cd isn’t working you can use pushd instead to force the directory change.git clone https://github.com/evennia/evennia.git
diff --git a/docs/1.0-dev/Setup/Installation-Non-Interactive.html b/docs/1.0-dev/Setup/Installation-Non-Interactive.html
index 51a8739711..7bdded661e 100644
--- a/docs/1.0-dev/Setup/Installation-Non-Interactive.html
+++ b/docs/1.0-dev/Setup/Installation-Non-Interactive.html
@@ -110,7 +110,6 @@ build script:
EVENNIA_SUPERUSER_USERNAME=myname EVENNIA_SUPERUSER_PASSWORD=mypwd evennia start
-
Table of Contents
+
pipRequirements¶
+
+
add python to path. If you have multiple versions of Python installed, use py command instead of python to have Windows automatically use the latest.Install with
+pip¶pip installer that comes with Python.
+You can also clone Evennia from github or use docker. Some users have also experimented with installing Evennia on Android.pip install evennia
pip install --upgrade evennia
-
+python -m evennia once. This should permanently make the evennia command available in your environment.python -m evennia once. This should permanently make the evennia command available in your environment.evennia command works. Use evennia -h for usage help. If you are using a virtualenv, make sure it’s active whenever you need to use the evennia command later.
-
+
Initialize a new game¶
mygame, but you should of course name your game whatever you like.evennia --init mygame
mygame (or whatever you chose) in your current location. This
contains empty templates and all the default settings needed to start the server.
-
mygame/server/conf/settings.py.Start the new game¶
diff --git a/docs/1.0-dev/Setup/Online-Setup.html b/docs/1.0-dev/Setup/Online-Setup.html
index 2fc6d4ddd3..83be64a6a4 100644
--- a/docs/1.0-dev/Setup/Online-Setup.html
+++ b/docs/1.0-dev/Setup/Online-Setup.html
@@ -17,8 +17,8 @@
-
-
+
+
Navigation
@@ -30,10 +30,10 @@
modules |
Table of Contents
-
+
Previous topic
-
+
Next topic
-
+
@@ -132,26 +132,20 @@
Online Setup¶
-Connecting to Evennia across the Internet¶
+Connecting to Evennia over the Internet¶
-4000, telnet, for traditional mud clients4001, HTTP for the website)4002, websocket, for the web client0.0.0.0) so in principle
-anyone knowing the ports to use and has the IP address to your machine should be able to connect to
-your game.0.0.0.0) so in principle anyone knowing the ports to use and has the IP address to your machine should be able to connect to your game.http://203.0.113.0 without having to add the port at the end. This would collide with any other
-web services you are running through this router though.http://203.0.113.0 without having to add the port at the end. This would collide with any other web services you are running through this router though.Settings example¶
-evennia reboot to also restart the Portal and not just the Server component.evennia reboot to also restart the Portal and not just the Server component.203.0.113.0.# in mygame/server/conf/settings.py
@@ -222,9 +208,7 @@ continue to assume that our server address is
TELNET_INTERFACES = ['0.0.0.0']
TELNET_* settings are the most important ones for getting a traditional base game going. Which
-IP addresses you have available depends on your server hosting solution (see the next sections).
-Some hosts will restrict which ports you are allowed you use so make sure to check.TELNET_* settings are the most important ones for getting a traditional base game going. Which IP addresses you have available depends on your server hosting solution (see the next sections). Some hosts will restrict which ports you are allowed you use so make sure to check.Web server¶
@@ -247,8 +231,8 @@ Some hosts will restrict which ports you are allowed you use so make sure to che
4001 by
default) is the port external connections can use. If you don’t want users to have to specify the
port when they connect, you should set this to 80 - this however only works if you are not running
-any other web server on the machine.
-The internal port (4005 by default) is used internally by Evennia to communicate between the
+any other web server on the machine.4005 by default) is used internally by Evennia to communicate between the
Server and the Portal. It should not be available to the outside world. You usually only need to
change the outgoing port unless the default internal port is clashing with some other program.AMP_PORT is required to work, since this is the internal port linking Evennia’s
-Server and Portal components together. The other ports are encrypted ports that may be
-useful for custom protocols but are otherwise not used.AMP_PORT is required to work, since this is the internal port linking Evennia’s Server and Portal components together. The other ports are encrypted ports that may be useful for custom protocols but are otherwise not used.Lockdown mode¶
@@ -300,11 +280,7 @@ again, your game will only be accessible from localhost.
Registering with the Evennia game directory¶
-evennia connections
Let’s Encrypt¶
-
-Relevant SSL Proxy Setup Information¶
-
Hosting Evennia from your own computer¶
-
Setting up your own machine as a server¶
-Navigation
@@ -30,14 +30,14 @@
modules |
Table of Contents
-
Previous topic
-
+
Next topic
- Links
@@ -99,7 +99,7 @@
Versions
-
Security¶
-Security Hints and Practices¶
+server/logs/ folder.
Here are some of the more important ones and why you should care:
-
http_requests.log will show you what HTTP requests have been made against Evennia’s built-in
-webserver (TwistedWeb). This is a good way to see if people are innocuously browsing your site or
-trying to break it through code injection.portal.log will show you various networking-related information. This is a good place to check
-for odd or unusual types or amounts of connections to your game, or other networking-related
-issues– like when users are reporting an inability to connect.server.log is the MUX administrator’s best friend. Here is where you’ll find information
-pertaining to who’s trying to break into your system by guessing at passwords, who created what
-objects, and more. If your game fails to start or crashes and you can’t tell why, this is the first
-place you should look for answers. Security-related events are prefixed with an [SS] so when
-there’s a problem you might want to pay special attention to those.http_requests.log will show you what HTTP requests have been made against Evennia’s built-in webserver (TwistedWeb). This is a good way to see if people are innocuously browsing your site or trying to break it through code injection.portal.log will show you various networking-related information. This is a good place to check for odd or unusual types or amounts of connections to your game, or other networking-related issues– like when users are reporting an inability to connect.server.log is the MUX administrator’s best friend. Here is where you’ll find information pertaining to who’s trying to break into your system by guessing at passwords, who created what objects, and more. If your game fails to start or crashes and you can’t tell why, this is the first place you should look for answers. Security-related events are prefixed with an [SS] so when there’s a problem you might want to pay special attention to those.Disable development/debugging options¶
-server/conf/settings.py:# Disable Django's debug mode
DEBUG = False
# Disable the in-game equivalent
IN_GAME_ERRORS = False
-# If you've registered a domain name, force Django to check host headers. Otherwise leave this
+# If you've registered a domain name, force Django to check host headers. Otherwise leave this as-is.
+# Note the leading period-- it is not a typo!
+ALLOWED_HOSTS = ['.example.com']
Handle user-uploaded images with care¶
-
-
reddit.com but note that all the user-submitted
-images are being served from the redd.it domain. There are both security and performance benefits
-to this (webservers tend to load local resources one-by-one, whereas they will request external
-resources in bulk).reddit.com but note that all the user-submitted images are being served from the redd.it domain. There are both security and performance benefits to this (webservers tend to load local resources one-by-one, whereas they will request external resources in bulk).Disable the web interface¶
-Disable the web interface (if you only want telnet)¶
+server/conf/settings.py:Change your ssh port¶
-# What ports, IPs and protocols we listen for
Port 443
@@ -225,8 +187,7 @@ Port 443
sudo apt-get install ufw
# Allow terminal connections to your game
sudo ufw allow 4000/tcp
# Allow browser connections to your website
@@ -242,27 +203,17 @@ sudo ufw allow 443/tcp
sudo ufw enable
Use an external webserver¶
-SERVER NOT FOUND error messages.Use an external webserver / proxy¶
+-[HaProxy](./Config-HAProxy.md)
+-[Apache as a proxy](./Config-Apache-Proxy.md)
+- Nginx
+- etc.
+
Navigation
@@ -30,10 +30,10 @@
modules |
Previous topic
Next topic
-
+
@@ -1334,10 +1334,10 @@ to change into
myga
modules |
Table of Contents
-
+
Game Settings and Configuration directory¶
+ Changing Game Settings¶
mygame/server/conf/ directory.evennia/settings_default.py. Rather you should copy&paste the select
variables you want to change into your settings.py and edit them there. This will overload the
previously imported defaults.
-
+settings_default.py into your own settings
-file. There is a reason we don’t do this out of the box though: it makes it directly clear what
-changes you did. Also, if you limit your copying to the things you really need you will directly be
-able to take advantage of upstream changes and additions to Evennia for anything you didn’t
-customize.settings_default.py into your own settings file just to have it all in one place. Don’t do this. By copying only what you need, you can easier track what you changed. from django.conf import settings
# or (shorter):
@@ -140,9 +138,7 @@ customize.
servername = settings.SERVER_NAME
settings object. You can also explore all
-possible options with evennia.settings_full (this also includes advanced Django defaults that are
-not touched in default Evennia).settings object. You can also explore all possible options with evennia.settings_full (this also includes advanced Django defaults that are not touched in default Evennia).
settings into your code like this, it will be read
only. You cannot edit your settings from your code! The only way to change an Evennia setting is
@@ -185,15 +181,8 @@ services to the Server instead. More info can be found
conf/:
-
@@ -221,7 +210,7 @@ room).
>previous |
+
pipConfiguration¶
-
+
-
-
-
-
Going public¶
+
-
-
Next topic
@@ -295,7 +295,7 @@ In-game you should now get the message that the Server has successfully restarte
modules |
@@ -164,7 +164,7 @@ method. Otherwise all text will be returned to all connected sessions.
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 e015011647..b194c1c8e9 100644
--- a/docs/1.0-dev/api/evennia.commands.default.building.html
+++ b/docs/1.0-dev/api/evennia.commands.default.building.html
@@ -1345,7 +1345,7 @@ server settings.
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 '}¶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 '}¶
aliases = ['@parent', '@update', '@type', '@swap', '@typeclasses']¶aliases = ['@swap', '@type', '@update', '@parent', '@typeclasses']¶
@@ -1376,7 +1376,7 @@ server settings.
diff --git a/docs/1.0-dev/api/evennia.commands.default.comms.html b/docs/1.0-dev/api/evennia.commands.default.comms.html
index c78ef6328f..c2f746c095 100644
--- a/docs/1.0-dev/api/evennia.commands.default.comms.html
+++ b/docs/1.0-dev/api/evennia.commands.default.comms.html
@@ -256,7 +256,7 @@ ban mychannel1,mychannel2= EvilUser : Was banned for spamming.
search_index_entry = {'aliases': '@parent @update @type @swap @typeclasses', 'category': 'building', 'key': '@typeclass', 'no_prefix': 'typeclass parent update type swap typeclasses', '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': '@swap @type @update @parent @typeclasses', 'category': 'building', 'key': '@typeclass', 'no_prefix': 'typeclass swap type update parent typeclasses', '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 "}¶
@@ -782,7 +782,7 @@ don’t actually sub to yet.
@@ -935,7 +935,7 @@ ban mychannel1,mychannel2= EvilUser : Was banned for spamming.
search_index_entry = {'aliases': '@chan @channels', 'category': 'comms', 'key': '@channel', 'no_prefix': 'channel chan channels', 'tags': '', 'text': "\n Use and manage in-game channels.\n\n Usage:\n channel channelname <msg>\n channel channel name = <msg>\n channel (show all subscription)\n channel/all (show available channels)\n channel/alias channelname = alias[;alias...]\n channel/unalias alias\n channel/who channelname\n channel/history channelname [= index]\n channel/sub channelname [= alias[;alias...]]\n channel/unsub channelname[,channelname, ...]\n channel/mute channelname[,channelname,...]\n channel/unmute channelname[,channelname,...]\n\n channel/create channelname[;alias;alias[:typeclass]] [= description]\n channel/destroy channelname [= reason]\n channel/desc channelname = description\n channel/lock channelname = lockstring\n channel/unlock channelname = lockstring\n channel/ban channelname (list bans)\n channel/ban[/quiet] channelname[, channelname, ...] = subscribername [: reason]\n channel/unban[/quiet] channelname[, channelname, ...] = subscribername\n channel/boot[/quiet] channelname[,channelname,...] = subscribername [: reason]\n\n # subtopics\n\n ## sending\n\n Usage: channel channelname msg\n channel channel name = msg (with space in channel name)\n\n This sends a message to the channel. Note that you will rarely use this\n command like this; instead you can use the alias\n\n channelname <msg>\n channelalias <msg>\n\n For example\n\n public Hello World\n pub Hello World\n\n (this shortcut doesn't work for aliases containing spaces)\n\n See channel/alias for help on setting channel aliases.\n\n ## alias and unalias\n\n Usage: channel/alias channel = alias[;alias[;alias...]]\n channel/unalias alias\n channel - this will list your subs and aliases to each channel\n\n Set one or more personal aliases for referencing a channel. For example:\n\n channel/alias warrior's guild = warrior;wguild;warchannel;warrior guild\n\n You can now send to the channel using all of these:\n\n warrior's guild Hello\n warrior Hello\n wguild Hello\n warchannel Hello\n\n Note that this will not work if the alias has a space in it. So the\n 'warrior guild' alias must be used with the `channel` command:\n\n channel warrior guild = Hello\n\n Channel-aliases can be removed one at a time, using the '/unalias' switch.\n\n ## who\n\n Usage: channel/who channelname\n\n List the channel's subscribers. Shows who are currently offline or are\n muting the channel. Subscribers who are 'muting' will not see messages sent\n to the channel (use channel/mute to mute a channel).\n\n ## history\n\n Usage: channel/history channel [= index]\n\n This will display the last |c20|n lines of channel history. By supplying an\n index number, you will step that many lines back before viewing those 20 lines.\n\n For example:\n\n channel/history public = 35\n\n will go back 35 lines and show the previous 20 lines from that point (so\n lines -35 to -55).\n\n ## sub and unsub\n\n Usage: channel/sub channel [=alias[;alias;...]]\n channel/unsub channel\n\n This subscribes you to a channel and optionally assigns personal shortcuts\n for you to use to send to that channel (see aliases). When you unsub, all\n your personal aliases will also be removed.\n\n ## mute and unmute\n\n Usage: channel/mute channelname\n channel/unmute channelname\n\n Muting silences all output from the channel without actually\n un-subscribing. Other channel members will see that you are muted in the /who\n list. Sending a message to the channel will automatically unmute you.\n\n ## create and destroy\n\n Usage: channel/create channelname[;alias;alias[:typeclass]] [= description]\n channel/destroy channelname [= reason]\n\n Creates a new channel (or destroys one you control). You will automatically\n join the channel you create and everyone will be kicked and loose all aliases\n to a destroyed channel.\n\n ## lock and unlock\n\n Usage: channel/lock channelname = lockstring\n channel/unlock channelname = lockstring\n\n Note: this is an admin command.\n\n A lockstring is on the form locktype:lockfunc(). Channels understand three\n locktypes:\n listen - who may listen or join the channel.\n send - who may send messages to the channel\n control - who controls the channel. This is usually the one creating\n the channel.\n\n Common lockfuncs are all() and perm(). To make a channel everyone can\n listen to but only builders can talk on, use this:\n\n listen:all()\n send: perm(Builders)\n\n ## boot and ban\n\n Usage:\n channel/boot[/quiet] channelname[,channelname,...] = subscribername [: reason]\n channel/ban channelname[, channelname, ...] = subscribername [: reason]\n channel/unban channelname[, channelname, ...] = subscribername\n channel/unban channelname\n channel/ban channelname (list bans)\n\n Booting will kick a named subscriber from channel(s) temporarily. The\n 'reason' will be passed to the booted user. Unless the /quiet switch is\n used, the channel will also be informed of the action. A booted user is\n still able to re-connect, but they'll have to set up their aliases again.\n\n Banning will blacklist a user from (re)joining the provided channels. It\n will then proceed to boot them from those channels if they were connected.\n The 'reason' and `/quiet` works the same as for booting.\n\n Example:\n boot mychannel1 = EvilUser : Kicking you to cool down a bit.\n ban mychannel1,mychannel2= EvilUser : Was banned for spamming.\n\n "}¶search_index_entry = {'aliases': '@channels @chan', 'category': 'comms', 'key': '@channel', 'no_prefix': 'channel channels chan', 'tags': '', 'text': "\n Use and manage in-game channels.\n\n Usage:\n channel channelname <msg>\n channel channel name = <msg>\n channel (show all subscription)\n channel/all (show available channels)\n channel/alias channelname = alias[;alias...]\n channel/unalias alias\n channel/who channelname\n channel/history channelname [= index]\n channel/sub channelname [= alias[;alias...]]\n channel/unsub channelname[,channelname, ...]\n channel/mute channelname[,channelname,...]\n channel/unmute channelname[,channelname,...]\n\n channel/create channelname[;alias;alias[:typeclass]] [= description]\n channel/destroy channelname [= reason]\n channel/desc channelname = description\n channel/lock channelname = lockstring\n channel/unlock channelname = lockstring\n channel/ban channelname (list bans)\n channel/ban[/quiet] channelname[, channelname, ...] = subscribername [: reason]\n channel/unban[/quiet] channelname[, channelname, ...] = subscribername\n channel/boot[/quiet] channelname[,channelname,...] = subscribername [: reason]\n\n # subtopics\n\n ## sending\n\n Usage: channel channelname msg\n channel channel name = msg (with space in channel name)\n\n This sends a message to the channel. Note that you will rarely use this\n command like this; instead you can use the alias\n\n channelname <msg>\n channelalias <msg>\n\n For example\n\n public Hello World\n pub Hello World\n\n (this shortcut doesn't work for aliases containing spaces)\n\n See channel/alias for help on setting channel aliases.\n\n ## alias and unalias\n\n Usage: channel/alias channel = alias[;alias[;alias...]]\n channel/unalias alias\n channel - this will list your subs and aliases to each channel\n\n Set one or more personal aliases for referencing a channel. For example:\n\n channel/alias warrior's guild = warrior;wguild;warchannel;warrior guild\n\n You can now send to the channel using all of these:\n\n warrior's guild Hello\n warrior Hello\n wguild Hello\n warchannel Hello\n\n Note that this will not work if the alias has a space in it. So the\n 'warrior guild' alias must be used with the `channel` command:\n\n channel warrior guild = Hello\n\n Channel-aliases can be removed one at a time, using the '/unalias' switch.\n\n ## who\n\n Usage: channel/who channelname\n\n List the channel's subscribers. Shows who are currently offline or are\n muting the channel. Subscribers who are 'muting' will not see messages sent\n to the channel (use channel/mute to mute a channel).\n\n ## history\n\n Usage: channel/history channel [= index]\n\n This will display the last |c20|n lines of channel history. By supplying an\n index number, you will step that many lines back before viewing those 20 lines.\n\n For example:\n\n channel/history public = 35\n\n will go back 35 lines and show the previous 20 lines from that point (so\n lines -35 to -55).\n\n ## sub and unsub\n\n Usage: channel/sub channel [=alias[;alias;...]]\n channel/unsub channel\n\n This subscribes you to a channel and optionally assigns personal shortcuts\n for you to use to send to that channel (see aliases). When you unsub, all\n your personal aliases will also be removed.\n\n ## mute and unmute\n\n Usage: channel/mute channelname\n channel/unmute channelname\n\n Muting silences all output from the channel without actually\n un-subscribing. Other channel members will see that you are muted in the /who\n list. Sending a message to the channel will automatically unmute you.\n\n ## create and destroy\n\n Usage: channel/create channelname[;alias;alias[:typeclass]] [= description]\n channel/destroy channelname [= reason]\n\n Creates a new channel (or destroys one you control). You will automatically\n join the channel you create and everyone will be kicked and loose all aliases\n to a destroyed channel.\n\n ## lock and unlock\n\n Usage: channel/lock channelname = lockstring\n channel/unlock channelname = lockstring\n\n Note: this is an admin command.\n\n A lockstring is on the form locktype:lockfunc(). Channels understand three\n locktypes:\n listen - who may listen or join the channel.\n send - who may send messages to the channel\n control - who controls the channel. This is usually the one creating\n the channel.\n\n Common lockfuncs are all() and perm(). To make a channel everyone can\n listen to but only builders can talk on, use this:\n\n listen:all()\n send: perm(Builders)\n\n ## boot and ban\n\n Usage:\n channel/boot[/quiet] channelname[,channelname,...] = subscribername [: reason]\n channel/ban channelname[, channelname, ...] = subscribername [: reason]\n channel/unban channelname[, channelname, ...] = subscribername\n channel/unban channelname\n channel/ban channelname (list bans)\n\n Booting will kick a named subscriber from channel(s) temporarily. The\n 'reason' will be passed to the booted user. Unless the /quiet switch is\n used, the channel will also be informed of the action. A booted user is\n still able to re-connect, but they'll have to set up their aliases again.\n\n Banning will blacklist a user from (re)joining the provided channels. It\n will then proceed to boot them from those channels if they were connected.\n The 'reason' and `/quiet` works the same as for booting.\n\n Example:\n boot mychannel1 = EvilUser : Kicking you to cool down a bit.\n ban mychannel1,mychannel2= EvilUser : Was banned for spamming.\n\n "}¶
@@ -955,7 +955,7 @@ ban mychannel1,mychannel2= EvilUser : Was banned for spamming.
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 6d07a0887b..ea6d01d238 100644
--- a/docs/1.0-dev/api/evennia.commands.default.general.html
+++ b/docs/1.0-dev/api/evennia.commands.default.general.html
@@ -175,7 +175,7 @@ look *<account&g
search_index_entry = {'aliases': '@chan @channels', 'category': 'comms', 'key': '@channel', 'no_prefix': 'channel chan channels', 'tags': '', 'text': "\n Use and manage in-game channels.\n\n Usage:\n channel channelname <msg>\n channel channel name = <msg>\n channel (show all subscription)\n channel/all (show available channels)\n channel/alias channelname = alias[;alias...]\n channel/unalias alias\n channel/who channelname\n channel/history channelname [= index]\n channel/sub channelname [= alias[;alias...]]\n channel/unsub channelname[,channelname, ...]\n channel/mute channelname[,channelname,...]\n channel/unmute channelname[,channelname,...]\n\n channel/create channelname[;alias;alias[:typeclass]] [= description]\n channel/destroy channelname [= reason]\n channel/desc channelname = description\n channel/lock channelname = lockstring\n channel/unlock channelname = lockstring\n channel/ban channelname (list bans)\n channel/ban[/quiet] channelname[, channelname, ...] = subscribername [: reason]\n channel/unban[/quiet] channelname[, channelname, ...] = subscribername\n channel/boot[/quiet] channelname[,channelname,...] = subscribername [: reason]\n\n # subtopics\n\n ## sending\n\n Usage: channel channelname msg\n channel channel name = msg (with space in channel name)\n\n This sends a message to the channel. Note that you will rarely use this\n command like this; instead you can use the alias\n\n channelname <msg>\n channelalias <msg>\n\n For example\n\n public Hello World\n pub Hello World\n\n (this shortcut doesn't work for aliases containing spaces)\n\n See channel/alias for help on setting channel aliases.\n\n ## alias and unalias\n\n Usage: channel/alias channel = alias[;alias[;alias...]]\n channel/unalias alias\n channel - this will list your subs and aliases to each channel\n\n Set one or more personal aliases for referencing a channel. For example:\n\n channel/alias warrior's guild = warrior;wguild;warchannel;warrior guild\n\n You can now send to the channel using all of these:\n\n warrior's guild Hello\n warrior Hello\n wguild Hello\n warchannel Hello\n\n Note that this will not work if the alias has a space in it. So the\n 'warrior guild' alias must be used with the `channel` command:\n\n channel warrior guild = Hello\n\n Channel-aliases can be removed one at a time, using the '/unalias' switch.\n\n ## who\n\n Usage: channel/who channelname\n\n List the channel's subscribers. Shows who are currently offline or are\n muting the channel. Subscribers who are 'muting' will not see messages sent\n to the channel (use channel/mute to mute a channel).\n\n ## history\n\n Usage: channel/history channel [= index]\n\n This will display the last |c20|n lines of channel history. By supplying an\n index number, you will step that many lines back before viewing those 20 lines.\n\n For example:\n\n channel/history public = 35\n\n will go back 35 lines and show the previous 20 lines from that point (so\n lines -35 to -55).\n\n ## sub and unsub\n\n Usage: channel/sub channel [=alias[;alias;...]]\n channel/unsub channel\n\n This subscribes you to a channel and optionally assigns personal shortcuts\n for you to use to send to that channel (see aliases). When you unsub, all\n your personal aliases will also be removed.\n\n ## mute and unmute\n\n Usage: channel/mute channelname\n channel/unmute channelname\n\n Muting silences all output from the channel without actually\n un-subscribing. Other channel members will see that you are muted in the /who\n list. Sending a message to the channel will automatically unmute you.\n\n ## create and destroy\n\n Usage: channel/create channelname[;alias;alias[:typeclass]] [= description]\n channel/destroy channelname [= reason]\n\n Creates a new channel (or destroys one you control). You will automatically\n join the channel you create and everyone will be kicked and loose all aliases\n to a destroyed channel.\n\n ## lock and unlock\n\n Usage: channel/lock channelname = lockstring\n channel/unlock channelname = lockstring\n\n Note: this is an admin command.\n\n A lockstring is on the form locktype:lockfunc(). Channels understand three\n locktypes:\n listen - who may listen or join the channel.\n send - who may send messages to the channel\n control - who controls the channel. This is usually the one creating\n the channel.\n\n Common lockfuncs are all() and perm(). To make a channel everyone can\n listen to but only builders can talk on, use this:\n\n listen:all()\n send: perm(Builders)\n\n ## boot and ban\n\n Usage:\n channel/boot[/quiet] channelname[,channelname,...] = subscribername [: reason]\n channel/ban channelname[, channelname, ...] = subscribername [: reason]\n channel/unban channelname[, channelname, ...] = subscribername\n channel/unban channelname\n channel/ban channelname (list bans)\n\n Booting will kick a named subscriber from channel(s) temporarily. The\n 'reason' will be passed to the booted user. Unless the /quiet switch is\n used, the channel will also be informed of the action. A booted user is\n still able to re-connect, but they'll have to set up their aliases again.\n\n Banning will blacklist a user from (re)joining the provided channels. It\n will then proceed to boot them from those channels if they were connected.\n The 'reason' and `/quiet` works the same as for booting.\n\n Example:\n boot mychannel1 = EvilUser : Kicking you to cool down a bit.\n ban mychannel1,mychannel2= EvilUser : Was banned for spamming.\n\n "}¶search_index_entry = {'aliases': '@channels @chan', 'category': 'comms', 'key': '@channel', 'no_prefix': 'channel channels chan', 'tags': '', 'text': "\n Use and manage in-game channels.\n\n Usage:\n channel channelname <msg>\n channel channel name = <msg>\n channel (show all subscription)\n channel/all (show available channels)\n channel/alias channelname = alias[;alias...]\n channel/unalias alias\n channel/who channelname\n channel/history channelname [= index]\n channel/sub channelname [= alias[;alias...]]\n channel/unsub channelname[,channelname, ...]\n channel/mute channelname[,channelname,...]\n channel/unmute channelname[,channelname,...]\n\n channel/create channelname[;alias;alias[:typeclass]] [= description]\n channel/destroy channelname [= reason]\n channel/desc channelname = description\n channel/lock channelname = lockstring\n channel/unlock channelname = lockstring\n channel/ban channelname (list bans)\n channel/ban[/quiet] channelname[, channelname, ...] = subscribername [: reason]\n channel/unban[/quiet] channelname[, channelname, ...] = subscribername\n channel/boot[/quiet] channelname[,channelname,...] = subscribername [: reason]\n\n # subtopics\n\n ## sending\n\n Usage: channel channelname msg\n channel channel name = msg (with space in channel name)\n\n This sends a message to the channel. Note that you will rarely use this\n command like this; instead you can use the alias\n\n channelname <msg>\n channelalias <msg>\n\n For example\n\n public Hello World\n pub Hello World\n\n (this shortcut doesn't work for aliases containing spaces)\n\n See channel/alias for help on setting channel aliases.\n\n ## alias and unalias\n\n Usage: channel/alias channel = alias[;alias[;alias...]]\n channel/unalias alias\n channel - this will list your subs and aliases to each channel\n\n Set one or more personal aliases for referencing a channel. For example:\n\n channel/alias warrior's guild = warrior;wguild;warchannel;warrior guild\n\n You can now send to the channel using all of these:\n\n warrior's guild Hello\n warrior Hello\n wguild Hello\n warchannel Hello\n\n Note that this will not work if the alias has a space in it. So the\n 'warrior guild' alias must be used with the `channel` command:\n\n channel warrior guild = Hello\n\n Channel-aliases can be removed one at a time, using the '/unalias' switch.\n\n ## who\n\n Usage: channel/who channelname\n\n List the channel's subscribers. Shows who are currently offline or are\n muting the channel. Subscribers who are 'muting' will not see messages sent\n to the channel (use channel/mute to mute a channel).\n\n ## history\n\n Usage: channel/history channel [= index]\n\n This will display the last |c20|n lines of channel history. By supplying an\n index number, you will step that many lines back before viewing those 20 lines.\n\n For example:\n\n channel/history public = 35\n\n will go back 35 lines and show the previous 20 lines from that point (so\n lines -35 to -55).\n\n ## sub and unsub\n\n Usage: channel/sub channel [=alias[;alias;...]]\n channel/unsub channel\n\n This subscribes you to a channel and optionally assigns personal shortcuts\n for you to use to send to that channel (see aliases). When you unsub, all\n your personal aliases will also be removed.\n\n ## mute and unmute\n\n Usage: channel/mute channelname\n channel/unmute channelname\n\n Muting silences all output from the channel without actually\n un-subscribing. Other channel members will see that you are muted in the /who\n list. Sending a message to the channel will automatically unmute you.\n\n ## create and destroy\n\n Usage: channel/create channelname[;alias;alias[:typeclass]] [= description]\n channel/destroy channelname [= reason]\n\n Creates a new channel (or destroys one you control). You will automatically\n join the channel you create and everyone will be kicked and loose all aliases\n to a destroyed channel.\n\n ## lock and unlock\n\n Usage: channel/lock channelname = lockstring\n channel/unlock channelname = lockstring\n\n Note: this is an admin command.\n\n A lockstring is on the form locktype:lockfunc(). Channels understand three\n locktypes:\n listen - who may listen or join the channel.\n send - who may send messages to the channel\n control - who controls the channel. This is usually the one creating\n the channel.\n\n Common lockfuncs are all() and perm(). To make a channel everyone can\n listen to but only builders can talk on, use this:\n\n listen:all()\n send: perm(Builders)\n\n ## boot and ban\n\n Usage:\n channel/boot[/quiet] channelname[,channelname,...] = subscribername [: reason]\n channel/ban channelname[, channelname, ...] = subscribername [: reason]\n channel/unban channelname[, channelname, ...] = subscribername\n channel/unban channelname\n channel/ban channelname (list bans)\n\n Booting will kick a named subscriber from channel(s) temporarily. The\n 'reason' will be passed to the booted user. Unless the /quiet switch is\n used, the channel will also be informed of the action. A booted user is\n still able to re-connect, but they'll have to set up their aliases again.\n\n Banning will blacklist a user from (re)joining the provided channels. It\n will then proceed to boot them from those channels if they were connected.\n The 'reason' and `/quiet` works the same as for booting.\n\n Example:\n boot mychannel1 = EvilUser : Kicking you to cool down a bit.\n ban mychannel1,mychannel2= EvilUser : Was banned for spamming.\n\n "}¶
@@ -206,7 +206,7 @@ look *<account&g
@@ -268,7 +268,7 @@ for everyone to use, you need build privileges and the alias command.
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 '}¶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 '}¶
@@ -300,7 +300,7 @@ for everyone to use, you need build privileges and the alias command.
@@ -323,7 +323,7 @@ inv
search_index_entry = {'aliases': 'nickname nicks', 'category': 'general', 'key': 'nick', 'no_prefix': ' nickname nicks', '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', 'no_prefix': ' nicks nickname', '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 '}¶
@@ -354,7 +354,7 @@ inv
@@ -598,7 +598,7 @@ placing it in their inventory.
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 '}¶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 '}¶
@@ -629,7 +629,7 @@ placing it in their inventory.
@@ -709,7 +709,7 @@ automatically begin with your name.
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 '}¶
@@ -750,7 +750,7 @@ space.
@@ -773,7 +773,7 @@ which permission groups you are a member of.
search_index_entry = {'aliases': ': emote', 'category': 'general', 'key': 'pose', 'no_prefix': ' : emote', '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', 'no_prefix': ' emote :', '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 "}¶
@@ -804,7 +804,7 @@ which permission groups you are a member of.
diff --git a/docs/1.0-dev/api/evennia.commands.default.system.html b/docs/1.0-dev/api/evennia.commands.default.system.html
index 972851c8a4..e450185933 100644
--- a/docs/1.0-dev/api/evennia.commands.default.system.html
+++ b/docs/1.0-dev/api/evennia.commands.default.system.html
@@ -683,7 +683,7 @@ See |luhttps://ww
search_index_entry = {'aliases': 'groups hierarchy', 'category': 'general', 'key': 'access', 'no_prefix': ' groups hierarchy', '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', 'no_prefix': ' hierarchy groups', '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 '}¶
@@ -729,7 +729,7 @@ to all the variables defined therein.
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 bed0a60d85..90d47c81f3 100644
--- a/docs/1.0-dev/api/evennia.commands.default.tests.html
+++ b/docs/1.0-dev/api/evennia.commands.default.tests.html
@@ -902,7 +902,7 @@ main test suite started with
search_index_entry = {'aliases': '@delays @task', 'category': 'system', 'key': '@tasks', 'no_prefix': 'tasks delays task', 'tags': '', 'text': "\n Display or terminate active tasks (delays).\n\n Usage:\n tasks[/switch] [task_id or function_name]\n\n Switches:\n pause - Pause the callback of a task.\n unpause - Process all callbacks made since pause() was called.\n do_task - Execute the task (call its callback).\n call - Call the callback of this task.\n remove - Remove a task without executing it.\n cancel - Stop a task from automatically executing.\n\n Notes:\n A task is a single use method of delaying the call of a function. Calls are created\n in code, using `evennia.utils.delay`.\n See |luhttps://www.evennia.com/docs/latest/Command-Duration.html|ltthe docs|le for help.\n\n By default, tasks that are canceled and never called are cleaned up after one minute.\n\n Examples:\n - `tasks/cancel move_callback` - Cancels all movement delays from the slow_exit contrib.\n In this example slow exits creates it's tasks with\n `utils.delay(move_delay, move_callback)`\n - `tasks/cancel 2` - Cancel task id 2.\n\n "}¶search_index_entry = {'aliases': '@task @delays', 'category': 'system', 'key': '@tasks', 'no_prefix': 'tasks task delays', 'tags': '', 'text': "\n Display or terminate active tasks (delays).\n\n Usage:\n tasks[/switch] [task_id or function_name]\n\n Switches:\n pause - Pause the callback of a task.\n unpause - Process all callbacks made since pause() was called.\n do_task - Execute the task (call its callback).\n call - Call the callback of this task.\n remove - Remove a task without executing it.\n cancel - Stop a task from automatically executing.\n\n Notes:\n A task is a single use method of delaying the call of a function. Calls are created\n in code, using `evennia.utils.delay`.\n See |luhttps://www.evennia.com/docs/latest/Command-Duration.html|ltthe docs|le for help.\n\n By default, tasks that are canceled and never called are cleaned up after one minute.\n\n Examples:\n - `tasks/cancel move_callback` - Cancels all movement delays from the slow_exit contrib.\n In this example slow exits creates it's tasks with\n `utils.delay(move_delay, move_callback)`\n - `tasks/cancel 2` - Cancel task id 2.\n\n "}¶
red_button = <module 'evennia.contrib.tutorials.red_button.red_button' from '/tmp/tmpyf75velf/cf5a2412b4fe1b439e199ae403ae423359d6504a/evennia/contrib/tutorials/red_button/red_button.py'>¶red_button = <module 'evennia.contrib.tutorials.red_button.red_button' from '/tmp/tmpz0bofrlj/b13f5aee6f67688c5812751f800bae63380c046d/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 0e60f9554c..e9ca784e8d 100644
--- a/docs/1.0-dev/api/evennia.commands.default.unloggedin.html
+++ b/docs/1.0-dev/api/evennia.commands.default.unloggedin.html
@@ -122,7 +122,7 @@ connect “account name” “pass word”
@@ -157,7 +157,7 @@ there is no object yet before the account has logged in)
@@ -335,7 +335,7 @@ for simplicity. It shows a pane of info.
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': 'conn co con', 'category': 'general', 'key': 'connect', 'no_prefix': ' conn co 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 '}¶
@@ -361,7 +361,7 @@ for simplicity. It shows a pane of info.
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 82410f8d6a..907cfbaad9 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
@@ -139,7 +139,7 @@ the module given by settings.CONNECTION_SCREEN_MODULE.
search_index_entry = {'aliases': '? h', 'category': 'general', 'key': 'help', 'no_prefix': ' ? h', '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', 'no_prefix': ' h ?', '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 '}¶
@@ -169,7 +169,7 @@ there is no object yet before the account has logged in)
@@ -335,7 +335,7 @@ for simplicity. It shows a pane of info.
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': 'conn co con', 'category': 'general', 'key': 'connect', 'no_prefix': ' conn co 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 '}¶
@@ -361,7 +361,7 @@ for simplicity. It shows a pane of info.
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 6c2ac9fd1a..bb080d9107 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
@@ -116,7 +116,7 @@
search_index_entry = {'aliases': '? h', 'category': 'general', 'key': 'help', 'no_prefix': ' ? h', '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', 'no_prefix': ' h ?', 'tags': '', 'text': '\n This is an unconnected version of the help command,\n for simplicity. It shows a pane of info.\n '}¶
@@ -197,7 +197,7 @@ on user permission.
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 4a6704c4be..6f256818e3 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
@@ -160,7 +160,7 @@ aliases to an already joined channel.
search_index_entry = {'aliases': '@callbacks @calls @callback', 'category': 'building', 'key': '@call', 'no_prefix': 'call callbacks calls callback', 'tags': '', 'text': '\n Command to edit callbacks.\n '}¶search_index_entry = {'aliases': '@calls @callback @callbacks', 'category': 'building', 'key': '@call', 'no_prefix': 'call calls callback callbacks', 'tags': '', 'text': '\n Command to edit callbacks.\n '}¶
@@ -191,7 +191,7 @@ aliases to an already joined channel.
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 7cd9fc1880..8642104f00 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
@@ -211,7 +211,7 @@ the operation will be general or on the room.
search_index_entry = {'aliases': 'aliaschan chanalias', 'category': 'comms', 'key': 'addcom', 'no_prefix': ' aliaschan chanalias', 'tags': '', 'text': '\n Add a channel alias and/or subscribe to a channel\n\n Usage:\n addcom [alias=] <channel>\n\n Joins a given channel. If alias is given, this will allow you to\n refer to the channel by this alias rather than the full channel\n name. Subsequent calls of this command can be used to add multiple\n aliases to an already joined channel.\n '}¶search_index_entry = {'aliases': 'chanalias aliaschan', 'category': 'comms', 'key': 'addcom', 'no_prefix': ' chanalias aliaschan', 'tags': '', 'text': '\n Add a channel alias and/or subscribe to a channel\n\n Usage:\n addcom [alias=] <channel>\n\n Joins a given channel. If alias is given, this will allow you to\n refer to the channel by this alias rather than the full channel\n name. Subsequent calls of this command can be used to add multiple\n aliases to an already joined channel.\n '}¶
@@ -235,7 +235,7 @@ set in self.parse())
@@ -256,7 +256,7 @@ set in self.parse())
search_index_entry = {'aliases': 'abort quit q chicken out', 'category': 'evscaperoom', 'key': 'give up', 'no_prefix': ' abort quit q 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': 'abort chicken out quit q', 'category': 'evscaperoom', 'key': 'give up', 'no_prefix': ' abort chicken out quit q', '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 '}¶
@@ -290,7 +290,7 @@ set in self.parse())
@@ -371,7 +371,7 @@ shout
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 '}¶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 '}¶
@@ -400,7 +400,7 @@ set in self.parse())
@@ -428,7 +428,7 @@ emote /me points to /box and /lever.
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 '}¶
@@ -467,7 +467,7 @@ set in self.parse())
@@ -490,7 +490,7 @@ looks and what actions is available.
search_index_entry = {'aliases': ': pose', 'category': 'general', 'key': 'emote', 'no_prefix': ' : pose', 'tags': '', 'text': '\n Perform a free-form emote. Use /me to\n include yourself in the emote and /name\n to include other objects or characters.\n Use "..." to enact speech.\n\n Usage:\n emote <emote>\n :<emote\n\n Example:\n emote /me smiles at /peter\n emote /me points to /box and /lever.\n\n '}¶search_index_entry = {'aliases': 'pose :', 'category': 'general', 'key': 'emote', 'no_prefix': ' pose :', 'tags': '', 'text': '\n Perform a free-form emote. Use /me to\n include yourself in the emote and /name\n to include other objects or characters.\n Use "..." to enact speech.\n\n Usage:\n emote <emote>\n :<emote\n\n Example:\n emote /me smiles at /peter\n emote /me points to /box and /lever.\n\n '}¶
@@ -519,7 +519,7 @@ set in self.parse())
@@ -581,7 +581,7 @@ set in self.parse())
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 '}¶search_index_entry = {'aliases': 'unfocus examine e ex', 'category': 'evscaperoom', 'key': 'focus', 'no_prefix': ' unfocus examine e ex', '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 '}¶
@@ -605,7 +605,7 @@ set in self.parse())
diff --git a/docs/1.0-dev/api/evennia.contrib.game_systems.barter.barter.html b/docs/1.0-dev/api/evennia.contrib.game_systems.barter.barter.html
index 2be2efb51c..60f08ffd36 100644
--- a/docs/1.0-dev/api/evennia.contrib.game_systems.barter.barter.html
+++ b/docs/1.0-dev/api/evennia.contrib.game_systems.barter.barter.html
@@ -745,7 +745,7 @@ try to influence the other part in the deal.
search_index_entry = {'aliases': 'i give inventory inv', 'category': 'evscaperoom', 'key': 'get', 'no_prefix': ' i give inventory inv', 'tags': '', 'text': '\n Use focus / examine instead.\n\n '}¶search_index_entry = {'aliases': 'inv give i inventory', 'category': 'evscaperoom', 'key': 'get', 'no_prefix': ' inv give i inventory', 'tags': '', 'text': '\n Use focus / examine instead.\n\n '}¶
@@ -771,7 +771,7 @@ try to influence the other part in the deal.
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 669695bb9f..9755fdb7f3 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
@@ -692,7 +692,7 @@ inv
search_index_entry = {'aliases': 'deal offers', 'category': 'trading', 'key': 'status', 'no_prefix': ' deal offers', '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', 'no_prefix': ' offers deal', '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 "}¶
@@ -723,7 +723,7 @@ inv
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 d90f992bc4..9d99bb9288 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
@@ -340,7 +340,7 @@ look *<account&g
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 '}¶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 '}¶
@@ -360,7 +360,7 @@ look *<account&g
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 d4f8d6ceae..d9ebb1ed4d 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
@@ -695,7 +695,7 @@ a different language.
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 '}¶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 '}¶
@@ -726,7 +726,7 @@ a different language.
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 86b5f2e8c6..d1e473348a 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
@@ -256,7 +256,7 @@ set in self.parse())
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 '}¶
@@ -280,7 +280,7 @@ set in self.parse())
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 0af6628989..dfde070cba 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
@@ -153,7 +153,7 @@ such as when closing the lid and un-blinding a character.
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 '}¶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 '}¶
@@ -182,7 +182,7 @@ check if the lid is open or closed.
@@ -252,7 +252,7 @@ check if the lid is open or closed.
search_index_entry = {'aliases': 'push press button press', 'category': 'general', 'key': 'push button', 'no_prefix': ' push press button press', 'tags': '', 'text': '\n Push the red button (lid closed)\n\n Usage:\n push button\n\n '}¶search_index_entry = {'aliases': 'press button push press', 'category': 'general', 'key': 'push button', 'no_prefix': ' press button push press', 'tags': '', 'text': '\n Push the red button (lid closed)\n\n Usage:\n push button\n\n '}¶
@@ -279,7 +279,7 @@ break.
@@ -379,7 +379,7 @@ be mutually exclusive.
search_index_entry = {'aliases': 'smash break lid smash lid', 'category': 'general', 'key': 'smash glass', 'no_prefix': ' smash break lid 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 '}¶search_index_entry = {'aliases': 'break lid smash lid smash', 'category': 'general', 'key': 'smash glass', 'no_prefix': ' break lid smash lid smash', '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 '}¶
@@ -408,7 +408,7 @@ set in self.parse())
@@ -506,7 +506,7 @@ be mutually exclusive.
search_index_entry = {'aliases': 'push press button press', 'category': 'general', 'key': 'push button', 'no_prefix': ' push press button press', 'tags': '', 'text': '\n Push the red button\n\n Usage:\n push button\n\n '}¶search_index_entry = {'aliases': 'press button push press', 'category': 'general', 'key': 'push button', 'no_prefix': ' press button push press', 'tags': '', 'text': '\n Push the red button\n\n Usage:\n push button\n\n '}¶
aliases = ['ex', 'l', 'listen', 'feel', 'get', 'examine']¶aliases = ['l', 'examine', 'get', 'ex', 'listen', 'feel']¶
@@ -532,7 +532,7 @@ be mutually exclusive.
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 da3acb254d..c9d3a3dd93 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
@@ -425,7 +425,7 @@ of the object. We overload it with our own version.
search_index_entry = {'aliases': 'ex l listen feel get examine', 'category': 'general', 'key': 'look', 'no_prefix': ' ex l listen feel get examine', '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': 'l examine get ex listen feel', 'category': 'general', 'key': 'look', 'no_prefix': ' l examine get ex listen 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 "}¶
@@ -452,7 +452,7 @@ to sit on a “lightable” object, we operate only on self.obj.
@@ -556,7 +556,7 @@ shift green root up/down
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 '}¶
@@ -592,7 +592,7 @@ yellow/green - horizontal roots
@@ -609,7 +609,7 @@ yellow/green - horizontal roots
search_index_entry = {'aliases': 'shiftroot move push pull', 'category': 'tutorialworld', 'key': 'shift', 'no_prefix': ' shiftroot move push pull', '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': 'shiftroot push pull move', 'category': 'tutorialworld', 'key': 'shift', 'no_prefix': ' shiftroot push 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 '}¶
aliases = ['press button', 'push button', 'button']¶aliases = ['press button', 'button', 'push button']¶
@@ -635,7 +635,7 @@ yellow/green - horizontal roots
@@ -779,7 +779,7 @@ parry - forgoes your attack but will make you harder to hit on next
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': 'press button button push button', 'category': 'tutorialworld', 'key': 'press', 'no_prefix': ' press button button push button', 'tags': '', 'text': '\n Presses a button.\n '}¶
aliases = ['bash', 'parry', 'thrust', 'stab', 'fight', 'kill', 'hit', 'slash', 'defend', 'chop', 'pierce']¶aliases = ['thrust', 'hit', 'chop', 'bash', 'kill', 'stab', 'pierce', 'slash', 'parry', 'fight', 'defend']¶
@@ -805,7 +805,7 @@ parry - forgoes your attack but will make you harder to hit on next
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 5e27d6a7ca..a291a00b0d 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
@@ -248,7 +248,7 @@ code except for adding in the details.
search_index_entry = {'aliases': 'bash parry thrust stab fight kill hit slash defend chop pierce', 'category': 'tutorialworld', 'key': 'attack', 'no_prefix': ' bash parry thrust stab fight kill hit slash defend chop pierce', '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': 'thrust hit chop bash kill stab pierce slash parry fight defend', 'category': 'tutorialworld', 'key': 'attack', 'no_prefix': ' thrust hit chop bash kill stab pierce slash parry fight defend', '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 '}¶
@@ -263,7 +263,7 @@ code except for adding in the details.
@@ -816,7 +816,7 @@ if they fall off the bridge.
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 '}¶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 '}¶
@@ -842,7 +842,7 @@ if they fall off the bridge.
@@ -968,7 +968,7 @@ to find something.
search_index_entry = {'aliases': '? h', 'category': 'tutorial world', 'key': 'help', 'no_prefix': ' ? h', 'tags': '', 'text': '\n Overwritten help command while on the bridge.\n '}¶search_index_entry = {'aliases': 'h ?', 'category': 'tutorial world', 'key': 'help', 'no_prefix': ' h ?', 'tags': '', 'text': '\n Overwritten help command while on the bridge.\n '}¶
aliases = ['search', 'l', 'feel around', 'feel', 'fiddle']¶aliases = ['l', 'fiddle', 'feel around', 'search', 'feel']¶
@@ -996,7 +996,7 @@ random chance of eventually finding a light source.
diff --git a/docs/1.0-dev/api/evennia.contrib.utils.git_integration.git_integration.html b/docs/1.0-dev/api/evennia.contrib.utils.git_integration.git_integration.html
index 22102da50a..374b47bc83 100644
--- a/docs/1.0-dev/api/evennia.contrib.utils.git_integration.git_integration.html
+++ b/docs/1.0-dev/api/evennia.contrib.utils.git_integration.git_integration.html
@@ -208,7 +208,7 @@ git evennia pull - Pull the latest evennia code.
search_index_entry = {'aliases': 'search l feel around feel fiddle', 'category': 'tutorialworld', 'key': 'look', 'no_prefix': ' search l feel around feel fiddle', '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 fiddle feel around search feel', 'category': 'tutorialworld', 'key': 'look', 'no_prefix': ' l fiddle feel around search feel', '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 '}¶
directory = '/tmp/tmpyf75velf/cf5a2412b4fe1b439e199ae403ae423359d6504a/evennia'¶directory = '/tmp/tmpz0bofrlj/b13f5aee6f67688c5812751f800bae63380c046d/evennia'¶
@@ -269,7 +269,7 @@ git pull - Pull the latest code from your current branch.
directory = '/tmp/tmpyf75velf/cf5a2412b4fe1b439e199ae403ae423359d6504a/evennia/game_template'¶directory = '/tmp/tmpz0bofrlj/b13f5aee6f67688c5812751f800bae63380c046d/evennia/game_template'¶
diff --git a/docs/1.0-dev/api/evennia.utils.eveditor.html b/docs/1.0-dev/api/evennia.utils.eveditor.html
index ef733f9dc2..1dc64f6357 100644
--- a/docs/1.0-dev/api/evennia.utils.eveditor.html
+++ b/docs/1.0-dev/api/evennia.utils.eveditor.html
@@ -336,7 +336,7 @@ indentation.
aliases = [':>', ':u', ':s', ':i', ':I', ':A', ':p', ':echo', ':', ':::', ':DD', ':fd', ':UU', ':w', ':r', ':=', ':S', ':dw', ':j', ':uu', ':h', ':wq', ':q!', ':y', ':dd', ':x', ':!', ':f', '::', ':<', ':q', ':fi']¶aliases = ['::', ':f', ':dw', ':uu', ':::', ':', ':h', ':A', ':fi', ':UU', ':echo', ':p', ':s', ':wq', ':>', ':dd', ':u', ':r', ':<', ':I', ':fd', ':!', ':q!', ':x', ':q', ':j', ':=', ':y', ':S', ':i', ':w', ':DD']¶
@@ -364,7 +364,7 @@ efficient presentation.
diff --git a/docs/1.0-dev/api/evennia.utils.evmenu.html b/docs/1.0-dev/api/evennia.utils.evmenu.html
index 77624acb78..a86cbfdc10 100644
--- a/docs/1.0-dev/api/evennia.utils.evmenu.html
+++ b/docs/1.0-dev/api/evennia.utils.evmenu.html
@@ -931,7 +931,7 @@ single question.
search_index_entry = {'aliases': ':> :u :s :i :I :A :p :echo : ::: :DD :fd :UU :w :r := :S :dw :j :uu :h :wq :q! :y :dd :x :! :f :: :< :q :fi', 'category': 'general', 'key': ':editor_command_group', 'no_prefix': ' :> :u :s :i :I :A :p :echo : ::: :DD :fd :UU :w :r := :S :dw :j :uu :h :wq :q! :y :dd :x :! :f :: :< :q :fi', 'tags': '', 'text': '\n Commands for the editor\n '}¶search_index_entry = {'aliases': ':: :f :dw :uu ::: : :h :A :fi :UU :echo :p :s :wq :> :dd :u :r :< :I :fd :! :q! :x :q :j := :y :S :i :w :DD', 'category': 'general', 'key': ':editor_command_group', 'no_prefix': ' :: :f :dw :uu ::: : :h :A :fi :UU :echo :p :s :wq :> :dd :u :r :< :I :fd :! :q! :x :q :j := :y :S :i :w :DD', 'tags': '', 'text': '\n Commands for the editor\n '}¶
aliases = ['no', 'yes', 'abort', 'y', 'a', '__nomatch_command', 'n']¶aliases = ['yes', 'abort', 'a', 'y', 'n', '__nomatch_command', 'no']¶
@@ -957,7 +957,7 @@ single question.
diff --git a/docs/1.0-dev/api/evennia.utils.evmore.html b/docs/1.0-dev/api/evennia.utils.evmore.html
index 586d680f6a..7e8ced9390 100644
--- a/docs/1.0-dev/api/evennia.utils.evmore.html
+++ b/docs/1.0-dev/api/evennia.utils.evmore.html
@@ -137,7 +137,7 @@ the caller.msg() construct every time the page is updated.
search_index_entry = {'aliases': 'no yes abort y a __nomatch_command n', 'category': 'general', 'key': '__noinput_command', 'no_prefix': ' no yes abort y a __nomatch_command n', 'tags': '', 'text': '\n Handle a prompt for yes or no. Press [return] for the default choice.\n\n '}¶search_index_entry = {'aliases': 'yes abort a y n __nomatch_command no', 'category': 'general', 'key': '__noinput_command', 'no_prefix': ' yes abort a y n __nomatch_command no', 'tags': '', 'text': '\n Handle a prompt for yes or no. Press [return] for the default choice.\n\n '}¶
aliases = ['e', 'q', 't', 'end', 'abort', 'n', 'next', 'top', 'p', 'quit', 'previous', 'a']¶aliases = ['end', 'next', 'p', 'top', 't', 'q', 'abort', 'a', 'n', 'previous', 'quit', 'e']¶
@@ -163,7 +163,7 @@ the caller.msg() construct every time the page is updated.
diff --git a/docs/1.0-dev/index.html b/docs/1.0-dev/index.html
index 938b0d0a44..a456f85dc8 100644
--- a/docs/1.0-dev/index.html
+++ b/docs/1.0-dev/index.html
@@ -184,22 +184,21 @@ or the original github wiki. You have been warned.
search_index_entry = {'aliases': 'e q t end abort n next top p quit previous a', 'category': 'general', 'key': '__noinput_command', 'no_prefix': ' e q t end abort n next top p quit previous a', 'tags': '', 'text': '\n Manipulate the text paging. Catch no-input with aliases.\n '}¶search_index_entry = {'aliases': 'end next p top t q abort a n previous quit e', 'category': 'general', 'key': '__noinput_command', 'no_prefix': ' end next p top t q abort a n previous quit e', 'tags': '', 'text': '\n Manipulate the text paging. Catch no-input with aliases.\n '}¶
-