Skip to content

Module

go
type Module interface {
	Name() string
	Strings() map[string]string
	Init(client *CustomTelegramClient, db *Database) error
	ClientReady() error
	OnUnload() error
	OnDlmod() error
	Commands() map[string]CommandHandler
	Watchers() []WatcherHandler
}

Das Einbetten von goroku.Base liefert jede Methode außer Name und Commands.

Methoden

Name() string

Die Identität des Moduls — in .help, .unloadmod, der Konfigurationsoberfläche und als Besitzerschlüssel im Speicher. Muss unter den geladenen Modulen eindeutig sein.

Strings() map[string]string

Übersetzbarer Text. Die besonderen Schlüsselpräfixe stehen unter Übersetzungen. Base gibt nil zurück, das ist gültig.

Init(client, db) error

Wird einmal bei der Registrierung aufgerufen, bevor ein Handler laufen kann. Base hat Client, DB und Translator bereits gefüllt.

Ein zurückgegebener Fehler bricht die Registrierung ab, das Modul wird nicht geladen.

ClientReady() error

Wird aufgerufen, sobald der Telegram-Client verbunden ist. Für Arbeit, die die API braucht; Init kann vor dem Verbindungsaufbau laufen.

OnUnload() error

Wird beim Entfernen des Moduls aufgerufen. Gib Goroutinen und Handles frei.

Ein Panic hier wird abgefangen und geloggt, das Entfernen läuft weiter.

OnDlmod() error

Wird direkt nach der Installation über .dlmod aufgerufen.

Commands() map[string]CommandHandler

Befehlswort auf Handler. Der Schlüssel ist, was Nutzer nach dem Präfix tippen, ohne Beachtung der Groß-/Kleinschreibung. nil ist für ein Modul mit nur Watchern gültig.

Watchers() []WatcherHandler

Handler, die bei jeder Nachricht aufgerufen werden. Base gibt nil zurück.

Handler-Typen

go
type CommandHandler func(msg *Message) error
type WatcherHandler func(msg *Message) error

Reihenfolge im Lebenszyklus

Erzeugen → Base binden → Init → [registriert] → ClientReady

                              Befehle / Watcher

                                   OnUnload

Ein minimales Modul

go
package modules

import "goroku/goroku"

type Ping struct{ goroku.Base }

func (m *Ping) Name() string { return "Ping" }

func (m *Ping) Commands() map[string]goroku.CommandHandler {
	return map[string]goroku.CommandHandler{
		"ping": func(msg *goroku.Message) error { return msg.Answer("🏓 pong") },
	}
}

Ohne Base implementieren

Base ist optional. Ein Modul, das alle acht Methoden selbst implementiert, funktioniert genauso, und Module aus der Zeit vor Base laden unverändert weiter.

Released under the GNU AGPL v3 License.