Inputfuncs¶
Internet│
┌─────┐ │ ┌────────┐
┌──────┐ │Text │ │ ┌────────────┐ ┌─────────┐ │Command │
│Client├────┤JSON ├─┼──►commandtuple├────►Inputfunc├────►DB query│
└──────┘ │etc │ │ └────────────┘ └─────────┘ │etc │
└─────┘ │ └────────┘
│Evennia
The Inputfunc is the last fixed step on the Ingoing message path. The available Inputfuncs are looked up and called using commandtuple
structures sent from the client. The job of the Inputfunc is to perform whatever action is requested, by firing a Command, performing a database query or whatever is needed.
Given a commandtuple
on the form
(commandname, (args), {kwargs})
Evennia will try to find and call an Inputfunc on the form
def commandname(session, *args, **kwargs):
# ...
Or, if no match was found, it will call an inputfunc named “default” on this form
def default(session, cmdname, *args, **kwargs):
# cmdname is the name of the mismatched inputcommand
The default inputfuncs are found in evennia/server/inputfuncs.py.
Adding your own inputfuncs¶
Add a function on the above form to
mygame/server/conf/inputfuncs.py
. Your function must be in the global, outermost scope of that module and not start with an underscore (_
) to be recognized as an inputfunc. ireload
the server.
To overload a default inputfunc (see below), just add a function with the same name. You can also extend the settings-list INPUT_FUNC_MODULES
.
INPUT_FUNC_MODULES += ["path.to.my.inputfunc.module"]
All global-level functions with a name not starting with _
in these module(s) will be used by Evennia as an inputfunc. The list is imported from left to right, so latter imported functions will replace earlier ones.
Default inputfuncs¶
Evennia defines a few default inputfuncs to handle the common cases. These are defined in
evennia/server/inputfuncs.py
.
text¶
Input:
("text", (textstring,), {})
Output: Depends on Command triggered
This is the most common of inputs, and the only one supported by every traditional mud. The argument is usually what the user sent from their command line. Since all text input from the user like this is considered a Command, this inputfunc will do things like nick-replacement and then pass on the input to the central Commandhandler.
echo¶
Input:
("echo", (args), {})
Output:
("text", ("Echo returns: %s" % args), {})
This is a test input, which just echoes the argument back to the session as text. Can be used for testing custom client input.
default¶
The default function, as mentioned above, absorbs all non-recognized inputcommands. The default one will just log an error.
client_options¶
Input:
("client_options, (), {key:value, ...})
Output:
normal: None
get:
("client_options", (), {key:value, ...})
This is a direct command for setting protocol options. These are settable with the @option
command, but this offers a client-side way to set them. Not all connection protocols makes use of
all flags, but here are the possible keywords:
get (bool): If this is true, ignore all other kwargs and immediately return the current settings as an outputcommand
("client_options", (), {key=value, ...})
-client (str): A client identifier, like “mushclient”.
version (str): A client version
ansi (bool): Supports ansi colors
xterm256 (bool): Supports xterm256 colors or not
mxp (bool): Supports MXP or not
utf-8 (bool): Supports UTF-8 or not
screenreader (bool): Screen-reader mode on/off
mccp (bool): MCCP compression on/off
screenheight (int): Screen height in lines
screenwidth (int): Screen width in characters
inputdebug (bool): Debug input functions
nomarkup (bool): Strip all text tags
raw (bool): Leave text tags unparsed
Note that there are two GMCP aliases to this inputfunc -
hello
andsupports_set
, which means it will be accessed via the GMCPHello
andSupports.Set
instructions assumed by some clients.
get_client_options¶
Input:
("get_client_options, (), {key:value, ...})
Output:
("client_options, (), {key:value, ...})
This is a convenience wrapper that retrieves the current options by sending “get” to client_options
above.
get_inputfuncs¶
Input:
("get_inputfuncs", (), {})
Output:
("get_inputfuncs", (), {funcname:docstring, ...})
Returns an outputcommand on the form ("get_inputfuncs", (), {funcname:docstring, ...})
- a list of all the available inputfunctions along with their docstrings.
login¶
Note: this is currently experimental and not very well tested.
Input:
("login", (username, password), {})
Output: Depends on login hooks
This performs the inputfunc version of a login operation on the current Session. It’s meant to be used by custom client setups.
get_value¶
Input: ("get_value", (name, ), {})
Output: ("get_value", (value, ), {})
Retrieves a value from the Character or Account currently controlled by this Session. Takes one argument, This will only accept particular white-listed names, you’ll need to overload the function to expand. By default the following values can be retrieved:
“name” or “key”: The key of the Account or puppeted Character.
“location”: Name of the current location, or “None”.
“servername”: Name of the Evennia server connected to.
repeat¶
Input:
("repeat", (), {"callback":funcname, "interval": secs, "stop": False})
Output: Depends on the repeated function. Will return
("text", (repeatlist),{}
with a list of accepted names if given an unfamiliar callback name.
This will tell evennia to repeatedly call a named function at a given interval. Behind the scenes this will set up a Ticker. Only previously acceptable functions are possible to repeat-call in this way, you’ll need to overload this inputfunc to add the ones you want to offer. By default only two example functions are allowed, “test1” and “test2”, which will just echo a text back at the given interval. Stop the repeat by sending "stop": True
(note that you must include both the callback name and interval for Evennia to know what to stop).
unrepeat¶
Input:
("unrepeat", (), ("callback":funcname, "interval": secs)
Output: None
This is a convenience wrapper for sending “stop” to the repeat
inputfunc.
monitor¶
Input:
("monitor", (), ("name":field_or_argname, stop=False)
Output (on change):
("monitor", (), {"name":name, "value":value})
This sets up on-object monitoring of Attributes or database fields. Whenever the field or Attribute changes in any way, the outputcommand will be sent. This is using the MonitorHandler behind the scenes. Pass the “stop” key to stop monitoring. Note that you must supply the name also when stopping to let the system know which monitor should be cancelled.
Only fields/attributes in a whitelist are allowed to be used, you have to overload this function to add more. By default the following fields/attributes can be monitored:
“name”: The current character name
“location”: The current location
“desc”: The description Argument
unmonitor¶
Input:
("unmonitor", (), {"name":name})
Output: None
A convenience wrapper that sends “stop” to the monitor
function.