The message sender
message.NewSender
is the workhorse for outgoing messages. Sending messages
covered the essentials; this page is the fuller tour.
import "github.com/gotd/td/telegram/message"
sender := message.NewSender(client.API())
Targets
Every send starts by choosing a destination, which returns a request builder:
sender.Self() // Saved Messages
sender.Resolve("@durov") // username / t.me link / phone / deeplink
sender.ResolveDomain("durov") // bare username
sender.ResolvePhone("+123...") // phone number
sender.To(inputPeer) // a tg.InputPeerClass you already hold
sender.Reply(entities, update) // reply inside an update handler
Resolve and friends are lazy promises — the network lookup happens when you call a
terminal method like Text. To cache and speed up repeated resolution, give the sender
a resolver backed by peer storage via sender.WithResolver.
Message kinds
The builder has a terminal method for each kind of message:
b := sender.Resolve("@channel")
b.Text(ctx, "plain")
b.Textf(ctx, "value = %d", 42)
b.StyledText(ctx, styling.Bold("formatted")) // see Styled text
b.Media(ctx, mediaOption) // uploaded/external media
b.Album(ctx, m1, m2, m3) // media group
b.Photo(ctx, inputFile)
b.PhotoExternal(ctx, "https://example.com/a.jpg")
b.Poll(ctx, /* poll options */)
b.Contact(ctx, "+123", "Alice")
b.Location(ctx, lat, long)
b.Dice(ctx) // 🎲 and other emoji games
Media accepts the media options produced by the
uploader helpers (e.g. message.UploadedDocument,
message.UploadedPhoto).
Modifiers
Modifiers chain before the terminal call and return the builder:
| Modifier | Effect |
|---|---|
Silent() | Deliver without a notification sound |
NoWebpage() | Suppress link previews |
Reply(msgID) | Reply to a specific message |
Schedule(t) | Schedule for a time.Time |
NoForwards() | Forbid forwarding/saving the message |
InvertMedia() | Put media below the text |
Markup(m) / Row(...) | Attach an inline/reply keyboard |
SendAs(peer) | Post as a linked channel/anonymous admin |
sender.Resolve("@channel").
Silent().
NoWebpage().
Reply(replyToID).
Text(ctx, "scheduled-looking quiet reply")
Editing and drafts
sender.To(peer).Edit(msgID).Text(ctx, "edited text")
sender.To(peer).SaveDraft(ctx, "a draft I'll finish later")
Uploads and randomness
sender.WithUploader(u) lets the sender upload local files for media sends, and
sender.WithRand(r) overrides the random source used for message IDs (useful in tests).
See next: Styled text and HTML.