Module
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
type CommandHandler func(msg *Message) error
type WatcherHandler func(msg *Message) errorReihenfolge im Lebenszyklus
Erzeugen → Base binden → Init → [registriert] → ClientReady
↓
Befehle / Watcher
↓
OnUnloadEin minimales Modul
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.