Skip to content

Plugin Interface ​

MTGo's plugin system lets you encapsulate reusable behavior and attach it to a Client.

Interface ​

go
type Plugin interface {
    Name() string
    Start(ctx context.Context, client *telegram.Client) error
    Stop(ctx context.Context) error
}
MethodDescription
Name()Returns a unique string identifier for the plugin
Start(ctx, client)Called during client.Connect. Receives the *Client for registration of handlers, middleware, etc.
Stop(ctx)Called during client.Stop. Clean up resources, flush state, etc.

Registration ​

go
client.Use(myPlugin)

Multiple plugins can be registered. They are started in registration order and stopped in reverse order.

Lifecycle ​

  1. client.Use(plugin) — registers the plugin
  2. client.Connect() — calls plugin.Start(ctx, client) for all registered plugins
  3. client.Stop() — calls plugin.Stop(ctx) for all registered plugins

Middleware ​

Plugins can register middleware from within Start:

go
func (p *MyPlugin) Start(ctx context.Context, client *telegram.Client) error {
    p.client = client
    client.UseMiddleware(func(next tg.Handler) tg.Handler {
        return tg.HandlerFunc(func(ctx *tg.Context) {
            // pre-processing
            next.Handle(ctx)
            // post-processing
        })
    })
    return nil
}

Minimal Example ​

go
package logger

import (
    "context"
    tg "github.com/mtgo-labs/mtgo/telegram"
)

type Plugin struct {
    client *tg.Client
}

func New() *Plugin {
    return &Plugin{}
}

func (p *Plugin) Name() string {
    return "logger"
}

func (p *Plugin) Start(ctx context.Context, client *tg.Client) error {
    p.client = client
    p.client.OnMessage(func(c *tg.Context) {
        if c.Message != nil {
            log.Printf("[msg] %d: %s", c.Message.FromID, c.Message.Text)
        }
    })
    return nil
}

func (p *Plugin) Stop(ctx context.Context) error {
    return nil
}

Usage:

go
client.Use(logger.New())
client.Connect(0)

Released under the Apache-2.0 License.