butterrobot/docs/plugins.md
Felipe M. 29538b7d63
All checks were successful
CI / format (push) Successful in 1m50s
CI / lint (push) Successful in 3m0s
CI / goreleaser-lint (push) Successful in 10s
CI / test (push) Successful in 1m35s
CI / build (push) Successful in 1m35s
chore: remove Slack platform support
Slack was always marked as untested and is being dropped, leaving
Telegram as the sole supported platform.

- Delete the internal/platform/slack connector package
- Remove Slack registration in the platform factory
- Remove SlackConfig and its SLACK_TOKEN env vars from config
- Scrub Slack from README, docs, and .env examples
- Drop incidental Slack references from the gallerydl plugin copy

Also fixes a pre-existing staticcheck SA5011 warning in db_test.go
so the tree lints cleanly.
2026-07-06 07:52:31 +02:00

3.5 KiB

Provided plugins

Development

  • ping: Say ping to get response with time elapsed.

Fun and entertainment

  • Lo quito: What happens when you say "lo quito"...? (Spanish pun)
  • Dice: Put !dice and wathever roll you want to perform.
  • Coin: Flip a coin and get heads or tails.

Utility

  • Help: Shows available commands when you type !help. Lists all enabled plugins for the current channel organized by category with their descriptions and usage instructions.
  • Remind Me: Reply to a message with !remindme <duration> to set a reminder. Supported duration units: y (years), mo (months), d (days), h (hours), m (minutes), s (seconds). Examples: !remindme 1y for 1 year, !remindme 3mo for 3 months, !remindme 2d for 2 days, !remindme 3h for 3 hours. The bot will mention you with a reminder after the specified time.
  • Search and Replace: Reply to any message with s/search/replace/[flags] to perform text substitution. Supports flags: g (global), i (case insensitive), n (regex pattern). Example: s/hello/hi/gi replaces all occurrences of "hello" with "hi" case-insensitively.
  • Gallery-DL Downloader: Reply to a message containing a link with !gallerydl (or send !gallerydl <link> directly) to download the media at that link using the gallery-dl CLI and have it posted back as a reply. Restricted to allowed users only — no one is allowed by default. Configure the comma-separated allowed_users list (Telegram @username, with or without the leading @) through the admin interface, globally or per channel. An optional gallery_dl_path option sets the executable path (default gallery-dl on PATH). Media upload is currently supported on Telegram only, and the gallery-dl binary must be installed on the host running the bot.

Security

  • Domain Blocker: Blocks messages containing links from specified domains. Configure it per channel with a comma-separated list of domains to block. When a message contains a link matching any of the blocked domains, the bot will notify that the message contained a blocked domain. This plugin requires configuration through the admin interface.

Social Media

  • Twitter Link Expander: Automatically converts twitter.com and x.com links to alternative domain links and removes tracking parameters. This allows for better media embedding in chat platforms. Configure with domain option to set replacement domain (default: fxtwitter.com).
  • Instagram Link Expander: Automatically converts instagram.com links to alternative domain links and removes tracking parameters. This allows for better media embedding in chat platforms. Configure with domain option to set replacement domain (default: ddinstagram.com).

Plugin configuration

Plugins that require configuration (e.g. Domain Blocker, Twitter/Instagram Link Expander) can be configured in two places through the admin interface:

  • Global configuration — app-wide defaults for a plugin, set from the Plugins page via the "Configure" button (/admin/plugins/config/<plugin id>). These values apply to every channel that has the plugin enabled.
  • Per-channel configuration — set from a channel's plugin list. A channel inherits the global configuration and only overrides the values you fill in.

The effective configuration a plugin receives for a message is the global configuration with the channel's non-empty values layered on top. Leaving a channel field blank makes it inherit the global value for that field, so you only need to set values globally once and override per channel where needed.