Base
type Base struct {
Client *CustomTelegramClient
DB *Database
Translator *Translator
}Bette es ein, und ein Modul braucht nur Name und Commands.
type Weather struct{ goroku.Base }Felder
| Feld | Wofür |
|---|---|
Client | Telegram-API — Dateien senden, Peers auflösen, Inline-Manager |
DB | Dauerhafter Speicher, siehe Speicher |
Translator | Unterbau für T; direkt brauchst du ihn selten |
Alle drei werden vom Loader vor Init gefüllt, sind also in Init, ClientReady, Befehlen und Watchern gleichermaßen nutzbar.
Methoden
T(key, def string) string
Übersetzter String zu key, sonst def. Ersetzt den getTrans-Helfer, den Module früher kopiert haben.
return msg.Answer(m.T("no_city", "❌ <b>Welche Stadt?</b>"))Aufgelöst wird goroku.modules.<Name>.<key> mit dem Modulnamen wie geschrieben, kleingeschrieben und in snake_case, danach über TranslationAliases.
Sicher bei nil-Base und bei nicht registriertem Modul — dann kommt def.
Init(client, db) error
Verdrahtet die Felder und gibt nil zurück. Überschreib es ruhig:
func (m *Weather) Init(client *goroku.CustomTelegramClient, db *goroku.Database) error {
if err := m.Base.Init(client, db); err != nil {
return err
}
m.cache = make(map[string]string)
return nil
}Der Loader füllt die Felder vor Init, der Aufruf m.Base.Init ist im Normalbetrieb also überflüssig. Behalte ihn: so funktioniert das Modul auch, wenn es in einem Test direkt erzeugt wird.
ClientReady() / OnUnload() / OnDlmod() error
Geben nil zurück. Überschreib die, die du brauchst.
Strings() map[string]string
Gibt nil zurück. Überschreiben, um Text zu deklarieren.
Watchers() []WatcherHandler
Gibt nil zurück. Überschreiben, um jede Nachricht zu sehen.
NewBase
func NewBase(client *CustomTelegramClient, db *Database) BaseFür ein von Hand erzeugtes Modul, das nicht über den Loader registriert wird — interne Helfer und Tests:
mod := &Weather{Base: goroku.NewBase(client, db)}Das einbettende Modul ist hier nicht bekannt, T liefert daher seinen Standardwert, bis das Modul registriert ist.
Namenskonflikte
Hat dein Struct bereits ein Feld Client, DB oder Translator, wird der Name durch das Einbetten von Base mehrdeutig. Benenne deins um oder greife explizit über das eingebettete Struct zu: m.Base.Client.