New drop:holds() lock default to limit dropping nonsensical things. Access check
defaults to True for backwards-compatibility in 0.9, will be False in 1.0
diff --git a/docs/1.0-dev/Contribs/Contrib-Godotwebsocket.html b/docs/1.0-dev/Contribs/Contrib-Godotwebsocket.html
index d72542c9b0..b4ab44d0e6 100644
--- a/docs/1.0-dev/Contribs/Contrib-Godotwebsocket.html
+++ b/docs/1.0-dev/Contribs/Contrib-Godotwebsocket.html
@@ -147,7 +147,7 @@ of this readme for Godot 4.
You must also remove the protocol from the connect_to_url call made
within the _ready function.
-
func_ready():
+
func_ready():# ...# Change the following line from thisvarerr=_client.connect_to_url(websocket_url,["lws-mirror-protocol"])
@@ -166,12 +166,12 @@ Here is an example
vardata=_client.get_peer(1).get_packet().get_string_from_utf8()varjson_data=JSON.parse(data).result# The json_data is an array
-
+
# The first element informs us this is simple text# so we add it to the RichTextlabelifjson_data[0]=='text':formsginjson_data[1]:label.append_bbcode(msg)
-
+
# Always useful to print the data and see what we got.print(data)
@@ -189,17 +189,17 @@ to leverage Evennia’s OOB to send extra data.
Godot
-
func_on_data():
-...
-ifjson_data[0]=='text':
-formsginjson_data[1]:label.append_bbcode(msg)
-
-# Notice the first element is the name of the kwarg we used from evennia.
-elifjson_data[0]=='coordinates':
-varcoords_data=json_data[2]
-player.set_pos(coords_data)
-
-...
+
func_on_data():
+ ...
+ ifjson_data[0]=='text':
+ formsginjson_data[1]:label.append_bbcode(msg)
+
+ # Notice the first element is the name of the kwarg we used from evennia.
+ elifjson_data[0]=='coordinates':
+ varcoords_data=json_data[2]
+ player.set_pos(coords_data)
+
+ ...
A good idea would be to set up Godot Signals you can trigger based on the data
@@ -217,86 +217,87 @@ cast them to dict() or list() before doing so.
This is an example of a Script to use in Godot 3.
The script can be attached to the root UI node.
-
extendsNode
+
extendsNode
-# The URL to connect to, should be your mud.
-exportvarwebsocket_url="ws://127.0.0.1:4008"
+# The URL to connect to, should be your mud.
+exportvarwebsocket_url="ws://127.0.0.1:4008"
-# These are references to controls in the scene
-onreadyvarparent=get_parent()
-onreadyvarlabel=parent.get_node("%ChatLog")
-onreadyvartxtEdit=parent.get_node("%ChatInput")
+# These are references to controls in the scene
+onreadyvarparent=get_parent()
+onreadyvarlabel=parent.get_node("%ChatLog")
+onreadyvartxtEdit=parent.get_node("%ChatInput")
-onreadyvarroom=get_node("/root/World/Room")
+onreadyvarroom=get_node("/root/World/Room")
-# Our WebSocketClient instance
-var_client=WebSocketClient.new()
+# Our WebSocketClient instance
+var_client=WebSocketClient.new()
-varis_connected=false
+varis_connected=false
-func_ready():
-# Connect base signals to get notified of connection open, close, errors and messages
-_client.connect("connection_closed",self,"_closed")
-_client.connect("connection_error",self,"_closed")
-_client.connect("connection_established",self,"_connected")
-_client.connect("data_received",self,"_on_data")
-print('Ready')
+func_ready():
+ # Connect base signals to get notified of connection open, close, errors and messages
+ _client.connect("connection_closed",self,"_closed")
+ _client.connect("connection_error",self,"_closed")
+ _client.connect("connection_established",self,"_connected")
+ _client.connect("data_received",self,"_on_data")
+ print('Ready')
-# Initiate connection to the given URL.
-varerr=_client.connect_to_url(websocket_url)
-iferr!=OK:
-print("Unable to connect")
-set_process(false)
+ # Initiate connection to the given URL.
+ varerr=_client.connect_to_url(websocket_url)
+ iferr!=OK:
+ print("Unable to connect")
+ set_process(false)
-func_closed(was_clean=false):
-# was_clean will tell you if the disconnection was correctly notified
-# by the remote peer before closing the socket.
-print("Closed, clean: ",was_clean)
-set_process(false)
+func_closed(was_clean=false):
+ # was_clean will tell you if the disconnection was correctly notified
+ # by the remote peer before closing the socket.
+ print("Closed, clean: ",was_clean)
+ set_process(false)
-func_connected(proto=""):
-is_connected=true
-print("Connected with protocol: ",proto)
+func_connected(proto=""):
+ is_connected=true
+ print("Connected with protocol: ",proto)
-func_on_data():
-# This is called when Godot receives data from evennia
-vardata=_client.get_peer(1).get_packet().get_string_from_utf8()
-varjson_data=JSON.parse(data).result
-# Here we have the data from Evennia which is an array.
-# The first element will be text if it is a message
-# and would be the key of the OOB data you passed otherwise.
-ifjson_data[0]=='text':
-# In this case, we simply append the data as bbcode to our label.
-formsginjson_data[1]:label.append_bbcode(msg)
-elifjson_data[0]=='coordinates':
-# Dummy signal emitted if we wanted to handle the new coordinates
-# elsewhere in the project.
-self.emit_signal('updated_coordinates',json_data[1])
+func_on_data():
+ # This is called when Godot receives data from evennia
+ vardata=_client.get_peer(1).get_packet().get_string_from_utf8()
+ varjson_data=JSON.parse(data).result
+ # Here we have the data from Evennia which is an array.
+ # The first element will be text if it is a message
+ # and would be the key of the OOB data you passed otherwise.
+ ifjson_data[0]=='text':
+ # In this case, we simply append the data as bbcode to our label.
+ formsginjson_data[1]:label.append_bbcode(msg)
+ elifjson_data[0]=='coordinates':
+ # Dummy signal emitted if we wanted to handle the new coordinates
+ # elsewhere in the project.
+ self.emit_signal('updated_coordinates',json_data[1])
-
-# We only print this for easier debugging.
-print(data)
-func_process(delta):
-# Required for websocket to properly react
-_client.poll()
+ # We only print this for easier debugging.
+ print(data)
-func_on_button_send():
-# This is called when we press the button in the scene
-# with a connected signal, it sends the written message to Evennia.
-varmsg=txtEdit.text
-varmsg_arr=['text',[msg],{}]
-varmsg_str=JSON.print(msg_arr)
-_client.get_peer(1).put_packet(msg_str.to_utf8())
+func_process(delta):
+ # Required for websocket to properly react
+ _client.poll()
+
+func_on_button_send():
+ # This is called when we press the button in the scene
+ # with a connected signal, it sends the written message to Evennia.
+ varmsg=txtEdit.text
+ varmsg_arr=['text',[msg],{}]
+ varmsg_str=JSON.print(msg_arr)
+ _client.get_peer(1).put_packet(msg_str.to_utf8())
+
+func_notification(what):
+ # This is a special method that allows us to notify Evennia we are closing.
+ ifwhat==MainLoop.NOTIFICATION_WM_QUIT_REQUEST:
+ ifis_connected:
+ varmsg_arr=['text',['quit'],{}]
+ varmsg_str=JSON.print(msg_arr)
+ _client.get_peer(1).put_packet(msg_str.to_utf8())
+ get_tree().quit()# default behavior
-func_notification(what):
-# This is a special method that allows us to notify Evennia we are closing.
-ifwhat==MainLoop.NOTIFICATION_WM_QUIT_REQUEST:
-ifis_connected:
-varmsg_arr=['text',['quit'],{}]
-varmsg_str=JSON.print(msg_arr)
-_client.get_peer(1).put_packet(msg_str.to_utf8())
-get_tree().quit()# default behavior
@@ -306,65 +307,65 @@ The script can be attached to the root UI node.
Note that the version is not final so the code may break.
It requires a WebSocketClientNode as a child of the root node.
The script can be attached to the root UI node.
-
extends Control
+
extendsControl
-# The URL to connect to, should be your mud.
-var websocket_url = "ws://127.0.0.1:4008"
+# The URL to connect to, should be your mud.
+varwebsocket_url="ws://127.0.0.1:4008"
-# These are references to controls in the scene
-@onready
-var label: RichTextLabel = get_node("%ChatLog")
-@onready
-var txtEdit: TextEdit = get_node("%ChatInput")
-@onready
-var websocket = get_node("WebSocketClient")
+# These are references to controls in the scene
+@onready
+varlabel:RichTextLabel=get_node("%ChatLog")
+@onready
+vartxtEdit:TextEdit=get_node("%ChatInput")
+@onready
+varwebsocket=get_node("WebSocketClient")
-func _ready():
- # We connect the various signals
- websocket.connect('connected_to_server', self._connected)
- websocket.connect('connection_closed', self._closed)
- websocket.connect('message_received', self._on_data)
-
- # We attempt to connect and print out the error if we have one.
- var result = websocket.connect_to_url(websocket_url)
- if result != OK:
- print('Could not connect:' + str(result))
+func_ready():
+ # We connect the various signals
+ websocket.connect('connected_to_server',self._connected)
+ websocket.connect('connection_closed',self._closed)
+ websocket.connect('message_received',self._on_data)
+
+ # We attempt to connect and print out the error if we have one.
+ varresult=websocket.connect_to_url(websocket_url)
+ ifresult!=OK:
+ print('Could not connect:'+str(result))
-func _closed():
- # This emits if the connection was closed by the remote host or unexpectedly
- print('Connection closed.')
- set_process(false)
+func_closed():
+ # This emits if the connection was closed by the remote host or unexpectedly
+ print('Connection closed.')
+ set_process(false)
-func _connected():
- # This emits when the connection succeeds.
- print('Connected!')
+func_connected():
+ # This emits when the connection succeeds.
+ print('Connected!')
-func _on_data(data):
- # This is called when Godot receives data from evennia
- var json_data = JSON.parse_string(data)
- # Here we have the data from Evennia which is an array.
- # The first element will be text if it is a message
- # and would be the key of the OOB data you passed otherwise.
- if json_data[0] == 'text':
- # In this case, we simply append the data as bbcode to our label.
- for msg in json_data[1]: # Here we include a newline at every message.
- label.append_text("\n" + msg)
- elif json_data[0] == 'coordinates':
- # Dummy signal emitted if we wanted to handle the new coordinates
- # elsewhere in the project.
- self.emit_signal('updated_coordinates', json_data[1])
+func_on_data(data):
+ # This is called when Godot receives data from evennia
+ varjson_data=JSON.parse_string(data)
+ # Here we have the data from Evennia which is an array.
+ # The first element will be text if it is a message
+ # and would be the key of the OOB data you passed otherwise.
+ ifjson_data[0]=='text':
+ # In this case, we simply append the data as bbcode to our label.
+ formsginjson_data[1]:# Here we include a newline at every message.
+ label.append_text("\n"+msg)
+ elifjson_data[0]=='coordinates':
+ # Dummy signal emitted if we wanted to handle the new coordinates
+ # elsewhere in the project.
+ self.emit_signal('updated_coordinates',json_data[1])
- # We only print this for easier debugging.
- print(data)
+ # We only print this for easier debugging.
+ print(data)
-func _on_button_pressed():
- # This is called when we press the button in the scene
- # with a connected signal, it sends the written message to Evennia.
- var msg = txtEdit.text
- var msg_arr = ['text', [msg], {}]
- var msg_str = JSON.stringify(msg_arr)
- websocket.send(msg_str)
+func_on_button_pressed():
+ # This is called when we press the button in the scene
+ # with a connected signal, it sends the written message to Evennia.
+ varmsg=txtEdit.text
+ varmsg_arr=['text',[msg],{}]
+ varmsg_str=JSON.stringify(msg_arr)
+ websocket.send(msg_str)
diff --git a/docs/1.0-dev/Setup/Installation-Troubleshooting.html b/docs/1.0-dev/Setup/Installation-Troubleshooting.html
index eae36232ba..8ccbb55a9f 100644
--- a/docs/1.0-dev/Setup/Installation-Troubleshooting.html
+++ b/docs/1.0-dev/Setup/Installation-Troubleshooting.html
@@ -117,12 +117,12 @@
you can run evennia-l, or start/reload the server with evenniastart-l or evenniareload-l.
Evennia requires Python 3.9, 3.10 or 3.11 (recommended). Any OS that supports Python should work.
+
Evennia requires Python 3.10 or 3.11 (recommended). Any OS that supports Python should work.
Windows: In the installer, make sure you select addpythontopath. If you have multiple versions of Python installed, use py command instead of python to have Windows automatically use the latest.
Windows: If you want to use Python 3.11, you must also install the Windows SDK. Run the linked installer. Click the IndividualComponents tab at the top, then search and checkbox the latest Windows10SDK (also for older/newer Windows versions). Then click Install. If you have trouble, use Python 3.10 for now (2022).
diff --git a/docs/1.0-dev/_modules/evennia/commands/default/comms.html b/docs/1.0-dev/_modules/evennia/commands/default/comms.html
index 9ba63bc256..3ce28e9b63 100644
--- a/docs/1.0-dev/_modules/evennia/commands/default/comms.html
+++ b/docs/1.0-dev/_modules/evennia/commands/default/comms.html
@@ -1996,7 +1996,6 @@
Usage: discord2chan[/switches] discord2chan[/switches] <evennia_channel> [= <discord_channel_id>]
- discord2chan/name <bot_name> Switches: /list - (or no switch) show existing Evennia <-> Discord links
@@ -2010,7 +2009,7 @@
This creates a link between an in-game Evennia channel and an external Discord channel. You must have a valid Discord bot application
- (https://discord.com/developers/applications)) and your DISCORD_BOT_TOKEN
+ ( https://discord.com/developers/applications ) and your DISCORD_BOT_TOKEN must be added to settings. (Please put it in secret_settings !) """
diff --git a/docs/1.0-dev/_modules/evennia/server/portal/discord.html b/docs/1.0-dev/_modules/evennia/server/portal/discord.html
index a02117b668..924d057480 100644
--- a/docs/1.0-dev/_modules/evennia/server/portal/discord.html
+++ b/docs/1.0-dev/_modules/evennia/server/portal/discord.html
@@ -98,14 +98,13 @@
)fromdjango.confimportsettingsfromtwisted.internetimportprotocol,reactor,ssl,task
-fromtwisted.web.clientimportAgent,FileBodyProducer,readBody
+fromtwisted.web.clientimportAgent,FileBodyProducer,HTTPConnectionPool,readBodyfromtwisted.web.http_headersimportHeadersfromevennia.server.sessionimportSessionfromevennia.utilsimportclass_from_module,get_evennia_version,loggerfromevennia.utils.utilsimportdelay
-_AGENT=Agent(reactor)_BASE_SESSION_CLASS=class_from_module(settings.BASE_SESSION_CLASS)
@@ -128,6 +127,21 @@
OP_RESUME=6
+# create quiet HTTP pool to muffle GET/POST requests
+
[docs]classQuietConnectionPool(HTTPConnectionPool):
+ """
+ A quiet version of the HTTPConnectionPool which sets the factory's
+ `noisy` property to False to muffle log output.
+ """
+
+
[docs]defshould_retry(status_code):""" Helper function to check if the request should be retried later.
@@ -156,11 +170,13 @@
initialDelay=1factor=1.5maxDelay=60
+ noisy=Falsegateway=Noneresume_url=None
+ do_retry=True
@@ -264,7 +280,7 @@
reason (str): The reason for the failure. """
- ifself.do_retryandnotself.bot:
+ ifself.do_retryornotself.bot:self.retry(connector)
[docs]defreconnect(self):
@@ -273,8 +289,13 @@
de-registering the session and then reattaching a new one. """
+ # set the retry flag to False so it doesn't attempt an automatic retry
+ # and duplicate the connection
+ self.do_retry=False
+ # disconnect everythingself.bot.transport.loseConnection()self.sessionhandler.server_disconnect(self.bot)
+ # set up the reconnectionifself.resume_url:self.url=self.resume_urlelifself.gateway:
@@ -293,12 +314,14 @@
# get the gateway URL from Discordself.get_gateway_url()else:
+ # set the retry flag so we maintain this connection
+ self.do_retry=TrueconnectWS(self)
[docs]classDiscordClient(WebSocketClientProtocol,_BASE_SESSION_CLASS):"""
- Implements the grapevine client
+ Implements the Discord client """nextHeartbeatCall=None
@@ -347,7 +370,7 @@
ifseqid:=data.get("s"):self.last_sequence=seqid
- # not sure if that error json format is for websockets
+ # not sure if that error json format is for websockets, so# check for it just in caseif"errors"indata:self.handle_error(data)
diff --git a/docs/1.0-dev/_modules/functools.html b/docs/1.0-dev/_modules/functools.html
index d3af56f0bb..e2bf8880ba 100644
--- a/docs/1.0-dev/_modules/functools.html
+++ b/docs/1.0-dev/_modules/functools.html
@@ -313,14 +313,14 @@
defreduce(function,sequence,initial=_initial_missing):"""
- reduce(function, sequence[, initial]) -> value
+ reduce(function, iterable[, initial]) -> value
- Apply a function of two arguments cumulatively to the items of a sequence,
- from left to right, so as to reduce the sequence to a single value.
- For example, reduce(lambda x, y: x+y, [1, 2, 3, 4, 5]) calculates
+ Apply a function of two arguments cumulatively to the items of a sequence
+ or iterable, from left to right, so as to reduce the iterable to a single
+ value. For example, reduce(lambda x, y: x+y, [1, 2, 3, 4, 5]) calculates ((((1+2)+3)+4)+5). If initial is present, it is placed before the items
- of the sequence in the calculation, and serves as a default when the
- sequence is empty.
+ of the iterable in the calculation, and serves as a default when the
+ iterable is empty. """it=iter(sequence)
@@ -329,7 +329,8 @@
try:value=next(it)exceptStopIteration:
- raiseTypeError("reduce() of empty sequence with no initial value")fromNone
+ raiseTypeError(
+ "reduce() of empty iterable with no initial value")fromNoneelse:value=initial
@@ -989,24 +990,11 @@
self.dispatcher=singledispatch(func)self.func=func
- # bpo-45678: special-casing for classmethod/staticmethod in Python <=3.9,
- # as functools.update_wrapper doesn't work properly in singledispatchmethod.__get__
- # if it is applied to an unbound classmethod/staticmethod
- ifisinstance(func,(staticmethod,classmethod)):
- self._wrapped_func=func.__func__
- else:
- self._wrapped_func=funcdefregister(self,cls,method=None):"""generic_method.register(cls, func) -> func Registers a new implementation for the given *cls* on a *generic_method*. """
- # bpo-39679: in Python <= 3.9, classmethods and staticmethods don't
- # inherit __annotations__ of the wrapped function (fixed in 3.10+ as
- # a side-effect of bpo-43682) but we need that for annotation-derived
- # singledispatches. So we add that just-in-time here.
- ifisinstance(cls,(staticmethod,classmethod)):
- cls.__annotations__=getattr(cls.__func__,'__annotations__',{})returnself.dispatcher.register(cls,func=method)def__get__(self,obj,cls=None):
@@ -1016,7 +1004,7 @@
_method.__isabstractmethod__=self.__isabstractmethod___method.register=self.register
- update_wrapper(_method,self._wrapped_func)
+ update_wrapper(_method,self.func)return_method@property
diff --git a/docs/1.0-dev/_modules/index.html b/docs/1.0-dev/_modules/index.html
index 519ed6973a..bfb48f9782 100644
--- a/docs/1.0-dev/_modules/index.html
+++ b/docs/1.0-dev/_modules/index.html
@@ -375,6 +375,7 @@
+#
+# Secret Labs' Regular Expression Engine
+#
+# re-compatible interface for the sre matching engine
+#
+# Copyright (c) 1998-2001 by Secret Labs AB. All rights reserved.
+#
+# This version of the SRE library can be redistributed under CNRI's
+# Python 1.6 license. For any other use, please contact Secret Labs
+# AB (info@pythonware.com).
+#
+# Portions of this engine have been developed in cooperation with
+# CNRI. Hewlett-Packard provided funding for 1.6 integration and
+# other compatibility work.
+#
+
+r"""Support for regular expressions (RE).
+
+This module provides regular expression matching operations similar to
+those found in Perl. It supports both 8-bit and Unicode strings; both
+the pattern and the strings being processed can contain null bytes and
+characters outside the US ASCII range.
+
+Regular expressions can contain both special and ordinary characters.
+Most ordinary characters, like "A", "a", or "0", are the simplest
+regular expressions; they simply match themselves. You can
+concatenate ordinary characters, so last matches the string 'last'.
+
+The special characters are:
+ "." Matches any character except a newline.
+ "^" Matches the start of the string.
+ "$" Matches the end of the string or just before the newline at
+ the end of the string.
+ "*" Matches 0 or more (greedy) repetitions of the preceding RE.
+ Greedy means that it will match as many repetitions as possible.
+ "+" Matches 1 or more (greedy) repetitions of the preceding RE.
+ "?" Matches 0 or 1 (greedy) of the preceding RE.
+ *?,+?,?? Non-greedy versions of the previous three special characters.
+ {m,n} Matches from m to n repetitions of the preceding RE.
+ {m,n}? Non-greedy version of the above.
+ "\\" Either escapes special characters or signals a special sequence.
+ [] Indicates a set of characters.
+ A "^" as the first character indicates a complementing set.
+ "|" A|B, creates an RE that will match either A or B.
+ (...) Matches the RE inside the parentheses.
+ The contents can be retrieved or matched later in the string.
+ (?aiLmsux) The letters set the corresponding flags defined below.
+ (?:...) Non-grouping version of regular parentheses.
+ (?P<name>...) The substring matched by the group is accessible by name.
+ (?P=name) Matches the text matched earlier by the group named name.
+ (?#...) A comment; ignored.
+ (?=...) Matches if ... matches next, but doesn't consume the string.
+ (?!...) Matches if ... doesn't match next.
+ (?<=...) Matches if preceded by ... (must be fixed length).
+ (?<!...) Matches if not preceded by ... (must be fixed length).
+ (?(id/name)yes|no) Matches yes pattern if the group with id/name matched,
+ the (optional) no pattern otherwise.
+
+The special sequences consist of "\\" and a character from the list
+below. If the ordinary character is not on the list, then the
+resulting RE will match the second character.
+ \number Matches the contents of the group of the same number.
+ \A Matches only at the start of the string.
+ \Z Matches only at the end of the string.
+ \b Matches the empty string, but only at the start or end of a word.
+ \B Matches the empty string, but not at the start or end of a word.
+ \d Matches any decimal digit; equivalent to the set [0-9] in
+ bytes patterns or string patterns with the ASCII flag.
+ In string patterns without the ASCII flag, it will match the whole
+ range of Unicode digits.
+ \D Matches any non-digit character; equivalent to [^\d].
+ \s Matches any whitespace character; equivalent to [ \t\n\r\f\v] in
+ bytes patterns or string patterns with the ASCII flag.
+ In string patterns without the ASCII flag, it will match the whole
+ range of Unicode whitespace characters.
+ \S Matches any non-whitespace character; equivalent to [^\s].
+ \w Matches any alphanumeric character; equivalent to [a-zA-Z0-9_]
+ in bytes patterns or string patterns with the ASCII flag.
+ In string patterns without the ASCII flag, it will match the
+ range of Unicode alphanumeric characters (letters plus digits
+ plus underscore).
+ With LOCALE, it will match the set [0-9_] plus characters defined
+ as letters for the current locale.
+ \W Matches the complement of \w.
+ \\ Matches a literal backslash.
+
+This module exports the following functions:
+ match Match a regular expression pattern to the beginning of a string.
+ fullmatch Match a regular expression pattern to all of a string.
+ search Search a string for the presence of a pattern.
+ sub Substitute occurrences of a pattern found in a string.
+ subn Same as sub, but also return the number of substitutions made.
+ split Split a string by the occurrences of a pattern.
+ findall Find all occurrences of a pattern in a string.
+ finditer Return an iterator yielding a Match object for each match.
+ compile Compile a pattern into a Pattern object.
+ purge Clear the regular expression cache.
+ escape Backslash all non-alphanumerics in a string.
+
+Each function other than purge and escape can take an optional 'flags' argument
+consisting of one or more of the following module constants, joined by "|".
+A, L, and U are mutually exclusive.
+ A ASCII For string patterns, make \w, \W, \b, \B, \d, \D
+ match the corresponding ASCII character categories
+ (rather than the whole Unicode categories, which is the
+ default).
+ For bytes patterns, this flag is the only available
+ behaviour and needn't be specified.
+ I IGNORECASE Perform case-insensitive matching.
+ L LOCALE Make \w, \W, \b, \B, dependent on the current locale.
+ M MULTILINE "^" matches the beginning of lines (after a newline)
+ as well as the string.
+ "$" matches the end of lines (before a newline) as well
+ as the end of the string.
+ S DOTALL "." matches any character at all, including the newline.
+ X VERBOSE Ignore whitespace and comments for nicer looking RE's.
+ U UNICODE For compatibility only. Ignored for string patterns (it
+ is the default), and forbidden for bytes patterns.
+
+This module also defines an exception 'error'.
+
+"""
+
+importenum
+importsre_compile
+importsre_parse
+importfunctools
+try:
+ import_locale
+exceptImportError:
+ _locale=None
+
+
+# public symbols
+__all__=[
+ "match","fullmatch","search","sub","subn","split",
+ "findall","finditer","compile","purge","template","escape",
+ "error","Pattern","Match","A","I","L","M","S","X","U",
+ "ASCII","IGNORECASE","LOCALE","MULTILINE","DOTALL","VERBOSE",
+ "UNICODE",
+]
+
+__version__="2.2.1"
+
+classRegexFlag(enum.IntFlag):
+ ASCII=A=sre_compile.SRE_FLAG_ASCII# assume ascii "locale"
+ IGNORECASE=I=sre_compile.SRE_FLAG_IGNORECASE# ignore case
+ LOCALE=L=sre_compile.SRE_FLAG_LOCALE# assume current 8-bit locale
+ UNICODE=U=sre_compile.SRE_FLAG_UNICODE# assume unicode "locale"
+ MULTILINE=M=sre_compile.SRE_FLAG_MULTILINE# make anchors look for newline
+ DOTALL=S=sre_compile.SRE_FLAG_DOTALL# make dot match newline
+ VERBOSE=X=sre_compile.SRE_FLAG_VERBOSE# ignore whitespace and comments
+ # sre extensions (experimental, don't rely on these)
+ TEMPLATE=T=sre_compile.SRE_FLAG_TEMPLATE# disable backtracking
+ DEBUG=sre_compile.SRE_FLAG_DEBUG# dump pattern after compilation
+
+ def__repr__(self):
+ ifself._name_isnotNone:
+ returnf're.{self._name_}'
+ value=self._value_
+ members=[]
+ negative=value<0
+ ifnegative:
+ value=~value
+ forminself.__class__:
+ ifvalue&m._value_:
+ value&=~m._value_
+ members.append(f're.{m._name_}')
+ ifvalue:
+ members.append(hex(value))
+ res='|'.join(members)
+ ifnegative:
+ iflen(members)>1:
+ res=f'~({res})'
+ else:
+ res=f'~{res}'
+ returnres
+ __str__=object.__str__
+globals().update(RegexFlag.__members__)
+
+# sre exception
+error=sre_compile.error
+
+# --------------------------------------------------------------------
+# public interface
+
+defmatch(pattern,string,flags=0):
+ """Try to apply the pattern at the start of the string, returning
+ a Match object, or None if no match was found."""
+ return_compile(pattern,flags).match(string)
+
+deffullmatch(pattern,string,flags=0):
+ """Try to apply the pattern to all of the string, returning
+ a Match object, or None if no match was found."""
+ return_compile(pattern,flags).fullmatch(string)
+
+defsearch(pattern,string,flags=0):
+ """Scan through string looking for a match to the pattern, returning
+ a Match object, or None if no match was found."""
+ return_compile(pattern,flags).search(string)
+
+defsub(pattern,repl,string,count=0,flags=0):
+ """Return the string obtained by replacing the leftmost
+ non-overlapping occurrences of the pattern in string by the
+ replacement repl. repl can be either a string or a callable;
+ if a string, backslash escapes in it are processed. If it is
+ a callable, it's passed the Match object and must return
+ a replacement string to be used."""
+ return_compile(pattern,flags).sub(repl,string,count)
+
+defsubn(pattern,repl,string,count=0,flags=0):
+ """Return a 2-tuple containing (new_string, number).
+ new_string is the string obtained by replacing the leftmost
+ non-overlapping occurrences of the pattern in the source
+ string by the replacement repl. number is the number of
+ substitutions that were made. repl can be either a string or a
+ callable; if a string, backslash escapes in it are processed.
+ If it is a callable, it's passed the Match object and must
+ return a replacement string to be used."""
+ return_compile(pattern,flags).subn(repl,string,count)
+
+defsplit(pattern,string,maxsplit=0,flags=0):
+ """Split the source string by the occurrences of the pattern,
+ returning a list containing the resulting substrings. If
+ capturing parentheses are used in pattern, then the text of all
+ groups in the pattern are also returned as part of the resulting
+ list. If maxsplit is nonzero, at most maxsplit splits occur,
+ and the remainder of the string is returned as the final element
+ of the list."""
+ return_compile(pattern,flags).split(string,maxsplit)
+
+deffindall(pattern,string,flags=0):
+ """Return a list of all non-overlapping matches in the string.
+
+ If one or more capturing groups are present in the pattern, return
+ a list of groups; this will be a list of tuples if the pattern
+ has more than one group.
+
+ Empty matches are included in the result."""
+ return_compile(pattern,flags).findall(string)
+
+deffinditer(pattern,string,flags=0):
+ """Return an iterator over all non-overlapping matches in the
+ string. For each match, the iterator returns a Match object.
+
+ Empty matches are included in the result."""
+ return_compile(pattern,flags).finditer(string)
+
+defcompile(pattern,flags=0):
+ "Compile a regular expression pattern, returning a Pattern object."
+ return_compile(pattern,flags)
+
+defpurge():
+ "Clear the regular expression caches"
+ _cache.clear()
+ _compile_repl.cache_clear()
+
+deftemplate(pattern,flags=0):
+ "Compile a template pattern, returning a Pattern object"
+ return_compile(pattern,flags|T)
+
+# SPECIAL_CHARS
+# closing ')', '}' and ']'
+# '-' (a range in character set)
+# '&', '~', (extended character set operations)
+# '#' (comment) and WHITESPACE (ignored) in verbose mode
+_special_chars_map={i:'\\'+chr(i)foriinb'()[]{}?*+-|^$\\.&~# \t\n\r\v\f'}
+
+defescape(pattern):
+ """
+ Escape special characters in a string.
+ """
+ ifisinstance(pattern,str):
+ returnpattern.translate(_special_chars_map)
+ else:
+ pattern=str(pattern,'latin1')
+ returnpattern.translate(_special_chars_map).encode('latin1')
+
+Pattern=type(sre_compile.compile('',0))
+Match=type(sre_compile.compile('',0).match(''))
+
+# --------------------------------------------------------------------
+# internals
+
+_cache={}# ordered!
+
+_MAXCACHE=512
+def_compile(pattern,flags):
+ # internal: compile pattern
+ ifisinstance(flags,RegexFlag):
+ flags=flags.value
+ try:
+ return_cache[type(pattern),pattern,flags]
+ exceptKeyError:
+ pass
+ ifisinstance(pattern,Pattern):
+ ifflags:
+ raiseValueError(
+ "cannot process flags argument with a compiled pattern")
+ returnpattern
+ ifnotsre_compile.isstring(pattern):
+ raiseTypeError("first argument must be string or compiled pattern")
+ p=sre_compile.compile(pattern,flags)
+ ifnot(flags&DEBUG):
+ iflen(_cache)>=_MAXCACHE:
+ # Drop the oldest item
+ try:
+ del_cache[next(iter(_cache))]
+ except(StopIteration,RuntimeError,KeyError):
+ pass
+ _cache[type(pattern),pattern,flags]=p
+ returnp
+
+@functools.lru_cache(_MAXCACHE)
+def_compile_repl(repl,pattern):
+ # internal: compile replacement pattern
+ returnsre_parse.parse_template(repl,pattern)
+
+def_expand(pattern,match,template):
+ # internal: Match.expand implementation hook
+ template=sre_parse.parse_template(template,pattern)
+ returnsre_parse.expand_template(template,match)
+
+def_subx(pattern,template):
+ # internal: Pattern.sub/subn implementation helper
+ template=_compile_repl(template,pattern)
+ ifnottemplate[0]andlen(template[1])==1:
+ # literal replacement
+ returntemplate[1][0]
+ deffilter(match,template=template):
+ returnsre_parse.expand_template(template,match)
+ returnfilter
+
+# register myself for pickling
+
+importcopyreg
+
+def_pickle(p):
+ return_compile,(p.pattern,p.flags)
+
+copyreg.pickle(Pattern,_pickle,_compile)
+
+# --------------------------------------------------------------------
+# experimental stuff (see python-dev discussions for details)
+
+classScanner:
+ def__init__(self,lexicon,flags=0):
+ fromsre_constantsimportBRANCH,SUBPATTERN
+ ifisinstance(flags,RegexFlag):
+ flags=flags.value
+ self.lexicon=lexicon
+ # combine phrases into a compound pattern
+ p=[]
+ s=sre_parse.State()
+ s.flags=flags
+ forphrase,actioninlexicon:
+ gid=s.opengroup()
+ p.append(sre_parse.SubPattern(s,[
+ (SUBPATTERN,(gid,0,0,sre_parse.parse(phrase,flags))),
+ ]))
+ s.closegroup(gid,p[-1])
+ p=sre_parse.SubPattern(s,[(BRANCH,(None,p))])
+ self.scanner=sre_compile.compile(p)
+ defscan(self,string):
+ result=[]
+ append=result.append
+ match=self.scanner.scanner(string).match
+ i=0
+ whileTrue:
+ m=match()
+ ifnotm:
+ break
+ j=m.end()
+ ifi==j:
+ break
+ action=self.lexicon[m.lastindex-1][1]
+ ifcallable(action):
+ self.match=m
+ action=action(self,m.group())
+ ifactionisnotNone:
+ append(action)
+ i=j
+ returnresult,string[i:]
+
+
+
+
\ No newline at end of file
diff --git a/docs/1.0-dev/_sources/Coding/Changelog.md.txt b/docs/1.0-dev/_sources/Coding/Changelog.md.txt
index 85325a8e14..26c11b1860 100644
--- a/docs/1.0-dev/_sources/Coding/Changelog.md.txt
+++ b/docs/1.0-dev/_sources/Coding/Changelog.md.txt
@@ -5,7 +5,7 @@
> Not released yet
> 2019-2022 develop branch (WIP)
-Increase requirements: Django 4.1+, Twisted 22.10+ Python 3.9, 3.10, 3.11. PostgreSQL 11+.
+Increase requirements: Django 4.1+, Twisted 22.10+ Python 3.10, 3.11. PostgreSQL 11+.
- New `drop:holds()` lock default to limit dropping nonsensical things. Access check
defaults to True for backwards-compatibility in 0.9, will be False in 1.0
diff --git a/docs/1.0-dev/_sources/Contribs/Contrib-Godotwebsocket.md.txt b/docs/1.0-dev/_sources/Contribs/Contrib-Godotwebsocket.md.txt
index 3b062f5bb2..f007c7d5e4 100644
--- a/docs/1.0-dev/_sources/Contribs/Contrib-Godotwebsocket.md.txt
+++ b/docs/1.0-dev/_sources/Contribs/Contrib-Godotwebsocket.md.txt
@@ -53,7 +53,7 @@ You must also remove the protocol from the `connect_to_url` call made
within the `_ready` function.
```
-func _ready():
+func _ready():
# ...
# Change the following line from this
var err = _client.connect_to_url(websocket_url, ["lws-mirror-protocol"])
@@ -73,12 +73,12 @@ func _on_data():
var data = _client.get_peer(1).get_packet().get_string_from_utf8()
var json_data = JSON.parse(data).result
# The json_data is an array
-
+
# The first element informs us this is simple text
# so we add it to the RichTextlabel
if json_data[0] == 'text':
for msg in json_data[1]: label.append_bbcode(msg)
-
+
# Always useful to print the data and see what we got.
print(data)
```
@@ -101,17 +101,17 @@ caller.msg(coordinates=(9, 2))
```
Godot
-```gdscript
+```
func _on_data():
...
if json_data[0] == 'text':
for msg in json_data[1]: label.append_bbcode(msg)
-
+
# Notice the first element is the name of the kwarg we used from evennia.
elif json_data[0] == 'coordinates':
var coords_data = json_data[2]
player.set_pos(coords_data)
-
+
...
```
@@ -130,7 +130,7 @@ you receive, so you can manage the code better.
This is an example of a Script to use in Godot 3.
The script can be attached to the root UI node.
-```gdscript
+```
extends Node
# The URL to connect to, should be your mud.
@@ -187,7 +187,7 @@ func _on_data():
# elsewhere in the project.
self.emit_signal('updated_coordinates', json_data[1])
-
+
# We only print this for easier debugging.
print(data)
@@ -221,7 +221,7 @@ Note that the version is not final so the code may break.
It requires a WebSocketClientNode as a child of the root node.
The script can be attached to the root UI node.
-```gdscript
+```
extends Control
# The URL to connect to, should be your mud.
@@ -240,7 +240,7 @@ func _ready():
websocket.connect('connected_to_server', self._connected)
websocket.connect('connection_closed', self._closed)
websocket.connect('message_received', self._on_data)
-
+
# We attempt to connect and print out the error if we have one.
var result = websocket.connect_to_url(websocket_url)
if result != OK:
@@ -284,6 +284,7 @@ func _on_button_pressed():
```
+
----
This document page is generated from `evennia/contrib/base_systems/godotwebsocket/README.md`. Changes to this
diff --git a/docs/1.0-dev/_sources/Setup/Installation-Troubleshooting.md.txt b/docs/1.0-dev/_sources/Setup/Installation-Troubleshooting.md.txt
index ee7c5e885c..8564924f8d 100644
--- a/docs/1.0-dev/_sources/Setup/Installation-Troubleshooting.md.txt
+++ b/docs/1.0-dev/_sources/Setup/Installation-Troubleshooting.md.txt
@@ -7,12 +7,12 @@ you can run `evennia -l`, or start/reload the server with `evennia start -l` or
## Check your Requirements
-Any system that supports Python3.9+ should work.
+Any system that supports Python3.10+ should work.
- Linux/Unix
- Windows (Win7, Win8, Win10, Win11)
- Mac OSX (>10.5 recommended)
-- [Python](https://www.python.org) (v3.9, 3.10 and 3.11 are tested. 3.11 is recommended)
+- [Python](https://www.python.org) (3.10 and 3.11 are tested. 3.11 is recommended)
- [Twisted](https://twistedmatrix.com) (v22.3+)
- [ZopeInterface](https://www.zope.org/Products/ZopeInterface) (v3.0+) - usually included in Twisted packages
- Linux/Mac users may need the `gcc` and `python-dev` packages or equivalent.
diff --git a/docs/1.0-dev/_sources/Setup/Installation.md.txt b/docs/1.0-dev/_sources/Setup/Installation.md.txt
index 9105aa1b5c..8152a33f86 100644
--- a/docs/1.0-dev/_sources/Setup/Installation.md.txt
+++ b/docs/1.0-dev/_sources/Setup/Installation.md.txt
@@ -12,7 +12,7 @@ You can also [clone Evennia from github](./Installation-Git.md) or use [docker
```{sidebar} Develop in isolation
Installing Evennia doesn't make anything visible online. Apart from installation and updating, you can develop your game without any internet connection if you want to.
```
-- Evennia requires [Python](https://www.python.org/downloads/) 3.9, 3.10 or 3.11 (recommended). Any OS that supports Python should work.
+- Evennia requires [Python](https://www.python.org/downloads/) 3.10 or 3.11 (recommended). Any OS that supports Python should work.
- _Windows_: In the installer, make sure you select `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.
- _Windows:_ If you want to use Python 3.11, you must also install the [Windows SDK](https://aka.ms/vs/16/release/vs_buildtools.exe). Run the linked installer. Click the `Individual Components` tab at the top, then search and checkbox the latest `Windows 10 SDK` (also for older/newer Windows versions). Then click `Install`. If you have trouble, use Python 3.10 for now (2022).
- Don't install Evennia as administrator or superuser.
diff --git a/docs/1.0-dev/api/evennia.commands.default.account.html b/docs/1.0-dev/api/evennia.commands.default.account.html
index e271df0c7e..b8c1c7e5ff 100644
--- a/docs/1.0-dev/api/evennia.commands.default.account.html
+++ b/docs/1.0-dev/api/evennia.commands.default.account.html
@@ -133,7 +133,7 @@ method. Otherwise all text will be returned to all connected sessions.
-search_index_entry = {'aliases': 'remit pemit', 'category': 'admin', 'key': 'emit', 'no_prefix': ' remit pemit', 'tags': '', 'text': '\n admin command for emitting message to multiple objects\n\n Usage:\n emit[/switches] [<obj>, <obj>, ... =] <message>\n remit [<obj>, <obj>, ... =] <message>\n pemit [<obj>, <obj>, ... =] <message>\n\n Switches:\n room - limit emits to rooms only (default)\n accounts - limit emits to accounts only\n contents - send to the contents of matched objects too\n\n Emits a message to the selected objects or to\n your immediate surroundings. If the object is a room,\n send to its contents. remit and pemit are just\n limited forms of emit, for sending to rooms and\n to accounts respectively.\n '}¶
+search_index_entry = {'aliases': 'pemit remit', 'category': 'admin', 'key': 'emit', 'no_prefix': ' pemit remit', 'tags': '', 'text': '\n admin command for emitting message to multiple objects\n\n Usage:\n emit[/switches] [<obj>, <obj>, ... =] <message>\n remit [<obj>, <obj>, ... =] <message>\n pemit [<obj>, <obj>, ... =] <message>\n\n Switches:\n room - limit emits to rooms only (default)\n accounts - limit emits to accounts only\n contents - send to the contents of matched objects too\n\n Emits a message to the selected objects or to\n your immediate surroundings. If the object is a room,\n send to its contents. remit and pemit are just\n limited forms of emit, for sending to rooms and\n to accounts respectively.\n '}¶
diff --git a/docs/1.0-dev/api/evennia.commands.default.batchprocess.html b/docs/1.0-dev/api/evennia.commands.default.batchprocess.html
index b7288acdff..ffa29ad410 100644
--- a/docs/1.0-dev/api/evennia.commands.default.batchprocess.html
+++ b/docs/1.0-dev/api/evennia.commands.default.batchprocess.html
@@ -138,7 +138,7 @@ skipping, reloading etc.
-search_index_entry = {'aliases': 'batchcmd batchcommand', 'category': 'building', 'key': 'batchcommands', 'no_prefix': ' batchcmd batchcommand', 'tags': '', 'text': '\n build from batch-command file\n\n Usage:\n batchcommands[/interactive] <python.path.to.file>\n\n Switch:\n interactive - this mode will offer more control when\n executing the batch file, like stepping,\n skipping, reloading etc.\n\n Runs batches of commands from a batch-cmd text file (*.ev).\n\n '}¶
+search_index_entry = {'aliases': 'batchcommand batchcmd', 'category': 'building', 'key': 'batchcommands', 'no_prefix': ' batchcommand batchcmd', 'tags': '', 'text': '\n build from batch-command file\n\n Usage:\n batchcommands[/interactive] <python.path.to.file>\n\n Switch:\n interactive - this mode will offer more control when\n executing the batch file, like stepping,\n skipping, reloading etc.\n\n Runs batches of commands from a batch-cmd text file (*.ev).\n\n '}¶
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 05d8f30291..46d3e993dc 100644
--- a/docs/1.0-dev/api/evennia.commands.default.building.html
+++ b/docs/1.0-dev/api/evennia.commands.default.building.html
@@ -592,7 +592,7 @@ You can specify the /force switch to bypass this confirmation.
@@ -633,7 +633,7 @@ You can specify the /force switch to bypass this confirmation.
-search_index_entry = {'aliases': '@del @delete', 'category': 'building', 'key': '@destroy', 'no_prefix': 'destroy del delete', 'tags': '', 'text': '\n permanently delete objects\n\n Usage:\n destroy[/switches] [obj, obj2, obj3, [dbref-dbref], ...]\n\n Switches:\n override - The destroy command will usually avoid accidentally\n destroying account objects. This switch overrides this safety.\n force - destroy without confirmation.\n Examples:\n destroy house, roof, door, 44-78\n destroy 5-10, flower, 45\n destroy/force north\n\n Destroys one or many objects. If dbrefs are used, a range to delete can be\n given, e.g. 4-10. Also the end points will be deleted. This command\n displays a confirmation before destroying, to make sure of your choice.\n You can specify the /force switch to bypass this confirmation.\n '}¶
+search_index_entry = {'aliases': '@delete @del', 'category': 'building', 'key': '@destroy', 'no_prefix': 'destroy delete del', 'tags': '', 'text': '\n permanently delete objects\n\n Usage:\n destroy[/switches] [obj, obj2, obj3, [dbref-dbref], ...]\n\n Switches:\n override - The destroy command will usually avoid accidentally\n destroying account objects. This switch overrides this safety.\n force - destroy without confirmation.\n Examples:\n destroy house, roof, door, 44-78\n destroy 5-10, flower, 45\n destroy/force north\n\n Destroys one or many objects. If dbrefs are used, a range to delete can be\n given, e.g. 4-10. Also the end points will be deleted. This command\n displays a confirmation before destroying, to make sure of your choice.\n You can specify the /force switch to bypass this confirmation.\n '}¶
-search_index_entry = {'aliases': '@update @parent @type @typeclasses @swap', 'category': 'building', 'key': '@typeclass', 'no_prefix': 'typeclass update parent type typeclasses swap', 'tags': '', 'text': "\n set or change an object's typeclass\n\n Usage:\n typeclass[/switch] <object> [= typeclass.path]\n typeclass/prototype <object> = prototype_key\n\n typeclasses or typeclass/list/show [typeclass.path]\n swap - this is a shorthand for using /force/reset flags.\n update - this is a shorthand for using the /force/reload flag.\n\n Switch:\n show, examine - display the current typeclass of object (default) or, if\n given a typeclass path, show the docstring of that typeclass.\n update - *only* re-run at_object_creation on this object\n meaning locks or other properties set later may remain.\n reset - clean out *all* the attributes and properties on the\n object - basically making this a new clean object. This will also\n reset cmdsets!\n force - change to the typeclass also if the object\n already has a typeclass of the same name.\n list - show available typeclasses. Only typeclasses in modules actually\n imported or used from somewhere in the code will show up here\n (those typeclasses are still available if you know the path)\n prototype - clean and overwrite the object with the specified\n prototype key - effectively making a whole new object.\n\n Example:\n type button = examples.red_button.RedButton\n type/prototype button=a red button\n\n If the typeclass_path is not given, the current object's typeclass is\n assumed.\n\n View or set an object's typeclass. If setting, the creation hooks of the\n new typeclass will be run on the object. If you have clashing properties on\n the old class, use /reset. By default you are protected from changing to a\n typeclass of the same name as the one you already have - use /force to\n override this protection.\n\n The given typeclass must be identified by its location using python\n dot-notation pointing to the correct module and class. If no typeclass is\n given (or a wrong typeclass is given). Errors in the path or new typeclass\n will lead to the old typeclass being kept. The location of the typeclass\n module is searched from the default typeclass directory, as defined in the\n server settings.\n\n "}¶
+search_index_entry = {'aliases': '@update @type @swap @typeclasses @parent', 'category': 'building', 'key': '@typeclass', 'no_prefix': 'typeclass update type swap typeclasses parent', 'tags': '', 'text': "\n set or change an object's typeclass\n\n Usage:\n typeclass[/switch] <object> [= typeclass.path]\n typeclass/prototype <object> = prototype_key\n\n typeclasses or typeclass/list/show [typeclass.path]\n swap - this is a shorthand for using /force/reset flags.\n update - this is a shorthand for using the /force/reload flag.\n\n Switch:\n show, examine - display the current typeclass of object (default) or, if\n given a typeclass path, show the docstring of that typeclass.\n update - *only* re-run at_object_creation on this object\n meaning locks or other properties set later may remain.\n reset - clean out *all* the attributes and properties on the\n object - basically making this a new clean object. This will also\n reset cmdsets!\n force - change to the typeclass also if the object\n already has a typeclass of the same name.\n list - show available typeclasses. Only typeclasses in modules actually\n imported or used from somewhere in the code will show up here\n (those typeclasses are still available if you know the path)\n prototype - clean and overwrite the object with the specified\n prototype key - effectively making a whole new object.\n\n Example:\n type button = examples.red_button.RedButton\n type/prototype button=a red button\n\n If the typeclass_path is not given, the current object's typeclass is\n assumed.\n\n View or set an object's typeclass. If setting, the creation hooks of the\n new typeclass will be run on the object. If you have clashing properties on\n the old class, use /reset. By default you are protected from changing to a\n typeclass of the same name as the one you already have - use /force to\n override this protection.\n\n The given typeclass must be identified by its location using python\n dot-notation pointing to the correct module and class. If no typeclass is\n given (or a wrong typeclass is given). Errors in the path or new typeclass\n will lead to the old typeclass being kept. The location of the typeclass\n module is searched from the default typeclass directory, as defined in the\n server settings.\n\n "}¶
@@ -1531,7 +1531,7 @@ If object is not specified, the current location is examined.
@@ -1799,7 +1799,7 @@ the cases, see the module doc.
-search_index_entry = {'aliases': '@exam @ex', 'category': 'building', 'key': '@examine', 'no_prefix': 'examine exam ex', 'tags': '', 'text': '\n get detailed information about an object\n\n Usage:\n examine [<object>[/attrname]]\n examine [*<account>[/attrname]]\n\n Switch:\n account - examine an Account (same as adding *)\n object - examine an Object (useful when OOC)\n script - examine a Script\n channel - examine a Channel\n\n The examine command shows detailed game info about an\n object and optionally a specific attribute on it.\n If object is not specified, the current location is examined.\n\n Append a * before the search string to examine an account.\n\n '}¶
+search_index_entry = {'aliases': '@ex @exam', 'category': 'building', 'key': '@examine', 'no_prefix': 'examine ex exam', 'tags': '', 'text': '\n get detailed information about an object\n\n Usage:\n examine [<object>[/attrname]]\n examine [*<account>[/attrname]]\n\n Switch:\n account - examine an Account (same as adding *)\n object - examine an Object (useful when OOC)\n script - examine a Script\n channel - examine a Channel\n\n The examine command shows detailed game info about an\n object and optionally a specific attribute on it.\n If object is not specified, the current location is examined.\n\n Append a * before the search string to examine an account.\n\n '}¶
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 75e1381a56..0611c97236 100644
--- a/docs/1.0-dev/api/evennia.commands.default.comms.html
+++ b/docs/1.0-dev/api/evennia.commands.default.comms.html
@@ -1326,8 +1326,7 @@ must be added to game settings.
Link an Evennia channel to an external Discord channel
This creates a link between an in-game Evennia channel and an external
Discord channel. You must have a valid Discord bot application
-(https://discord.com/developers/applications)) and your DISCORD_BOT_TOKEN
+( https://discord.com/developers/applications ) and your DISCORD_BOT_TOKEN
must be added to settings. (Please put it in secret_settings !)
@@ -1398,7 +1397,7 @@ must be added to settings. (Please put it in secret_settings !)
-search_index_entry = {'aliases': 'discord', 'category': 'comms', 'key': 'discord2chan', 'no_prefix': ' discord', 'tags': '', 'text': '\n Link an Evennia channel to an external Discord channel\n\n Usage:\n discord2chan[/switches]\n discord2chan[/switches] <evennia_channel> [= <discord_channel_id>]\n discord2chan/name <bot_name>\n\n Switches:\n /list - (or no switch) show existing Evennia <-> Discord links\n /remove - remove an existing link by link ID\n /delete - alias to remove\n /guild - toggle the Discord server tag on/off\n /channel - toggle the Evennia/Discord channel tags on/off\n\n Example:\n discord2chan mydiscord = 555555555555555\n\n This creates a link between an in-game Evennia channel and an external\n Discord channel. You must have a valid Discord bot application\n (https://discord.com/developers/applications)) and your DISCORD_BOT_TOKEN\n must be added to settings. (Please put it in secret_settings !)\n '}¶
+search_index_entry = {'aliases': 'discord', 'category': 'comms', 'key': 'discord2chan', 'no_prefix': ' discord', 'tags': '', 'text': '\n Link an Evennia channel to an external Discord channel\n\n Usage:\n discord2chan[/switches]\n discord2chan[/switches] <evennia_channel> [= <discord_channel_id>]\n\n Switches:\n /list - (or no switch) show existing Evennia <-> Discord links\n /remove - remove an existing link by link ID\n /delete - alias to remove\n /guild - toggle the Discord server tag on/off\n /channel - toggle the Evennia/Discord channel tags on/off\n\n Example:\n discord2chan mydiscord = 555555555555555\n\n This creates a link between an in-game Evennia channel and an external\n Discord channel. You must have a valid Discord bot application\n ( https://discord.com/developers/applications ) and your DISCORD_BOT_TOKEN\n must be added to settings. (Please put it in secret_settings !)\n '}¶
-search_index_entry = {'aliases': 'ls l', 'category': 'general', 'key': 'look', 'no_prefix': ' ls l', 'tags': '', 'text': '\n look at location or object\n\n Usage:\n look\n look <obj>\n look *<account>\n\n Observes your location or objects in your vicinity.\n '}¶
+search_index_entry = {'aliases': 'l ls', 'category': 'general', 'key': 'look', 'no_prefix': ' l ls', 'tags': '', 'text': '\n look at location or object\n\n Usage:\n look\n look <obj>\n look *<account>\n\n Observes your location or objects in your vicinity.\n '}¶
-search_index_entry = {'aliases': ': 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 "}¶
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 e450185933..972851c8a4 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
@@ -729,7 +729,7 @@ to all the variables defined therein.
-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 "}¶
+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 "}¶
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 47b7f759bc..3c3f7b9316 100644
--- a/docs/1.0-dev/api/evennia.commands.default.tests.html
+++ b/docs/1.0-dev/api/evennia.commands.default.tests.html
@@ -955,7 +955,7 @@ main test suite started with
Test the batch processor.
-red_button = <module 'evennia.contrib.tutorials.red_button.red_button' from '/tmp/tmpgdacjs93/127176410081b3448b7297dcdb9fd2b286f222d6/evennia/contrib/tutorials/red_button/red_button.py'>¶
+red_button = <module 'evennia.contrib.tutorials.red_button.red_button' from '/tmp/tmpauqbzk0x/5f6e17d634ebcb7fa6648a4ce077e7442a19cba2/evennia/contrib/tutorials/red_button/red_button.py'>¶
@@ -157,7 +157,7 @@ there is no object yet before the account has logged in)
-search_index_entry = {'aliases': 'con conn co', 'category': 'general', 'key': 'connect', 'no_prefix': ' con conn co', 'tags': '', 'text': '\n connect to the game\n\n Usage (at login screen):\n connect accountname password\n connect "account name" "pass word"\n\n Use the create command to first create an account before logging in.\n\n If you have spaces in your name, enclose it in double quotes.\n '}¶
+search_index_entry = {'aliases': 'co conn con', 'category': 'general', 'key': 'connect', 'no_prefix': ' co conn con', 'tags': '', 'text': '\n connect to the game\n\n Usage (at login screen):\n connect accountname password\n connect "account name" "pass word"\n\n Use the create command to first create an account before logging in.\n\n If you have spaces in your name, enclose it in double quotes.\n '}¶
@@ -335,7 +335,7 @@ for simplicity. It shows a pane of info.
@@ -361,7 +361,7 @@ for simplicity. It shows a pane of info.
-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 '}¶
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 bd15030024..d023f0c354 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.
@@ -169,7 +169,7 @@ there is no object yet before the account has logged in)
-search_index_entry = {'aliases': 'con conn co', 'category': 'general', 'key': 'connect', 'no_prefix': ' con conn co', 'tags': '', 'text': '\n Connect to the game.\n\n Usage (at login screen):\n connect <email> <password>\n\n Use the create command to first create an account before logging in.\n '}¶
+search_index_entry = {'aliases': 'co conn con', 'category': 'general', 'key': 'connect', 'no_prefix': ' co conn con', 'tags': '', 'text': '\n Connect to the game.\n\n Usage (at login screen):\n connect <email> <password>\n\n Use the create command to first create an account before logging in.\n '}¶
@@ -335,7 +335,7 @@ for simplicity. It shows a pane of info.
@@ -361,7 +361,7 @@ for simplicity. It shows a pane of info.
-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 '}¶
@@ -191,7 +191,7 @@ aliases to an already joined channel.
-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 '}¶
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 c92db7d068..b14a70568e 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': 'abort quit chicken out q', 'category': 'evscaperoom', 'key': 'give up', 'no_prefix': ' abort quit chicken out 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 '}¶
+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 '}¶
-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 '}¶
-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 '}¶
@@ -490,7 +490,7 @@ looks and what actions is available.
-search_index_entry = {'aliases': 'examine e ex unfocus', 'category': 'evscaperoom', 'key': 'focus', 'no_prefix': ' examine e 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': 'examine e unfocus ex', 'category': 'evscaperoom', 'key': 'focus', 'no_prefix': ' examine e unfocus 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 '}¶
diff --git a/docs/1.0-dev/api/evennia.contrib.game_systems.turnbattle.tb_basic.html b/docs/1.0-dev/api/evennia.contrib.game_systems.turnbattle.tb_basic.html
index 25ebb9630c..28d785b62d 100644
--- a/docs/1.0-dev/api/evennia.contrib.game_systems.turnbattle.tb_basic.html
+++ b/docs/1.0-dev/api/evennia.contrib.game_systems.turnbattle.tb_basic.html
@@ -672,7 +672,7 @@ if there are still any actions you can take.
@@ -698,7 +698,7 @@ if there are still any actions you can take.
-search_index_entry = {'aliases': 'hold wait', 'category': 'combat', 'key': 'pass', 'no_prefix': ' hold wait', 'tags': '', 'text': '\n Passes on your turn.\n\n Usage:\n pass\n\n When in a fight, you can use this command to end your turn early, even\n if there are still any actions you can take.\n '}¶
+search_index_entry = {'aliases': 'wait hold', 'category': 'combat', 'key': 'pass', 'no_prefix': ' wait hold', 'tags': '', 'text': '\n Passes on your turn.\n\n Usage:\n pass\n\n When in a fight, you can use this command to end your turn early, even\n if there are still any actions you can take.\n '}¶
diff --git a/docs/1.0-dev/api/evennia.contrib.game_systems.turnbattle.tb_equip.html b/docs/1.0-dev/api/evennia.contrib.game_systems.turnbattle.tb_equip.html
index 0fb36afa54..85e1ac5c29 100644
--- a/docs/1.0-dev/api/evennia.contrib.game_systems.turnbattle.tb_equip.html
+++ b/docs/1.0-dev/api/evennia.contrib.game_systems.turnbattle.tb_equip.html
@@ -567,7 +567,7 @@ if there are still any actions you can take.
@@ -587,7 +587,7 @@ if there are still any actions you can take.
-search_index_entry = {'aliases': 'hold wait', 'category': 'combat', 'key': 'pass', 'no_prefix': ' hold wait', 'tags': '', 'text': '\n Passes on your turn.\n\n Usage:\n pass\n\n When in a fight, you can use this command to end your turn early, even\n if there are still any actions you can take.\n '}¶
+search_index_entry = {'aliases': 'wait hold', 'category': 'combat', 'key': 'pass', 'no_prefix': ' wait hold', 'tags': '', 'text': '\n Passes on your turn.\n\n Usage:\n pass\n\n When in a fight, you can use this command to end your turn early, even\n if there are still any actions you can take.\n '}¶
diff --git a/docs/1.0-dev/api/evennia.contrib.game_systems.turnbattle.tb_items.html b/docs/1.0-dev/api/evennia.contrib.game_systems.turnbattle.tb_items.html
index b491101cea..1228c03d81 100644
--- a/docs/1.0-dev/api/evennia.contrib.game_systems.turnbattle.tb_items.html
+++ b/docs/1.0-dev/api/evennia.contrib.game_systems.turnbattle.tb_items.html
@@ -690,7 +690,7 @@ if there are still any actions you can take.
@@ -710,7 +710,7 @@ if there are still any actions you can take.
-search_index_entry = {'aliases': 'hold wait', 'category': 'combat', 'key': 'pass', 'no_prefix': ' hold wait', 'tags': '', 'text': '\n Passes on your turn.\n\n Usage:\n pass\n\n When in a fight, you can use this command to end your turn early, even\n if there are still any actions you can take.\n '}¶
+search_index_entry = {'aliases': 'wait hold', 'category': 'combat', 'key': 'pass', 'no_prefix': ' wait hold', 'tags': '', 'text': '\n Passes on your turn.\n\n Usage:\n pass\n\n When in a fight, you can use this command to end your turn early, even\n if there are still any actions you can take.\n '}¶
diff --git a/docs/1.0-dev/api/evennia.contrib.game_systems.turnbattle.tb_magic.html b/docs/1.0-dev/api/evennia.contrib.game_systems.turnbattle.tb_magic.html
index 41ea08d804..3bfc041b0b 100644
--- a/docs/1.0-dev/api/evennia.contrib.game_systems.turnbattle.tb_magic.html
+++ b/docs/1.0-dev/api/evennia.contrib.game_systems.turnbattle.tb_magic.html
@@ -469,7 +469,7 @@ if there are still any actions you can take.
@@ -489,7 +489,7 @@ if there are still any actions you can take.
-search_index_entry = {'aliases': 'hold wait', 'category': 'combat', 'key': 'pass', 'no_prefix': ' hold wait', 'tags': '', 'text': '\n Passes on your turn.\n\n Usage:\n pass\n\n When in a fight, you can use this command to end your turn early, even\n if there are still any actions you can take.\n '}¶
+search_index_entry = {'aliases': 'wait hold', 'category': 'combat', 'key': 'pass', 'no_prefix': ' wait hold', 'tags': '', 'text': '\n Passes on your turn.\n\n Usage:\n pass\n\n When in a fight, you can use this command to end your turn early, even\n if there are still any actions you can take.\n '}¶
diff --git a/docs/1.0-dev/api/evennia.contrib.game_systems.turnbattle.tb_range.html b/docs/1.0-dev/api/evennia.contrib.game_systems.turnbattle.tb_range.html
index eca07b30fa..80df9f0e01 100644
--- a/docs/1.0-dev/api/evennia.contrib.game_systems.turnbattle.tb_range.html
+++ b/docs/1.0-dev/api/evennia.contrib.game_systems.turnbattle.tb_range.html
@@ -929,7 +929,7 @@ if there are still any actions you can take.
@@ -949,7 +949,7 @@ if there are still any actions you can take.
-search_index_entry = {'aliases': 'hold wait', 'category': 'combat', 'key': 'pass', 'no_prefix': ' hold wait', 'tags': '', 'text': '\n Passes on your turn.\n\n Usage:\n pass\n\n When in a fight, you can use this command to end your turn early, even\n if there are still any actions you can take.\n '}¶
+search_index_entry = {'aliases': 'wait hold', 'category': 'combat', 'key': 'pass', 'no_prefix': ' wait hold', 'tags': '', 'text': '\n Passes on your turn.\n\n Usage:\n pass\n\n When in a fight, you can use this command to end your turn early, even\n if there are still any actions you can take.\n '}¶
diff --git a/docs/1.0-dev/api/evennia.contrib.rpg.dice.dice.html b/docs/1.0-dev/api/evennia.contrib.rpg.dice.dice.html
index f934d57a9e..c485bd9dc5 100644
--- a/docs/1.0-dev/api/evennia.contrib.rpg.dice.dice.html
+++ b/docs/1.0-dev/api/evennia.contrib.rpg.dice.dice.html
@@ -305,7 +305,7 @@ everyone but the person rolling.
@@ -331,7 +331,7 @@ everyone but the person rolling.
-search_index_entry = {'aliases': 'roll @dice', 'category': 'general', 'key': 'dice', 'no_prefix': ' roll dice', 'tags': '', 'text': "\n roll dice\n\n Usage:\n dice[/switch] <nr>d<sides> [modifier] [success condition]\n\n Switch:\n hidden - tell the room the roll is being done, but don't show the result\n secret - don't inform the room about neither roll nor result\n\n Examples:\n dice 3d6 + 4\n dice 1d100 - 2 < 50\n\n This will roll the given number of dice with given sides and modifiers.\n So e.g. 2d6 + 3 means to 'roll a 6-sided die 2 times and add the result,\n then add 3 to the total'.\n Accepted modifiers are +, -, * and /.\n A success condition is given as normal Python conditionals\n (<,>,<=,>=,==,!=). So e.g. 2d6 + 3 > 10 means that the roll will succeed\n only if the final result is above 8. If a success condition is given, the\n outcome (pass/fail) will be echoed along with how much it succeeded/failed\n with. The hidden/secret switches will hide all or parts of the roll from\n everyone but the person rolling.\n "}¶
+search_index_entry = {'aliases': '@dice roll', 'category': 'general', 'key': 'dice', 'no_prefix': ' dice roll', 'tags': '', 'text': "\n roll dice\n\n Usage:\n dice[/switch] <nr>d<sides> [modifier] [success condition]\n\n Switch:\n hidden - tell the room the roll is being done, but don't show the result\n secret - don't inform the room about neither roll nor result\n\n Examples:\n dice 3d6 + 4\n dice 1d100 - 2 < 50\n\n This will roll the given number of dice with given sides and modifiers.\n So e.g. 2d6 + 3 means to 'roll a 6-sided die 2 times and add the result,\n then add 3 to the total'.\n Accepted modifiers are +, -, * and /.\n A success condition is given as normal Python conditionals\n (<,>,<=,>=,==,!=). So e.g. 2d6 + 3 > 10 means that the roll will succeed\n only if the final result is above 8. If a success condition is given, the\n outcome (pass/fail) will be echoed along with how much it succeeded/failed\n with. The hidden/secret switches will hide all or parts of the roll from\n everyone but the person rolling.\n "}¶
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 85d9c35a24..6fbbaf97fa 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
@@ -865,7 +865,7 @@ Using the command without arguments will list all current recogs.
@@ -892,7 +892,7 @@ Using the command without arguments will list all current recogs.
-search_index_entry = {'aliases': 'forget recognize', 'category': 'general', 'key': 'recog', 'no_prefix': ' forget recognize', 'tags': '', 'text': '\n Recognize another person in the same room.\n\n Usage:\n recog\n recog sdesc as alias\n forget alias\n\n Example:\n recog tall man as Griatch\n forget griatch\n\n This will assign a personal alias for a person, or forget said alias.\n Using the command without arguments will list all current recogs.\n\n '}¶
+search_index_entry = {'aliases': 'recognize forget', 'category': 'general', 'key': 'recog', 'no_prefix': ' recognize forget', 'tags': '', 'text': '\n Recognize another person in the same room.\n\n Usage:\n recog\n recog sdesc as alias\n forget alias\n\n Example:\n recog tall man as Griatch\n forget griatch\n\n This will assign a personal alias for a person, or forget said alias.\n Using the command without arguments will list all current recogs.\n\n '}¶
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..3790a76f77 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': 'unwear unwield', 'category': 'general', 'key': 'remove', 'no_prefix': ' unwear unwield', 'tags': '', 'text': '\n Remove a remove a weapon/shield, armor or helmet.\n\n Usage:\n remove <item>\n unwield <item>\n unwear <item>\n\n To remove an item from the backpack, use |wdrop|n instead.\n\n '}¶
+search_index_entry = {'aliases': 'unwield unwear', 'category': 'general', 'key': 'remove', 'no_prefix': ' unwield unwear', 'tags': '', 'text': '\n Remove a remove a weapon/shield, armor or helmet.\n\n Usage:\n remove <item>\n unwield <item>\n unwear <item>\n\n To remove an item from the backpack, use |wdrop|n instead.\n\n '}¶
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 a4a8dc4e6c..7c9defa676 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': '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 '}¶
+search_index_entry = {'aliases': 'break lid smash smash lid', 'category': 'general', 'key': 'smash glass', 'no_prefix': ' break lid smash smash lid', 'tags': '', 'text': '\n Smash the protective glass.\n\n Usage:\n smash glass\n\n Try to smash the glass of the button.\n\n '}¶
-search_index_entry = {'aliases': 'listen feel examine ex l get', 'category': 'general', 'key': 'look', 'no_prefix': ' listen feel examine ex l get', '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 get listen ex feel examine', 'category': 'general', 'key': 'look', 'no_prefix': ' l get listen ex feel 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 "}¶
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 6f454f001c..11378c4089 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.
@@ -805,7 +805,7 @@ parry - forgoes your attack but will make you harder to hit on next
-search_index_entry = {'aliases': 'stab defend fight hit parry kill thrust chop pierce slash bash', 'category': 'tutorialworld', 'key': 'attack', 'no_prefix': ' stab defend fight hit parry kill thrust chop pierce slash bash', 'tags': '', 'text': '\n Attack the enemy. Commands:\n\n stab <enemy>\n slash <enemy>\n parry\n\n stab - (thrust) makes a lot of damage but is harder to hit with.\n slash - is easier to land, but does not make as much damage.\n parry - forgoes your attack but will make you harder to hit on next\n enemy attack.\n\n '}¶
+search_index_entry = {'aliases': 'fight stab parry kill hit thrust slash bash pierce defend chop', 'category': 'tutorialworld', 'key': 'attack', 'no_prefix': ' fight stab parry kill hit thrust slash bash pierce defend chop', 'tags': '', 'text': '\n Attack the enemy. Commands:\n\n stab <enemy>\n slash <enemy>\n parry\n\n stab - (thrust) makes a lot of damage but is harder to hit with.\n slash - is easier to land, but does not make as much damage.\n parry - forgoes your attack but will make you harder to hit on next\n enemy attack.\n\n '}¶
diff --git a/docs/1.0-dev/api/evennia.contrib.tutorials.tutorial_world.rooms.html b/docs/1.0-dev/api/evennia.contrib.tutorials.tutorial_world.rooms.html
index 66057458fd..1d4b5b0d7d 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
@@ -816,7 +816,7 @@ if they fall off the bridge.
@@ -996,7 +996,7 @@ random chance of eventually finding a light source.
-search_index_entry = {'aliases': 'feel search fiddle l feel around', 'category': 'tutorialworld', 'key': 'look', 'no_prefix': ' feel search fiddle l feel around', 'tags': '', 'text': '\n Look around in darkness\n\n Usage:\n look\n\n Look around in the darkness, trying\n to find something.\n '}¶
+search_index_entry = {'aliases': 'l feel around fiddle feel search', 'category': 'tutorialworld', 'key': 'look', 'no_prefix': ' l feel around fiddle feel search', 'tags': '', 'text': '\n Look around in darkness\n\n Usage:\n look\n\n Look around in the darkness, trying\n to find something.\n '}¶
diff --git a/docs/1.0-dev/api/evennia.server.portal.discord.html b/docs/1.0-dev/api/evennia.server.portal.discord.html
index 90c82674eb..818691788c 100644
--- a/docs/1.0-dev/api/evennia.server.portal.discord.html
+++ b/docs/1.0-dev/api/evennia.server.portal.discord.html
@@ -113,6 +113,20 @@ added to server/conf/secret_settings.py as your DISCORD_BOT_TO
evennia.server.portal.discord.random() → x in the interval [0, 1).¶
diff --git a/docs/1.0-dev/api/evennia.server.portal.irc.html b/docs/1.0-dev/api/evennia.server.portal.irc.html
index 86627831a1..fa01a07c46 100644
--- a/docs/1.0-dev/api/evennia.server.portal.irc.html
+++ b/docs/1.0-dev/api/evennia.server.portal.irc.html
@@ -156,7 +156,7 @@ as sends text to it when prompted
-search_index_entry = {'aliases': 'n abort yes y a no __nomatch_command', 'category': 'general', 'key': '__noinput_command', 'no_prefix': ' n abort yes y a no __nomatch_command', 'tags': '', 'text': '\n Handle a prompt for yes or no. Press [return] for the default choice.\n\n '}¶
+search_index_entry = {'aliases': 'no y yes a n __nomatch_command abort', 'category': 'general', 'key': '__noinput_command', 'no_prefix': ' no y yes a n __nomatch_command abort', 'tags': '', 'text': '\n Handle a prompt for yes or no. Press [return] for the default choice.\n\n '}¶
diff --git a/docs/1.0-dev/api/evennia.utils.evmore.html b/docs/1.0-dev/api/evennia.utils.evmore.html
index 3eec0f6458..80987d88b1 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.
@@ -163,7 +163,7 @@ the caller.msg() construct every time the page is updated.
-search_index_entry = {'aliases': 'n abort top q next end e a quit previous t p', 'category': 'general', 'key': '__noinput_command', 'no_prefix': ' n abort top q next end e a quit previous t p', 'tags': '', 'text': '\n Manipulate the text paging. Catch no-input with aliases.\n '}¶
+search_index_entry = {'aliases': 'top t n p next e quit previous a abort end q', 'category': 'general', 'key': '__noinput_command', 'no_prefix': ' top t n p next e quit previous a abort end q', 'tags': '', 'text': '\n Manipulate the text paging. Catch no-input with aliases.\n '}¶
Returns a Q object for searching by tag names for typeclasses
:param tag_type: The type of tag (None, ‘alias’, etc)
:type tag_type: str or None
diff --git a/docs/1.0-dev/genindex.html b/docs/1.0-dev/genindex.html
index c9771f2b74..f53179ffa7 100644
--- a/docs/1.0-dev/genindex.html
+++ b/docs/1.0-dev/genindex.html
@@ -269,6 +269,8 @@