Skip to content

Watcher

Ein Watcher sieht jede Nachricht in jedem Chat, den das Konto lesen kann — nicht nur Befehle.

go
func (m *Mod) Watchers() []goroku.WatcherHandler {
	return []goroku.WatcherHandler{
		func(msg *goroku.Message) error {
			if strings.Contains(strings.ToLower(msg.Text), "goroku") {
				return msg.Reply("👋")
			}
			return nil
		},
	}
}

WatcherHandler hat dieselbe Form wie ein Befehls-Handler: func(msg *goroku.Message) error.

Filtern

Filtere deklarativ mit WatcherMetas, positionsweise zum Slice aus Watchers zugeordnet. Der Dispatcher wendet den Filter an, bevor dein Code läuft — das ist klarer und billiger als ein if am Anfang jedes Watchers:

go
func (m *Mod) WatcherMetas() []goroku.CommandMeta {
	return []goroku.CommandMeta{
		{
			OnlyGroups:  true,
			NoForwarded: true,
			Contains:    "goroku",
		},
	}
}

Es stehen dieselben Felder wie bei CommandMeta zur Verfügung.

Kosten

Watcher laufen bei jeder Nachricht. Ein langsamer oder gesprächiger Watcher ist im ganzen Bot spürbar.

  • Gib sofort nil zurück, wenn die Nachricht nicht deine ist. Die billigste Prüfung zuerst.
  • Schreibe nicht pro Nachricht in die Datenbank — siehe das Sammel-Beispiel unter Speicher.
  • Watcher laufen nebenläufig in einem begrenzten Pool. Ist der Pool voll, werden Aufrufe verworfen statt eingereiht — ein langsamer Watcher kostet dich also Nachrichten.
go
func(msg *goroku.Message) error {
	if msg.Out || msg.Text == "" {
		return nil // die billigstmögliche Ablehnung zuerst
	}
	if !strings.Contains(msg.Text, "goroku") {
		return nil
	}
	return m.handle(msg)
}

Panics

Ein Panic in einem Watcher wird abgefangen und mit deinem Modulnamen geloggt; der Bot läuft weiter.

Watcher oder Befehl?

NimmWenn
BefehlDer Nutzer verlangt ausdrücklich etwas
WatcherDu reagierst auf gewöhnliche Unterhaltung

Wenn du im Watcher ein Präfix parst, willst du eigentlich einen Befehl.

Released under the GNU AGPL v3 License.