Skip to content

Base

go
type Base struct {
	Client     *CustomTelegramClient
	DB         *Database
	Translator *Translator
}

Bette es ein, und ein Modul braucht nur Name und Commands.

go
type Weather struct{ goroku.Base }

Felder

FeldWofür
ClientTelegram-API — Dateien senden, Peers auflösen, Inline-Manager
DBDauerhafter Speicher, siehe Speicher
TranslatorUnterbau 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.

go
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:

go
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

go
func NewBase(client *CustomTelegramClient, db *Database) Base

Für ein von Hand erzeugtes Modul, das nicht über den Loader registriert wird — interne Helfer und Tests:

go
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.

Released under the GNU AGPL v3 License.