Skip to content

Miscellaneous stuff

This section contains some odds and ends that were not discussed in previous sections.

Plugin initialization

Plugins are initialized when Slack Machine starts. Because the MachineBasePlugin already has a constructor that is used to pass various things to the plugin instance at startup, it is advised not to provide a constructor for your plugin.

If your plugin needs to initialize its own things at startup, you can override the init() method. This method will be called once when the plugin is initialized. It is no-op by default. If you choose to implement this method, make sure it is async. This allows you to use the async plugin API of Slack Machine to interact with Slack and also lets you use the plugin storage.

When the init() methods of plugins are called, the underlying Slack client has already been initialized, so you should have full access to all Slack-related information, incl. a populated list of users and channels

Logging

Slack Machine uses structlog for logging. In your plugins, you can instantiate and use a logger as follows:

from structlog.stdlib import get_logger

logger = get_logger(__name__)


async def my_function():
    logger.info("Running my function", foo=42, bar="hello")

Logging message handler invocations

By default, Slack Machine will log anytime a Slack message triggers a handler in a plugin. This log statement will include the message that triggered the handler and the user id & name of the user that posted the message.

You can disable these log message by setting LOG_HANDLED_MESSAGES to False in your local_settings.py

Using loggers provided by Slack Machine in your handler functions

Structlog allows adding extra parameters as context. Slack Machine leverages this to bind the id and name of the user who sent a message to a logger as context variables whenever a message triggers a handler function. You can opt-in to using this logger, by adding a logger parameter to your handler function.

async def my_handler(msg, logger):
    logger.info("my_handler invoked!")

Slack Machine will automatically inject a logger with the right context variables into your handler. The example will produce a message like:

2022-10-21T14:29:05.639162Z [info] my_handler invoked! [example_plugin.my_plugin.MyPlugin.my_handler] filename=my_plugin.py func_name=my_handler lineno=5 user_id=U12345678 user_name=user1

This currently works for handler functions that are decorated with respond_to, listen_to or command

Plugin help information

You can provide help text for your plugin and its commands by adding docstrings to your plugin class and its methods. The first line of the docstring of a plugin class will be used for grouping help information of plugin methods. This even extends beyond one class, ie. if multiple plugin classes have the same docstring (first line), the help information for the methods under those classes will be grouped together.

The first line of the docstring of each plugin method can be used for specifying help information for that specific function. It should be in the format command: help text.

The machine.plugins.builtin.help.HelpPlugin (enabled by default) will provide Slack users with the help information described above.