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:
// .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:
// .ban 42 spam hier
msg.ArgsList() // []string{"42", "spam", "hier"}
msg.Arg(0) // "42"
msg.Arg(1) // "spam"
msg.Arg(9) // "" — kein PanicArg ist grenzsicher. Du musst die Länge nie vorher prüfen:
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.
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 wurdeEin 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:
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:
"mycmd": { OnlyReply: true },Felder von Message
| Feld | Typ | Bedeutung |
|---|---|---|
ID | int64 | Nachrichten-ID |
ChatID | int64 | Wo sie gesendet wurde |
SenderID | int64 | Wer sie gesendet hat |
Text | string | Text mit angewandter Formatierung |
RawText | string | Text genau wie getippt |
Out | bool | Von dir gesendet |
IsPrivate, IsGroup, IsChannel | bool | Chattyp |
Media | tg.MessageMediaClass | Anhang, nil wenn keiner |
ReplyToMsgID | int64 | 0, wenn keine Antwort |
IsForwarded | bool | Von woanders weitergeleitet |
Abbruch
msg.Context() wird beim Herunterfahren abgebrochen. Gib ihn an alles Langsame weiter:
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.