Middlewares
Middlewares are functions that are run before a command is invoked. They can be used to inject data into a command's plugin.Context
, conditionalize execution, or do things like performance and stats tracking.
Adam itself provides middlewares on both a global and a per-plugin level. Aside from that, you can also add middlewares through the state. The order of execution is as follows.
A message create event or message update event is received by the state's event handler.
All global state middlewares are called.
The
MessageCreateMiddlewares
orMessageUpdateMiddlewares
found in the bot'sOption
s are called.The router is called, which either routes the command or discards the message if it's not a command.
Adam's global middlewares are called.
The plugin's middlewares are called, starting from the highest-most module to the command itself.
Adam's global post-middlewares are called.
The command is invoked.
Adding middlewares
Global middlewares can be added using bot.Bot.AddMiddleware
. Similarly, global post middlewares can be added using bot.Bot.AddPostMiddleware
.
To get the plugin middlewares, the bot checks if interface { Middlewares() []bot.MiddlewareFunc }
is implemented. Every module.Module
already does that, and you can add middlewares using .AddMiddleware(f interface{})
. However, commands, being custom types, need to implement that interface manually. You can do so by embedding a bot.MiddlewareManager
into your command's struct, which adds the required Middlewares
function, as well as an AddMiddleware
function to add middlewares to the command.
Supported types
bot.MiddlewareManager
, bot.Bot
, and module.Module
support the following middleware signatures:
func(*state.State, interface{})
func(*state.State, interface{}) error
func(*state.State, *state.Base)
func(*state.State, *state.Base) error
func(*state.State, *state.MessageCreateEvent)
func(*state.State, *state.MessageCreateEvent) error
func(*state.State, *state.MessageUpdateEvent)
func(*state.State, *state.MessageUpdateEvent) error
func(next CommandFunc) CommandFunc
Last updated
Was this helpful?