Skip to content

Eingaben lesen

Jeder Handler bekommt eine *goroku.Message. Diese Helfer decken fast das ganze Parsen von Argumenten ab.

Args

Alles nach dem Befehlswort, außen getrimmt:

go
// .say hallo zusammen
msg.Args() // "hallo zusammen"

// .say
msg.Args() // ""

Innere Abstände bleiben erhalten — .say a b ergibt "a b" — das ist also sicher für Text, den du wortgetreu weitergeben willst.

ArgsList und Arg

Nach Leerzeichen zerlegt:

go
// .ban 42 spam hier
msg.ArgsList() // []string{"42", "spam", "hier"}
msg.Arg(0)     // "42"
msg.Arg(1)     // "spam"
msg.Arg(9)     // "" — kein Panic

Arg ist grenzsicher. Du musst die Länge nie vorher prüfen:

go
func (m *Mod) BanCmd(msg *goroku.Message) error {
	id := msg.Arg(0)
	if id == "" {
		return msg.Answer(m.T("no_id", "❌ <b>Wen?</b>"))
	}
	reason := msg.Arg(1) // "" wenn weggelassen — das ist in Ordnung
	return m.ban(id, reason)
}

ArgsOrReply

Das Muster, das die meisten Befehle wollen: die getippten Argumente nehmen, sonst auf die Nachricht zurückfallen, auf die geantwortet wurde.

go
func (m *HTML) HTMLCmd(msg *goroku.Message) error {
	code := msg.ArgsOrReply()
	if code == "" {
		return msg.Answer(m.T("no_args", "❌ <b>Sende Text oder antworte auf eine Nachricht</b>"))
	}
	return msg.Answer(code)
}

Damit funktioniert beides:

.html <b>hi</b>          → rendert das getippte Markup
.html  (als Antwort)     → rendert die Nachricht, auf die geantwortet wurde

Ein leeres Ergebnis heißt: es gab weder das eine noch das andere — behandle es als „nichts zu tun".

Die Antwortnachricht

Für alles außer ihrem Text hol sie dir:

go
reply, err := msg.GetReplyMessage()
if err != nil || reply == nil {
	return msg.Answer(m.T("reply_needed", "❌ <b>Antworte auf eine Nachricht</b>"))
}

if reply.Media != nil {
	// Anhang verarbeiten
}

Um eine Antwort zu verlangen, nutze besser die deklarative Form — der Dispatcher filtert, bevor dein Handler läuft:

go
"mycmd": { OnlyReply: true },

Felder von Message

FeldTypBedeutung
IDint64Nachrichten-ID
ChatIDint64Wo sie gesendet wurde
SenderIDint64Wer sie gesendet hat
TextstringText mit angewandter Formatierung
RawTextstringText genau wie getippt
OutboolVon dir gesendet
IsPrivate, IsGroup, IsChannelboolChattyp
Mediatg.MessageMediaClassAnhang, nil wenn keiner
ReplyToMsgIDint640, wenn keine Antwort
IsForwardedboolVon woanders weitergeleitet

Abbruch

msg.Context() wird beim Herunterfahren abgebrochen. Gib ihn an alles Langsame weiter:

go
req, err := http.NewRequestWithContext(msg.Context(), http.MethodGet, url, nil)
if err != nil {
	return err
}
resp, err := http.DefaultClient.Do(req)

Handler, die ihn ignorieren, funktionieren weiterhin — das Herunterfahren wartet dann eben auf sie.

Released under the GNU AGPL v3 License.