Manual:Event Engine
Event System
Events in Mudlet allow a paradigm of system-building that is easy to maintain (because if you’d like to restructure something, you’d have to do less work), enables interoperability (making a collection of scripts that work with each other is easier) and enables an event-based way of programming.
The essentials of it are as such: you use Scripts to define which events should a function to listen to, and when the event is raised, the said function(s) will be called. Events can also have function parameters with them, which’ll be passed onto the receiving functions.
Registering an event handler via UI
Registering an event handler means that you’ll be telling Mudlet what function should it call for you when an event is raised, so it’s a two step process - you need to tell it both what function you’d like to be called, and on what event should it be called.
To tell it what function should be called, create a new script, and give the script the name of the function you’d like to be called. This is the only time where an items name matters in Mudlet. You can define the function right inside the script as well, if you’d like.
Next, we tell it what event or events should this function be called on - you can add multiple ones. To do that, enter the events name in the Add User Defined Event Handler: field, press enter, and it’ll go into the list - and that is all.
Registering an event from a script
You can also register your event with the registerAnonymousEventHandler(event name, function name) function inside your scripts:
-- example taken from the God Wars 2 (http://godwars2.org) Mudlet UI - forces the window to keep to a certain size
function keepStaticSize()
setMainWindowSize(1280,720)
end -- keepStaticSize
registerAnonymousEventHandler("sysWindowResizeEvent", "keepStaticSize")
Note: Mudlet also uses the event system in-game protocols (like ATCP, GMCP and others).
Raising an event
To raise an event, you'd use the raiseEvent() function:
raiseEvent(name, [arguments...])
It takes an event name as the first argument, and then any amount of arguments after it which will be passed onto the receiving functions.
Example of registering and raising an event
Add a script to each profile you need the event.
-- This is the function that will be called when the event is raised.
-- "event" is set to the event name.
-- "arg" is the argument(s) provided with raiseEvent/rasieGlobalEvent.
-- "profile" - Is the profile name from where the raiseGlobalEvent where triggered from
-- It is 'nil' if raiseEvent() was used.
function onMyEvent(event, arg, profile)
echo("Event: " .. event .. "\n")
echo("Arg : " .. arg .. "\n")
-- If the event is not raised with raiseGlobalEvent() profile will be 'nil'
echo("Profile: " .. (profile or "Local" .. "\n")
end
-- Register the event handler.
registerAnonymousEventHandler("my_event", "onMyEvent")
To raise the event you can call:
-- Trigger only in the current profile:
raiseEvent("my_event", "Hello world!")
-- Trigger the event in all OTHER profiles:
raiseGlobalEvent("my_event", "Hello World!")
Note: Global events needs Mudlet 3.1.0 - and they are NOT sent to the profile that calls raiseGlobalEvent!
Mudlet-raised events
Mudlet itself also creates events for your scripts to hook on. The following events are generated currently:
channel102Message
Raised when a telnet sub-option 102 message is received (which comprises of two numbers passed in the event). This is of particular use with the Aardwolf MUD who originated this protocol. See this forum topic for more about the Mudlet Aardwolf GUI that makes use of this.
mapOpenEvent
Raised when the mapper is opened - either the floating dock or the in-Mudlet widget.
sysWindowResizeEvent
Raised when the main window is resized, with the new height and width coordinates passed to the event. A common usecase for this event is to move/resize your UI elements according to the new dimensions. Example
This sample code will echo whenever a resize happened with the new dimensions:
function resizeEvent( event, x, y )
echo("RESIZE EVENT: event="..event.." x="..x.." y="..y.."\n")
end
sysWindowMousePressEvent
Raised when a mouse button is pressed down anywhere on the main window (note that a click is composed of a mouse press and mouse release). The button number and the x,y coordinates of the click are reported. Example
function onClickHandler( event, button, x, y )
echo("CLICK event:"..event.." button="..button.." x="..x.." y="..y.."\n")
end
sysWindowMouseReleaseEvent
Raised when a mouse button is released after being pressed down anywhere on the main window (note that a click is composed of a mouse press and mouse release). See sysWindowMousePressEvent for example use.
sysLoadEvent
Raised when Mudlet is loading the profile. Note that when it does so, it also compiles and runs all scripts - which could be a good idea to initialize everything at, but beware - scripts are also run when saved. Hence, hooking only on the sysLoadEvent would prevent multiple re-loads as you’re editing the script.
sysExitEvent
Raised when Mudlet is shutting down the profile - a good event to hook onto for saving all of your data.
sysDownloadDone
Raised when Mudlet is finished downloading a file successfully - the location of the downloaded file is passed as a second argument.
Example - put it into a new script and save it to run:
-- create a function to parse the downloaded webpage and display a result
function downloaded_file(_, filename)
-- is the file that downloaded ours?
if not filename:find("achaea-who-count.html", 1, true) then return end
-- read the contents of the webpage in
local f, s, webpage = io.open(filename)
if f then webpage = f:read("*a"); io.close(f) end
-- delete the file on disk, don't clutter
os.remove(filename)
-- parse our downloaded file for the player count
local pc = webpage:match([[Total: (%d+) players online]])
display("Achaea has "..tostring(pc).." players on right now.")
end
-- register our function to run on the event that something was downloaded
registerAnonymousEventHandler("sysDownloadDone", "downloaded_file")
-- download a list of fake users for a demo
downloadFile(getMudletHomeDir().."/achaea-who-count.html", "https://www.achaea.com/game/who")
You should see a result like this:
sysDownloadError
Raised when downloading a file failed - the second argument contains the error message. Starting with Mudlet 2.0-test5+, it specifies the original URL that was going to be downloaded.
sysIrcMessage
Raised when the IRC client receives an IRC message. The sender's name, channel name, and their message are passed as arguments to this event.
Starting with Mudlet 3.3, this event changes slightly to provide more information from IRC network messages. Data such as status codes, command responses, or error messages sent by the IRC Server may formatted as plain text by the client and posted to lua via this event.
- sender argument may be the nick name of an IRC user or the name of the IRC server host, as retrievable by getIrcConnectedHost()
- channel argument may not always contain a channel name, but will be the name of the target/recipient of a message or action. In some networks the name may be that of a service (like "Auth" for example.)
- Example
function onIrcMessage(_, sender, target, message)
echo(string.format('(%s) %s says, "%s"\n', target, sender, message))
end
Note: Added to Mudlet in an unreleased 2.0rc8, available since Mudlet 2.1+
sysDataSendRequest
Raised right before a command from the send() function or the command line is sent to the game - useful for keeping track of what your last command was, or even denying the command to be sent if necessary with denyCurrentSend().
Note: if you'll be making use of denyCurrentSend(), you really should notify the user that you denied their command - unexperienced ones might conclude that your script or Mudlet is buggy if they don't see visual feedback. Do not mis-use this and use it as keylogger either.
function onNetworkOutput(_, command)
if math.random(2) == 1 then
echo("Hello! Sending "..command.." to the game.\n")
else
echo("Not your day! Denying "..command..".\n")
denyCurrentSend()
end
end
sysConnectionEvent
Raised when the profile becomes connected to a MUD - available in 2.0-test5+.
sysDisconnectionEvent
Raised when the profile becomes disconnected, either manually or by the game - available in 2.0-test5+.
sysTelnetEvent
Raised whenever an unsupported telnet option is encountered, allowing you to handle it yourself. The arguments that get passed with the event are type, telnet option, and the message. Available in 2.1+
sysManualLocationSetEvent
Raised whenever the "set location" command (on the 2D mapper context menu) is used to reposition the current "player room". It provides the room ID of the new room ID that the player has been moved to.
Note: Present since Mudlet 3.0.0 Epsilon preview.
sysMapDownloadEvent
Raised whenever an MMP map (currently only supported by IRE games) is downloaded and loaded in.
sysProtocolDisabled
Raised whenever a communications protocol is disabled, with the protocol name passed as an argument. Current values Mudlet will use for this are: GMCP, MDSP, ATCP, GMCP, MXP, and channel102.
sysProtocolEnabled
Raised whenever a communications protocol is enabled, with the protocol name passed as an argument. Current values Mudlet will use for this are: GMCP, MDSP, ATCP, MXP, and channel102.
function onProtocolEnabled(_, protocol)
if protocol == "GMCP" then
print("GMCP enabled! Now we can use GMCP data.")
end
end
sysInstall
Raised right after a module or package is being installed by any means. This can be used to display post-installation information or setup things.
Event handlers receive the name of the installed package or module as additional argument.
Note: Available in Mudlet 3.1+
sysUninstall
Raised right before a module or package is being uninstalled by any means. This can be used to display post-removal information or for cleanup.
Event handlers receive the name of the removed package or module as additional argument.
Note: Available in Mudlet 3.1+
sysInstallPackage
Raised right after a package is being installed by any means. This can be used to display post-installation information or setup things.
Event handlers receive the name of the installed package as well as the file name as additional arguments.
Note: Available in Mudlet 3.1+
sysInstallModule
Raised right after a module is being installed through the module dialog. This can be used to display post-installation information or setup things.
Event handlers receive the name of the installed module as well as the file name as additional arguments.
Note: Available in Mudlet 3.1+
sysSyncInstallModule
Raised right after a module is being installed through the "sync" mechanism. This can be used to display post-installation information or setup things.
Event handlers receive the name of the installed module as well as the file name as additional arguments.
Note: Available in Mudlet 3.1+
sysLuaInstallModule
Raised right after a module is being installed through the lua installModule command. This can be used to display post-installation information or setup things.
Event handlers receive the name of the installed module as well as the file name as additional arguments.
Note: Available in Mudlet 3.1+
sysUninstallPackage
Raised right before a package is being removed by any means. This can be used to display post-removal information or for cleanup.
Event handlers receive the name of the removed package as additional argument.
Note: Available in Mudlet 3.1+
sysUninstallModule
Raised right before a module is being removed through the module dialog. This can be used to display post-removal information or for cleanup.
Event handlers receive the name of the removed module as additional argument.
Note: Available in Mudlet 3.1+
sysSyncUninstallModule
Raised right before a module is being removed through the "sync" mechanism. This can be used to display post-removal information or for cleanup.
Event handlers receive the name of the removed module as additional argument.
Note: Available in Mudlet 3.1+
sysLuaUninstallModule
Raised right before a module is being removed through the lua uninstallModule command. This can be used to display post-removal information or for cleanup.
Event handlers receive the name of the removed module as additional argument.
Note: Available in Mudlet 3.1+
sysSoundFinished
Raised when a sound finished playing. This can be used in a music player for example to start the next song.
Event handlers receive the sound file name and the file path as additional arguments.
Note: Available in Mudlet 3.1+