(new): v1.2 release
Golang lint / lint (push) Successful in 11m32s

This commit is contained in:
2026-08-19 14:58:25 +03:00
parent f03a081ed6
commit 29b208eeec
79 changed files with 7301 additions and 2060 deletions
+61 -10
View File
@@ -13,6 +13,12 @@ import (
"git.scuroneko.dev/scuroneko/sneklog/v2"
)
const (
defaultMaxRetries = 3
maximumResponseSize = 10 << 20
minimumRetryDelay = 100 * time.Millisecond
)
// APIOpts holds configuration options for initializing the Telegram API client.
// Use the provided setter methods to build options — do not construct directly.
type APIOpts struct {
@@ -26,6 +32,7 @@ type APIOpts struct {
limiter *utils.RateLimiter
dropOverflowLimit bool
maxRetries int
}
// NewAPIOpts creates a new APIOpts with default values.
@@ -36,6 +43,7 @@ func NewAPIOpts(token string) *APIOpts {
client: nil,
useTestServer: false,
apiURL: "https://api.telegram.org",
maxRetries: defaultMaxRetries,
}
}
@@ -91,6 +99,16 @@ func (opts *APIOpts) SetDropRateLimitOverflow(b bool) *APIOpts {
return opts
}
// SetMaxRetries sets the maximum number of retries after Telegram returns 429.
// A non-positive value disables automatic retries. The default is 3.
func (opts *APIOpts) SetMaxRetries(maxRetries int) *APIOpts {
if maxRetries < 0 {
maxRetries = 0
}
opts.maxRetries = maxRetries
return opts
}
// API is the main Telegram Bot API client for JSON requests.
//
// Use API methods when sending JSON payloads (for example with file_id, URL, or other
@@ -107,9 +125,11 @@ type API struct {
logFormat utils.LogFormat
logFormatter *sneklog.Formatter
pool *workerPool
pool *workerPool
// Limiter is the optional rate limiter applied before requests are sent.
Limiter *utils.RateLimiter
dropOverflowLimit bool
maxRetries int
}
// NewAPI creates a new API client from options.
@@ -145,6 +165,7 @@ func NewAPI(opts *APIOpts) *API {
pool: pool,
Limiter: opts.limiter,
dropOverflowLimit: opts.dropOverflowLimit,
maxRetries: opts.maxRetries,
}
}
@@ -167,18 +188,29 @@ func (api *API) GetLogger() *sneklog.Logger {
// ResponseParameters contains Telegram API response metadata (e.g., retry_after, migrate_to_chat_id).
type ResponseParameters struct {
// MigrateToChatID Optional. The group has been migrated to a supergroup with the specified identifier. This
// number may have more than 32 significant bits and some programming languages may have difficulty/silent
// defects in interpreting it. But it has at most 52 significant bits, so a signed 64-bit integer or
// double-precision float type are safe for storing this identifier.
MigrateToChatID *int64 `json:"migrate_to_chat_id,omitempty"`
RetryAfter *int `json:"retry_after,omitempty"`
// RetryAfter Optional. In case of exceeding flood control, the number of seconds left to wait before the
// request can be repeated
RetryAfter *int `json:"retry_after,omitempty"`
}
// TelegramResponse is the standard Telegram Bot API response structure.
// Generic over Result type R.
type TelegramResponse[R any] struct {
Ok bool `json:"ok"`
Description string `json:"description,omitempty"`
Result R `json:"result,omitempty"`
ErrorCode int `json:"error_code,omitempty"`
Parameters *ResponseParameters `json:"parameters,omitempty"`
// Ok reports whether the request succeeded.
Ok bool `json:"ok"`
// Description contains a human-readable result description when supplied by Telegram.
Description string `json:"description,omitempty"`
// Result contains the method-specific result for a successful response.
Result R `json:"result,omitempty"`
// ErrorCode is the Telegram API error code for an unsuccessful response.
ErrorCode int `json:"error_code,omitempty"`
// Parameters contains additional recovery metadata for an unsuccessful response.
Parameters *ResponseParameters `json:"parameters,omitempty"`
}
// TelegramRequest is a low-level Telegram API request wrapper.
@@ -225,6 +257,7 @@ func (r TelegramRequest[R, P]) doRequest(ctx context.Context, api *API) (R, erro
req.Header.Set("Accept", "application/json")
req.Header.Set("User-Agent", fmt.Sprintf("Laniakea/%s", utils.VersionString))
retries := 0
for {
// Apply rate limiting before making the request
if api.Limiter != nil {
@@ -279,12 +312,16 @@ func (r TelegramRequest[R, P]) doRequest(ctx context.Context, api *API) (R, erro
if r.method == "getUpdates" {
return zero, responseErr
}
if retries >= api.maxRetries {
return zero, fmt.Errorf("%w after %d retries: %w", ErrRetryLimit, retries, responseErr)
}
retries++
// Wait and retry
select {
case <-ctx.Done():
return zero, ctx.Err()
case <-time.After(time.Duration(after) * time.Second):
case <-time.After(retryDelay(after)):
continue // retry request
}
}
@@ -330,8 +367,22 @@ func (r TelegramRequest[R, P]) Do(api *API) (R, error) {
}
func readBody(body io.ReadCloser) ([]byte, error) {
reader := io.LimitReader(body, 10<<20) // 10 MB
return io.ReadAll(reader)
data, err := io.ReadAll(io.LimitReader(body, maximumResponseSize+1))
if err != nil {
return nil, err
}
if len(data) > maximumResponseSize {
return nil, ErrResponseTooLarge
}
return data, nil
}
func retryDelay(retryAfter int) time.Duration {
delay := time.Duration(retryAfter) * time.Second
if delay < minimumRetryDelay {
return minimumRetryDelay
}
return delay
}
func parseBody[R any](data []byte) (TelegramResponse[R], error) {
+40
View File
@@ -1,6 +1,7 @@
package tgapi
import (
"errors"
"io"
"net/http"
"strings"
@@ -88,3 +89,42 @@ func TestAPICloseClosesIdleConnections(t *testing.T) {
t.Fatal("expected Close to close idle HTTP connections")
}
}
func TestAPIStopsAfterConfiguredRetryLimit(t *testing.T) {
calls := 0
client := &http.Client{Transport: roundTripFunc(func(_ *http.Request) (*http.Response, error) {
calls++
return &http.Response{
StatusCode: http.StatusOK,
Body: io.NopCloser(strings.NewReader(
`{"ok":false,"error_code":429,"description":"retry","parameters":{"retry_after":0}}`,
)),
}, nil
})}
api := NewAPI(NewAPIOpts("token").
SetAPIURL("https://example.test").
SetHTTPClient(client).
SetMaxRetries(2))
defer func() { _ = api.Close() }()
_, err := api.GetMe()
if !errors.Is(err, ErrRetryLimit) {
t.Fatalf("expected ErrRetryLimit, got %v", err)
}
var responseErr *ResponseError
if !errors.As(err, &responseErr) || responseErr.Code != http.StatusTooManyRequests {
t.Fatalf("expected wrapped 429 ResponseError, got %v", err)
}
if calls != 3 {
t.Fatalf("request count = %d, want 3", calls)
}
}
func TestReadBodyRejectsOversizedResponse(t *testing.T) {
body := io.NopCloser(io.LimitReader(strings.NewReader(strings.Repeat("x", maximumResponseSize+1)), maximumResponseSize+1))
_, err := readBody(body)
if !errors.Is(err, ErrResponseTooLarge) {
t.Fatalf("expected ErrResponseTooLarge, got %v", err)
}
}
+507 -158
View File
@@ -6,30 +6,65 @@ import "context"
// Since: Bot API 1.0
// See https://core.telegram.org/bots/api#sendphoto
type SendPhoto struct {
BusinessConnectionID string `json:"business_connection_id,omitempty"`
ChatID int64 `json:"chat_id"`
MessageThreadID int `json:"message_thread_id,omitempty"`
DirectMessagesTopicID int `json:"direct_messages_topic_id,omitempty"`
// BusinessConnectionID Optional. Unique identifier of the business connection on behalf of which the
// message will be sent
BusinessConnectionID string `json:"business_connection_id,omitempty"`
// ChatID Required. Unique identifier for the target chat or username of the target bot, supergroup or
// channel in the format @username
ChatID int64 `json:"chat_id"`
// MessageThreadID Optional. Unique identifier for the target message thread (topic) of a forum; for forum
// supergroups and private chats of bots with forum topic mode enabled only
MessageThreadID int `json:"message_thread_id,omitempty"`
// DirectMessagesTopicID Optional. Identifier of the direct messages topic to which the message will be
// sent; required if the message is sent to a direct messages chat
DirectMessagesTopicID int `json:"direct_messages_topic_id,omitempty"`
// ReceiverUserID identifies the user who can see the ephemeral message.
ReceiverUserID int64 `json:"receiver_user_id,omitempty"` // Since: Bot API 10.2
// CallbackQueryID identifies the callback query that triggered an ephemeral response.
CallbackQueryID string `json:"callback_query_id,omitempty"` // Since: Bot API 10.2
Photo string `json:"photo"`
Caption string `json:"caption,omitempty"`
ParseMode ParseMode `json:"parse_mode,omitempty"`
// Photo Required. Photo to send. Pass a file_id as String to send a photo that exists on the Telegram
// servers (recommended), pass an HTTP URL as a String for Telegram to get a photo from the Internet, or
// upload a new photo using multipart/form-data. The photo must be at most 10 MB in size. The photo's width
// and height must not exceed 10000 in total. Width and height ratio must be at most 20. More information on
// Sending Files »
Photo string `json:"photo"`
// Caption Optional. Photo caption (may also be used when resending photos by file_id), 0-1024 characters
// after entities parsing
Caption string `json:"caption,omitempty"`
// ParseMode Optional. Mode for parsing entities in the photo caption. See formatting options for more
// details.
ParseMode ParseMode `json:"parse_mode,omitempty"`
// CaptionEntities Optional. A JSON-serialized list of special entities that appear in the caption, which
// can be specified instead of parse_mode
CaptionEntities []MessageEntity `json:"caption_entities,omitempty"`
ShowCaptionAboveMedia bool `json:"show_caption_above_media,omitempty"`
HasSpoiler bool `json:"has_spoiler,omitempty"`
DisableNotifications bool `json:"disable_notification,omitempty"`
ProtectContent bool `json:"protect_content,omitempty"`
AllowPaidBroadcast bool `json:"allow_paid_broadcast,omitempty"`
MessageEffectID string `json:"message_effect_id,omitempty"`
// ShowCaptionAboveMedia Optional. Pass True if the caption must be shown above the message media
ShowCaptionAboveMedia bool `json:"show_caption_above_media,omitempty"`
// HasSpoiler Optional. Pass True if the photo needs to be covered with a spoiler animation
HasSpoiler bool `json:"has_spoiler,omitempty"`
// DisableNotifications Optional. Sends the message silently. Users will receive a notification with no
// sound.
DisableNotifications bool `json:"disable_notification,omitempty"`
// ProtectContent Optional. Protects the contents of the sent message from forwarding and saving
ProtectContent bool `json:"protect_content,omitempty"`
// AllowPaidBroadcast Optional. Pass True to allow up to 1000 messages per second, ignoring broadcasting
// limits for a fee of 0.1 Telegram Stars per message. The relevant Stars will be withdrawn from the bot's
// balance.
AllowPaidBroadcast bool `json:"allow_paid_broadcast,omitempty"`
// MessageEffectID Optional. Unique identifier of the message effect to be added to the message; for private
// chats only
MessageEffectID string `json:"message_effect_id,omitempty"`
// SuggestedPostParameters Optional. A JSON-serialized object containing the parameters of the suggested
// post to send; for direct messages chats only. If the message is sent as a reply to another suggested
// post, then that suggested post is automatically declined.
SuggestedPostParameters *SuggestedPostParameters `json:"suggested_post_parameters,omitempty"`
ReplyParameters *ReplyParameters `json:"reply_parameters,omitempty"`
ReplyMarkup *ReplyMarkup `json:"reply_markup,omitempty"`
// ReplyParameters Optional. Description of the message to reply to
ReplyParameters *ReplyParameters `json:"reply_parameters,omitempty"`
// ReplyMarkup Optional. Additional interface options. A JSON-serialized object for an inline keyboard,
// custom reply keyboard, instructions to remove a reply keyboard or to force a reply from the user.
ReplyMarkup *ReplyMarkup `json:"reply_markup,omitempty"`
}
// SendPhoto sends a photo.
@@ -53,32 +88,71 @@ func (api *API) SendPhotoWithContext(ctx context.Context, params SendPhoto) (Mes
// Since: Bot API 1.2
// See https://core.telegram.org/bots/api#sendaudio
type SendAudio struct {
BusinessConnectionID string `json:"business_connection_id,omitempty"`
ChatID int64 `json:"chat_id"`
MessageThreadID int `json:"message_thread_id,omitempty"`
DirectMessagesTopicID int `json:"direct_messages_topic_id,omitempty"`
// BusinessConnectionID Optional. Unique identifier of the business connection on behalf of which the
// message will be sent
BusinessConnectionID string `json:"business_connection_id,omitempty"`
// ChatID Required. Unique identifier for the target chat or username of the target bot, supergroup or
// channel in the format @username
ChatID int64 `json:"chat_id"`
// MessageThreadID Optional. Unique identifier for the target message thread (topic) of a forum; for forum
// supergroups and private chats of bots with forum topic mode enabled only
MessageThreadID int `json:"message_thread_id,omitempty"`
// DirectMessagesTopicID Optional. Identifier of the direct messages topic to which the message will be
// sent; required if the message is sent to a direct messages chat
DirectMessagesTopicID int `json:"direct_messages_topic_id,omitempty"`
// ReceiverUserID identifies the user who can see the ephemeral message.
ReceiverUserID int64 `json:"receiver_user_id,omitempty"` // Since: Bot API 10.2
// CallbackQueryID identifies the callback query that triggered an ephemeral response.
CallbackQueryID string `json:"callback_query_id,omitempty"` // Since: Bot API 10.2
Audio string `json:"audio"`
Caption string `json:"caption,omitempty"`
ParseMode ParseMode `json:"parse_mode,omitempty"`
// Audio Required. Audio file to send. Pass a file_id as String to send an audio file that exists on the
// Telegram servers (recommended), pass an HTTP URL as a String for Telegram to get an audio file from the
// Internet, or upload a new one using multipart/form-data. More information on Sending Files »
Audio string `json:"audio"`
// Caption Optional. Audio caption, 0-1024 characters after entities parsing
Caption string `json:"caption,omitempty"`
// ParseMode Optional. Mode for parsing entities in the audio caption. See formatting options for more
// details.
ParseMode ParseMode `json:"parse_mode,omitempty"`
// CaptionEntities Optional. A JSON-serialized list of special entities that appear in the caption, which
// can be specified instead of parse_mode
CaptionEntities []MessageEntity `json:"caption_entities,omitempty"`
Duration int `json:"duration,omitempty"`
Performer string `json:"performer,omitempty"`
Title string `json:"title,omitempty"`
Thumbnail string `json:"thumbnail,omitempty"`
// Duration Optional. Duration of the audio in seconds
Duration int `json:"duration,omitempty"`
// Performer Optional. Performer
Performer string `json:"performer,omitempty"`
// Title Optional. Track name
Title string `json:"title,omitempty"`
// Thumbnail Optional. Thumbnail of the file sent; can be ignored if thumbnail generation for the file is
// supported server-side. The thumbnail should be in JPEG format and less than 200 kB in size. A thumbnail's
// width and height should not exceed 320. Ignored if the file is not uploaded using multipart/form-data.
// Thumbnails can't be reused and can be only uploaded as a new file, so you can pass
// “attach://<file_attach_name>” if the thumbnail was uploaded using multipart/form-data under
// <file_attach_name>. More information on Sending Files »
Thumbnail string `json:"thumbnail,omitempty"`
DisableNotification bool `json:"disable_notification,omitempty"`
ProtectContent bool `json:"protect_content,omitempty"`
AllowPaidBroadcast bool `json:"allow_paid_broadcast,omitempty"`
MessageEffectID string `json:"message_effect_id,omitempty"`
// DisableNotification Optional. Sends the message silently. Users will receive a notification with no
// sound.
DisableNotification bool `json:"disable_notification,omitempty"`
// ProtectContent Optional. Protects the contents of the sent message from forwarding and saving
ProtectContent bool `json:"protect_content,omitempty"`
// AllowPaidBroadcast Optional. Pass True to allow up to 1000 messages per second, ignoring broadcasting
// limits for a fee of 0.1 Telegram Stars per message. The relevant Stars will be withdrawn from the bot's
// balance.
AllowPaidBroadcast bool `json:"allow_paid_broadcast,omitempty"`
// MessageEffectID Optional. Unique identifier of the message effect to be added to the message; for private
// chats only
MessageEffectID string `json:"message_effect_id,omitempty"`
// SuggestedPostParameters Optional. A JSON-serialized object containing the parameters of the suggested
// post to send; for direct messages chats only. If the message is sent as a reply to another suggested
// post, then that suggested post is automatically declined.
SuggestedPostParameters *SuggestedPostParameters `json:"suggested_post_parameters,omitempty"`
ReplyParameters *ReplyParameters `json:"reply_parameters,omitempty"`
ReplyMarkup *ReplyMarkup `json:"reply_markup,omitempty"`
// ReplyParameters Optional. Description of the message to reply to
ReplyParameters *ReplyParameters `json:"reply_parameters,omitempty"`
// ReplyMarkup Optional. Additional interface options. A JSON-serialized object for an inline keyboard,
// custom reply keyboard, instructions to remove a reply keyboard or to force a reply from the user.
ReplyMarkup *ReplyMarkup `json:"reply_markup,omitempty"`
}
// SendAudio sends an audio file.
@@ -102,30 +176,69 @@ func (api *API) SendAudioWithContext(ctx context.Context, params SendAudio) (Mes
// Since: Bot API 1.0
// See https://core.telegram.org/bots/api#senddocument
type SendDocument struct {
BusinessConnectionID string `json:"business_connection_id,omitempty"`
ChatID int64 `json:"chat_id"`
MessageThreadID int `json:"message_thread_id,omitempty"`
DirectMessagesTopicID int `json:"direct_messages_topic_id,omitempty"`
// BusinessConnectionID Optional. Unique identifier of the business connection on behalf of which the
// message will be sent
BusinessConnectionID string `json:"business_connection_id,omitempty"`
// ChatID Required. Unique identifier for the target chat or username of the target bot, supergroup or
// channel in the format @username
ChatID int64 `json:"chat_id"`
// MessageThreadID Optional. Unique identifier for the target message thread (topic) of a forum; for forum
// supergroups and private chats of bots with forum topic mode enabled only
MessageThreadID int `json:"message_thread_id,omitempty"`
// DirectMessagesTopicID Optional. Identifier of the direct messages topic to which the message will be
// sent; required if the message is sent to a direct messages chat
DirectMessagesTopicID int `json:"direct_messages_topic_id,omitempty"`
// ReceiverUserID identifies the user who can see the ephemeral message.
ReceiverUserID int64 `json:"receiver_user_id,omitempty"` // Since: Bot API 10.2
// CallbackQueryID identifies the callback query that triggered an ephemeral response.
CallbackQueryID string `json:"callback_query_id,omitempty"` // Since: Bot API 10.2
Document string `json:"document"`
Thumbnail string `json:"thumbnail,omitempty"`
Caption string `json:"caption,omitempty"`
ParseMode ParseMode `json:"parse_mode,omitempty"`
CaptionEntities []MessageEntity `json:"caption_entities,omitempty"`
DisableContentTypeDetection bool `json:"disable_content_type_detection,omitempty"`
// Document Required. File to send. Pass a file_id as String to send a file that exists on the Telegram
// servers (recommended), pass an HTTP URL as a String for Telegram to get a file from the Internet, or
// upload a new one using multipart/form-data. More information on Sending Files »
Document string `json:"document"`
// Thumbnail Optional. Thumbnail of the file sent; can be ignored if thumbnail generation for the file is
// supported server-side. The thumbnail should be in JPEG format and less than 200 kB in size. A thumbnail's
// width and height should not exceed 320. Ignored if the file is not uploaded using multipart/form-data.
// Thumbnails can't be reused and can be only uploaded as a new file, so you can pass
// “attach://<file_attach_name>” if the thumbnail was uploaded using multipart/form-data under
// <file_attach_name>. More information on Sending Files »
Thumbnail string `json:"thumbnail,omitempty"`
// Caption Optional. Document caption (may also be used when resending documents by file_id), 0-1024
// characters after entities parsing
Caption string `json:"caption,omitempty"`
// ParseMode Optional. Mode for parsing entities in the document caption. See formatting options for more
// details.
ParseMode ParseMode `json:"parse_mode,omitempty"`
// CaptionEntities Optional. A JSON-serialized list of special entities that appear in the caption, which
// can be specified instead of parse_mode
CaptionEntities []MessageEntity `json:"caption_entities,omitempty"`
// DisableContentTypeDetection Optional. Disables automatic server-side content type detection for files
// uploaded using multipart/form-data
DisableContentTypeDetection bool `json:"disable_content_type_detection,omitempty"`
DisableNotification bool `json:"disable_notification,omitempty"`
ProtectContent bool `json:"protect_content,omitempty"`
AllowPaidBroadcast bool `json:"allow_paid_broadcast,omitempty"`
MessageEffectID string `json:"message_effect_id,omitempty"`
// DisableNotification Optional. Sends the message silently. Users will receive a notification with no
// sound.
DisableNotification bool `json:"disable_notification,omitempty"`
// ProtectContent Optional. Protects the contents of the sent message from forwarding and saving
ProtectContent bool `json:"protect_content,omitempty"`
// AllowPaidBroadcast Optional. Pass True to allow up to 1000 messages per second, ignoring broadcasting
// limits for a fee of 0.1 Telegram Stars per message. The relevant Stars will be withdrawn from the bot's
// balance.
AllowPaidBroadcast bool `json:"allow_paid_broadcast,omitempty"`
// MessageEffectID Optional. Unique identifier of the message effect to be added to the message; for private
// chats only
MessageEffectID string `json:"message_effect_id,omitempty"`
// SuggestedPostParameters Optional. A JSON-serialized object containing the parameters of the suggested
// post to send; for direct messages chats only. If the message is sent as a reply to another suggested
// post, then that suggested post is automatically declined.
SuggestedPostParameters *SuggestedPostParameters `json:"suggested_post_parameters,omitempty"`
ReplyParameters *ReplyParameters `json:"reply_parameters,omitempty"`
ReplyMarkup *ReplyMarkup `json:"reply_markup,omitempty"`
// ReplyParameters Optional. Description of the message to reply to
ReplyParameters *ReplyParameters `json:"reply_parameters,omitempty"`
// ReplyMarkup Optional. Additional interface options. A JSON-serialized object for an inline keyboard,
// custom reply keyboard, instructions to remove a reply keyboard or to force a reply from the user.
ReplyMarkup *ReplyMarkup `json:"reply_markup,omitempty"`
}
// SendDocument sends a document.
@@ -149,38 +262,86 @@ func (api *API) SendDocumentWithContext(ctx context.Context, params SendDocument
// Since: Bot API 1.0
// See https://core.telegram.org/bots/api#sendvideo
type SendVideo struct {
BusinessConnectionID string `json:"business_connection_id,omitempty"`
ChatID int64 `json:"chat_id"`
MessageThreadID int `json:"message_thread_id,omitempty"`
DirectMessagesTopicID int `json:"direct_messages_topic_id,omitempty"`
// BusinessConnectionID Optional. Unique identifier of the business connection on behalf of which the
// message will be sent
BusinessConnectionID string `json:"business_connection_id,omitempty"`
// ChatID Required. Unique identifier for the target chat or username of the target bot, supergroup or
// channel in the format @username
ChatID int64 `json:"chat_id"`
// MessageThreadID Optional. Unique identifier for the target message thread (topic) of a forum; for forum
// supergroups and private chats of bots with forum topic mode enabled only
MessageThreadID int `json:"message_thread_id,omitempty"`
// DirectMessagesTopicID Optional. Identifier of the direct messages topic to which the message will be
// sent; required if the message is sent to a direct messages chat
DirectMessagesTopicID int `json:"direct_messages_topic_id,omitempty"`
// ReceiverUserID identifies the user who can see the ephemeral message.
ReceiverUserID int64 `json:"receiver_user_id,omitempty"` // Since: Bot API 10.2
// CallbackQueryID identifies the callback query that triggered an ephemeral response.
CallbackQueryID string `json:"callback_query_id,omitempty"` // Since: Bot API 10.2
Video string `json:"video"`
// Video Required. Video to send. Pass a file_id as String to send a video that exists on the Telegram
// servers (recommended), pass an HTTP URL as a String for Telegram to get a video from the Internet, or
// upload a new video using multipart/form-data. More information on Sending Files »
Video string `json:"video"`
// Thumbnail Optional. Thumbnail of the file sent; can be ignored if thumbnail generation for the file is
// supported server-side. The thumbnail should be in JPEG format and less than 200 kB in size. A thumbnail's
// width and height should not exceed 320. Ignored if the file is not uploaded using multipart/form-data.
// Thumbnails can't be reused and can be only uploaded as a new file, so you can pass
// “attach://<file_attach_name>” if the thumbnail was uploaded using multipart/form-data under
// <file_attach_name>. More information on Sending Files »
Thumbnail string `json:"thumbnail,omitempty"`
Duration int `json:"duration,omitempty"`
Width int `json:"width,omitempty"`
Height int `json:"height,omitempty"`
Cover string `json:"cover,omitempty"`
// Duration Optional. Duration of sent video in seconds
Duration int `json:"duration,omitempty"`
// Width Optional. Video width
Width int `json:"width,omitempty"`
// Height Optional. Video height
Height int `json:"height,omitempty"`
// Cover Optional. Cover for the video in the message. Pass a file_id to send a file that exists on the
// Telegram servers (recommended), pass an HTTP URL for Telegram to get a file from the Internet, or pass
// “attach://<file_attach_name>” to upload a new one using multipart/form-data under <file_attach_name>
// name. More information on Sending Files »
Cover string `json:"cover,omitempty"`
StartTimestamp int `json:"start_timestamp,omitempty"`
Caption string `json:"caption,omitempty"`
ParseMode ParseMode `json:"parse_mode,omitempty"`
// StartTimestamp Optional. Start timestamp for the video in the message
StartTimestamp int `json:"start_timestamp,omitempty"`
// Caption Optional. Video caption (may also be used when resending videos by file_id), 0-1024 characters
// after entities parsing
Caption string `json:"caption,omitempty"`
// ParseMode Optional. Mode for parsing entities in the video caption. See formatting options for more
// details.
ParseMode ParseMode `json:"parse_mode,omitempty"`
// CaptionEntities Optional. A JSON-serialized list of special entities that appear in the caption, which
// can be specified instead of parse_mode
CaptionEntities []MessageEntity `json:"caption_entities,omitempty"`
ShowCaptionAboveMedia bool `json:"show_caption_above_media,omitempty"`
HasSpoiler bool `json:"has_spoiler,omitempty"`
SupportsStreaming bool `json:"supports_streaming,omitempty"`
DisableNotification bool `json:"disable_notification,omitempty"`
ProtectContent bool `json:"protect_content,omitempty"`
AllowPaidBroadcast bool `json:"allow_paid_broadcast,omitempty"`
MessageEffectID string `json:"message_effect_id,omitempty"`
// ShowCaptionAboveMedia Optional. Pass True if the caption must be shown above the message media
ShowCaptionAboveMedia bool `json:"show_caption_above_media,omitempty"`
// HasSpoiler Optional. Pass True if the video needs to be covered with a spoiler animation
HasSpoiler bool `json:"has_spoiler,omitempty"`
// SupportsStreaming Optional. Pass True if the uploaded video is suitable for streaming
SupportsStreaming bool `json:"supports_streaming,omitempty"`
// DisableNotification Optional. Sends the message silently. Users will receive a notification with no
// sound.
DisableNotification bool `json:"disable_notification,omitempty"`
// ProtectContent Optional. Protects the contents of the sent message from forwarding and saving
ProtectContent bool `json:"protect_content,omitempty"`
// AllowPaidBroadcast Optional. Pass True to allow up to 1000 messages per second, ignoring broadcasting
// limits for a fee of 0.1 Telegram Stars per message. The relevant Stars will be withdrawn from the bot's
// balance.
AllowPaidBroadcast bool `json:"allow_paid_broadcast,omitempty"`
// MessageEffectID Optional. Unique identifier of the message effect to be added to the message; for private
// chats only
MessageEffectID string `json:"message_effect_id,omitempty"`
// SuggestedPostParameters Optional. A JSON-serialized object containing the parameters of the suggested
// post to send; for direct messages chats only. If the message is sent as a reply to another suggested
// post, then that suggested post is automatically declined.
SuggestedPostParameters *SuggestedPostParameters `json:"suggested_post_parameters,omitempty"`
ReplyParameters *ReplyParameters `json:"reply_parameters,omitempty"`
ReplyMarkup *ReplyMarkup `json:"reply_markup,omitempty"`
// ReplyParameters Optional. Description of the message to reply to
ReplyParameters *ReplyParameters `json:"reply_parameters,omitempty"`
// ReplyMarkup Optional. Additional interface options. A JSON-serialized object for an inline keyboard,
// custom reply keyboard, instructions to remove a reply keyboard or to force a reply from the user.
ReplyMarkup *ReplyMarkup `json:"reply_markup,omitempty"`
}
// SendVideo sends a video.
@@ -204,34 +365,76 @@ func (api *API) SendVideoWithContext(ctx context.Context, params SendVideo) (Mes
// Since: Bot API 4.0
// See https://core.telegram.org/bots/api#sendanimation
type SendAnimation struct {
BusinessConnectionID string `json:"business_connection_id,omitempty"`
ChatID int64 `json:"chat_id"`
MessageThreadID int `json:"message_thread_id,omitempty"`
DirectMessagesTopicID int `json:"direct_messages_topic_id,omitempty"`
// BusinessConnectionID Optional. Unique identifier of the business connection on behalf of which the
// message will be sent
BusinessConnectionID string `json:"business_connection_id,omitempty"`
// ChatID Required. Unique identifier for the target chat or username of the target bot, supergroup or
// channel in the format @username
ChatID int64 `json:"chat_id"`
// MessageThreadID Optional. Unique identifier for the target message thread (topic) of a forum; for forum
// supergroups and private chats of bots with forum topic mode enabled only
MessageThreadID int `json:"message_thread_id,omitempty"`
// DirectMessagesTopicID Optional. Identifier of the direct messages topic to which the message will be
// sent; required if the message is sent to a direct messages chat
DirectMessagesTopicID int `json:"direct_messages_topic_id,omitempty"`
// ReceiverUserID identifies the user who can see the ephemeral message.
ReceiverUserID int64 `json:"receiver_user_id,omitempty"` // Since: Bot API 10.2
// CallbackQueryID identifies the callback query that triggered an ephemeral response.
CallbackQueryID string `json:"callback_query_id,omitempty"` // Since: Bot API 10.2
// Animation Required. Animation to send. Pass a file_id as String to send an animation that exists on the
// Telegram servers (recommended), pass an HTTP URL as a String for Telegram to get an animation from the
// Internet, or upload a new animation using multipart/form-data. More information on Sending Files »
Animation string `json:"animation"`
// Thumbnail Optional. Thumbnail of the file sent; can be ignored if thumbnail generation for the file is
// supported server-side. The thumbnail should be in JPEG format and less than 200 kB in size. A thumbnail's
// width and height should not exceed 320. Ignored if the file is not uploaded using multipart/form-data.
// Thumbnails can't be reused and can be only uploaded as a new file, so you can pass
// “attach://<file_attach_name>” if the thumbnail was uploaded using multipart/form-data under
// <file_attach_name>. More information on Sending Files »
Thumbnail string `json:"thumbnail,omitempty"`
Duration int `json:"duration,omitempty"`
Width int `json:"width,omitempty"`
Height int `json:"height,omitempty"`
// Duration Optional. Duration of sent animation in seconds
Duration int `json:"duration,omitempty"`
// Width Optional. Animation width
Width int `json:"width,omitempty"`
// Height Optional. Animation height
Height int `json:"height,omitempty"`
Caption string `json:"caption,omitempty"`
ParseMode ParseMode `json:"parse_mode,omitempty"`
CaptionEntities []MessageEntity `json:"caption_entities,omitempty"`
ShowCaptionAboveMedia bool `json:"show_caption_above_media,omitempty"`
HasSpoiler bool `json:"has_spoiler,omitempty"`
DisableNotification bool `json:"disable_notification,omitempty"`
ProtectContent bool `json:"protect_content,omitempty"`
AllowPaidBroadcast bool `json:"allow_paid_broadcast,omitempty"`
MessageEffectID string `json:"message_effect_id,omitempty"`
// Caption Optional. Animation caption (may also be used when resending animation by file_id), 0-1024
// characters after entities parsing
Caption string `json:"caption,omitempty"`
// ParseMode Optional. Mode for parsing entities in the animation caption. See formatting options for more
// details.
ParseMode ParseMode `json:"parse_mode,omitempty"`
// CaptionEntities Optional. A JSON-serialized list of special entities that appear in the caption, which
// can be specified instead of parse_mode
CaptionEntities []MessageEntity `json:"caption_entities,omitempty"`
// ShowCaptionAboveMedia Optional. Pass True if the caption must be shown above the message media
ShowCaptionAboveMedia bool `json:"show_caption_above_media,omitempty"`
// HasSpoiler Optional. Pass True if the animation needs to be covered with a spoiler animation
HasSpoiler bool `json:"has_spoiler,omitempty"`
// DisableNotification Optional. Sends the message silently. Users will receive a notification with no
// sound.
DisableNotification bool `json:"disable_notification,omitempty"`
// ProtectContent Optional. Protects the contents of the sent message from forwarding and saving
ProtectContent bool `json:"protect_content,omitempty"`
// AllowPaidBroadcast Optional. Pass True to allow up to 1000 messages per second, ignoring broadcasting
// limits for a fee of 0.1 Telegram Stars per message. The relevant Stars will be withdrawn from the bot's
// balance.
AllowPaidBroadcast bool `json:"allow_paid_broadcast,omitempty"`
// MessageEffectID Optional. Unique identifier of the message effect to be added to the message; for private
// chats only
MessageEffectID string `json:"message_effect_id,omitempty"`
// SuggestedPostParameters Optional. A JSON-serialized object containing the parameters of the suggested
// post to send; for direct messages chats only. If the message is sent as a reply to another suggested
// post, then that suggested post is automatically declined.
SuggestedPostParameters *SuggestedPostParameters `json:"suggested_post_parameters,omitempty"`
ReplyParameters *ReplyParameters `json:"reply_parameters,omitempty"`
ReplyMarkup *ReplyMarkup `json:"reply_markup,omitempty"`
// ReplyParameters Optional. Description of the message to reply to
ReplyParameters *ReplyParameters `json:"reply_parameters,omitempty"`
// ReplyMarkup Optional. Additional interface options. A JSON-serialized object for an inline keyboard,
// custom reply keyboard, instructions to remove a reply keyboard or to force a reply from the user.
ReplyMarkup *ReplyMarkup `json:"reply_markup,omitempty"`
}
// SendAnimation sends an animation file (GIF or H.264/MPEG-4 AVC video without sound).
@@ -255,28 +458,59 @@ func (api *API) SendAnimationWithContext(ctx context.Context, params SendAnimati
// Since: Bot API 1.2
// See https://core.telegram.org/bots/api#sendvoice
type SendVoice struct {
BusinessConnectionID string `json:"business_connection_id,omitempty"`
ChatID int64 `json:"chat_id"`
MessageThreadID int `json:"message_thread_id,omitempty"`
DirectMessagesTopicID int `json:"direct_messages_topic_id,omitempty"`
// BusinessConnectionID Optional. Unique identifier of the business connection on behalf of which the
// message will be sent
BusinessConnectionID string `json:"business_connection_id,omitempty"`
// ChatID Required. Unique identifier for the target chat or username of the target bot, supergroup or
// channel in the format @username
ChatID int64 `json:"chat_id"`
// MessageThreadID Optional. Unique identifier for the target message thread (topic) of a forum; for forum
// supergroups and private chats of bots with forum topic mode enabled only
MessageThreadID int `json:"message_thread_id,omitempty"`
// DirectMessagesTopicID Optional. Identifier of the direct messages topic to which the message will be
// sent; required if the message is sent to a direct messages chat
DirectMessagesTopicID int `json:"direct_messages_topic_id,omitempty"`
// ReceiverUserID identifies the user who can see the ephemeral message.
ReceiverUserID int64 `json:"receiver_user_id,omitempty"` // Since: Bot API 10.2
// CallbackQueryID identifies the callback query that triggered an ephemeral response.
CallbackQueryID string `json:"callback_query_id,omitempty"` // Since: Bot API 10.2
Voice string `json:"voice"`
Caption string `json:"caption,omitempty"`
ParseMode ParseMode `json:"parse_mode,omitempty"`
CaptionEntities []MessageEntity `json:"caption_entities,omitempty"`
Duration int `json:"duration,omitempty"`
DisableNotification bool `json:"disable_notification,omitempty"`
ProtectContent bool `json:"protect_content,omitempty"`
AllowPaidBroadcast bool `json:"allow_paid_broadcast,omitempty"`
MessageEffectID string `json:"message_effect_id,omitempty"`
// Voice Required. Audio file to send. Pass a file_id as String to send a file that exists on the Telegram
// servers (recommended), pass an HTTP URL as a String for Telegram to get a file from the Internet, or
// upload a new one using multipart/form-data. More information on Sending Files »
Voice string `json:"voice"`
// Caption Optional. Voice message caption, 0-1024 characters after entities parsing
Caption string `json:"caption,omitempty"`
// ParseMode Optional. Mode for parsing entities in the voice message caption. See formatting options for
// more details.
ParseMode ParseMode `json:"parse_mode,omitempty"`
// CaptionEntities Optional. A JSON-serialized list of special entities that appear in the caption, which
// can be specified instead of parse_mode
CaptionEntities []MessageEntity `json:"caption_entities,omitempty"`
// Duration Optional. Duration of the voice message in seconds
Duration int `json:"duration,omitempty"`
// DisableNotification Optional. Sends the message silently. Users will receive a notification with no
// sound.
DisableNotification bool `json:"disable_notification,omitempty"`
// ProtectContent Optional. Protects the contents of the sent message from forwarding and saving
ProtectContent bool `json:"protect_content,omitempty"`
// AllowPaidBroadcast Optional. Pass True to allow up to 1000 messages per second, ignoring broadcasting
// limits for a fee of 0.1 Telegram Stars per message. The relevant Stars will be withdrawn from the bot's
// balance.
AllowPaidBroadcast bool `json:"allow_paid_broadcast,omitempty"`
// MessageEffectID Optional. Unique identifier of the message effect to be added to the message; for private
// chats only
MessageEffectID string `json:"message_effect_id,omitempty"`
// SuggestedPostParameters Optional. A JSON-serialized object containing the parameters of the suggested
// post to send; for direct messages chats only. If the message is sent as a reply to another suggested
// post, then that suggested post is automatically declined.
SuggestedPostParameters *SuggestedPostParameters `json:"suggested_post_parameters,omitempty"`
ReplyParameters *ReplyParameters `json:"reply_parameters,omitempty"`
ReplyMarkup *ReplyMarkup `json:"reply_markup,omitempty"`
// ReplyParameters Optional. Description of the message to reply to
ReplyParameters *ReplyParameters `json:"reply_parameters,omitempty"`
// ReplyMarkup Optional. Additional interface options. A JSON-serialized object for an inline keyboard,
// custom reply keyboard, instructions to remove a reply keyboard or to force a reply from the user.
ReplyMarkup *ReplyMarkup `json:"reply_markup,omitempty"`
}
// SendVoice sends a voice note.
@@ -300,27 +534,60 @@ func (api *API) SendVoiceWithContext(ctx context.Context, params SendVoice) (Mes
// Since: Bot API 3.0
// See https://core.telegram.org/bots/api#sendvideonote
type SendVideoNote struct {
BusinessConnectionID string `json:"business_connection_id,omitempty"`
ChatID int64 `json:"chat_id"`
MessageThreadID int `json:"message_thread_id,omitempty"`
DirectMessagesTopicID int `json:"direct_messages_topic_id,omitempty"`
// BusinessConnectionID Optional. Unique identifier of the business connection on behalf of which the
// message will be sent
BusinessConnectionID string `json:"business_connection_id,omitempty"`
// ChatID Required. Unique identifier for the target chat or username of the target bot, supergroup or
// channel in the format @username
ChatID int64 `json:"chat_id"`
// MessageThreadID Optional. Unique identifier for the target message thread (topic) of a forum; for forum
// supergroups and private chats of bots with forum topic mode enabled only
MessageThreadID int `json:"message_thread_id,omitempty"`
// DirectMessagesTopicID Optional. Identifier of the direct messages topic to which the message will be
// sent; required if the message is sent to a direct messages chat
DirectMessagesTopicID int `json:"direct_messages_topic_id,omitempty"`
// ReceiverUserID identifies the user who can see the ephemeral message.
ReceiverUserID int64 `json:"receiver_user_id,omitempty"` // Since: Bot API 10.2
// CallbackQueryID identifies the callback query that triggered an ephemeral response.
CallbackQueryID string `json:"callback_query_id,omitempty"` // Since: Bot API 10.2
VideoNote string `json:"video_note"`
Thumbnail string `json:"thumbnail,omitempty"`
Duration int `json:"duration,omitempty"`
Length int `json:"length,omitempty"`
DisableNotification bool `json:"disable_notification,omitempty"`
ProtectContent bool `json:"protect_content,omitempty"`
AllowPaidBroadcast bool `json:"allow_paid_broadcast,omitempty"`
MessageEffectID string `json:"message_effect_id,omitempty"`
// VideoNote Required. Video note to send. Pass a file_id as String to send a video note that exists on the
// Telegram servers (recommended) or upload a new video using multipart/form-data. More information on
// Sending Files ». Sending video notes by a URL is currently unsupported.
VideoNote string `json:"video_note"`
// Thumbnail Optional. Thumbnail of the file sent; can be ignored if thumbnail generation for the file is
// supported server-side. The thumbnail should be in JPEG format and less than 200 kB in size. A thumbnail's
// width and height should not exceed 320. Ignored if the file is not uploaded using multipart/form-data.
// Thumbnails can't be reused and can be only uploaded as a new file, so you can pass
// “attach://<file_attach_name>” if the thumbnail was uploaded using multipart/form-data under
// <file_attach_name>. More information on Sending Files »
Thumbnail string `json:"thumbnail,omitempty"`
// Duration Optional. Duration of sent video in seconds
Duration int `json:"duration,omitempty"`
// Length Optional. Video width and height, i.e. diameter of the video message
Length int `json:"length,omitempty"`
// DisableNotification Optional. Sends the message silently. Users will receive a notification with no
// sound.
DisableNotification bool `json:"disable_notification,omitempty"`
// ProtectContent Optional. Protects the contents of the sent message from forwarding and saving
ProtectContent bool `json:"protect_content,omitempty"`
// AllowPaidBroadcast Optional. Pass True to allow up to 1000 messages per second, ignoring broadcasting
// limits for a fee of 0.1 Telegram Stars per message. The relevant Stars will be withdrawn from the bot's
// balance.
AllowPaidBroadcast bool `json:"allow_paid_broadcast,omitempty"`
// MessageEffectID Optional. Unique identifier of the message effect to be added to the message; for private
// chats only
MessageEffectID string `json:"message_effect_id,omitempty"`
// SuggestedPostParameters Optional. A JSON-serialized object containing the parameters of the suggested
// post to send; for direct messages chats only. If the message is sent as a reply to another suggested
// post, then that suggested post is automatically declined.
SuggestedPostParameters *SuggestedPostParameters `json:"suggested_post_parameters,omitempty"`
ReplyParameters *ReplyParameters `json:"reply_parameters,omitempty"`
ReplyMarkup *ReplyMarkup `json:"reply_markup,omitempty"`
// ReplyParameters Optional. Description of the message to reply to
ReplyParameters *ReplyParameters `json:"reply_parameters,omitempty"`
// ReplyMarkup Optional. Additional interface options. A JSON-serialized object for an inline keyboard,
// custom reply keyboard, instructions to remove a reply keyboard or to force a reply from the user.
ReplyMarkup *ReplyMarkup `json:"reply_markup,omitempty"`
}
// SendVideoNote sends a video note (rounded video message).
@@ -344,25 +611,56 @@ func (api *API) SendVideoNoteWithContext(ctx context.Context, params SendVideoNo
// Since: Bot API 7.6
// See https://core.telegram.org/bots/api#sendpaidmedia
type SendPaidMedia struct {
BusinessConnectionID string `json:"business_connection_id,omitempty"`
ChatID int64 `json:"chat_id"`
MessageThreadID int `json:"message_thread_id,omitempty"`
DirectMessagesTopicID int `json:"direct_messages_topic_id,omitempty"`
StarCount int `json:"star_count,omitempty"`
// BusinessConnectionID Optional. Unique identifier of the business connection on behalf of which the
// message will be sent
BusinessConnectionID string `json:"business_connection_id,omitempty"`
// ChatID Required. Unique identifier for the target chat or username of the target bot, supergroup or
// channel in the format @username. If the chat is a channel, all Telegram Star proceeds from this media
// will be credited to the chat's balance. Otherwise, they will be credited to the bot's balance.
ChatID int64 `json:"chat_id"`
// MessageThreadID Optional. Unique identifier for the target message thread (topic) of a forum; for forum
// supergroups and private chats of bots with forum topic mode enabled only
MessageThreadID int `json:"message_thread_id,omitempty"`
// DirectMessagesTopicID Optional. Identifier of the direct messages topic to which the message will be
// sent; required if the message is sent to a direct messages chat
DirectMessagesTopicID int `json:"direct_messages_topic_id,omitempty"`
// StarCount Required. The number of Telegram Stars that must be paid to buy access to the media; 1-25000
StarCount int `json:"star_count,omitempty"`
Media []InputPaidMedia `json:"media"`
Payload string `json:"payload,omitempty"`
Caption string `json:"caption,omitempty"`
ParseMode ParseMode `json:"parse_mode,omitempty"`
CaptionEntities []MessageEntity `json:"caption_entities,omitempty"`
ShowCaptionAboveMedia bool `json:"show_caption_above_media,omitempty"`
DisableNotification bool `json:"disable_notification,omitempty"`
ProtectContent bool `json:"protect_content,omitempty"`
AllowPaidBroadcast bool `json:"allow_paid_broadcast,omitempty"`
// Media Required. A JSON-serialized Array describing the media to be sent; up to 10 items
Media []InputPaidMedia `json:"media"`
// Payload Optional. Bot-defined paid media payload, 0-128 bytes. This will not be displayed to the user,
// use it for your internal processes.
Payload string `json:"payload,omitempty"`
// Caption Optional. Media caption, 0-1024 characters after entities parsing
Caption string `json:"caption,omitempty"`
// ParseMode Optional. Mode for parsing entities in the media caption. See formatting options for more
// details.
ParseMode ParseMode `json:"parse_mode,omitempty"`
// CaptionEntities Optional. A JSON-serialized list of special entities that appear in the caption, which
// can be specified instead of parse_mode
CaptionEntities []MessageEntity `json:"caption_entities,omitempty"`
// ShowCaptionAboveMedia Optional. Pass True if the caption must be shown above the message media
ShowCaptionAboveMedia bool `json:"show_caption_above_media,omitempty"`
// DisableNotification Optional. Sends the message silently. Users will receive a notification with no
// sound.
DisableNotification bool `json:"disable_notification,omitempty"`
// ProtectContent Optional. Protects the contents of the sent message from forwarding and saving
ProtectContent bool `json:"protect_content,omitempty"`
// AllowPaidBroadcast Optional. Pass True to allow up to 1000 messages per second, ignoring broadcasting
// limits for a fee of 0.1 Telegram Stars per message. The relevant Stars will be withdrawn from the bot's
// balance.
AllowPaidBroadcast bool `json:"allow_paid_broadcast,omitempty"`
// SuggestedPostParameters Optional. A JSON-serialized object containing the parameters of the suggested
// post to send; for direct messages chats only. If the message is sent as a reply to another suggested
// post, then that suggested post is automatically declined.
SuggestedPostParameters *SuggestedPostParameters `json:"suggested_post_parameters,omitempty"`
ReplyParameters *ReplyParameters `json:"reply_parameters,omitempty"`
ReplyMarkup *ReplyMarkup `json:"reply_markup,omitempty"`
// ReplyParameters Optional. Description of the message to reply to
ReplyParameters *ReplyParameters `json:"reply_parameters,omitempty"`
// ReplyMarkup Optional. Additional interface options. A JSON-serialized object for an inline keyboard,
// custom reply keyboard, instructions to remove a reply keyboard or to force a reply from the user.
ReplyMarkup *ReplyMarkup `json:"reply_markup,omitempty"`
}
// SendPaidMedia sends paid media.
@@ -386,17 +684,34 @@ func (api *API) SendPaidMediaWithContext(ctx context.Context, params SendPaidMed
// Since: Bot API 3.5
// See https://core.telegram.org/bots/api#sendmediagroup
type SendMediaGroup struct {
BusinessConnectionID string `json:"business_connection_id,omitempty"`
ChatID int64 `json:"chat_id"`
MessageThreadID int `json:"message_thread_id,omitempty"`
DirectMessagesTopicID int `json:"direct_messages_topic_id,omitempty"`
// BusinessConnectionID Optional. Unique identifier of the business connection on behalf of which the
// message will be sent
BusinessConnectionID string `json:"business_connection_id,omitempty"`
// ChatID Required. Unique identifier for the target chat or username of the target bot, supergroup or
// channel in the format @username
ChatID int64 `json:"chat_id"`
// MessageThreadID Optional. Unique identifier for the target message thread (topic) of a forum; for forum
// supergroups and private chats of bots with forum topic mode enabled only
MessageThreadID int `json:"message_thread_id,omitempty"`
// DirectMessagesTopicID Optional. Identifier of the direct messages topic to which the messages will be
// sent; required if the messages are sent to a direct messages chat
DirectMessagesTopicID int `json:"direct_messages_topic_id,omitempty"`
Media []InputMedia `json:"media"`
DisableNotification bool `json:"disable_notification,omitempty"`
ProtectContent bool `json:"protect_content,omitempty"`
AllowPaidBroadcast bool `json:"allow_paid_broadcast,omitempty"`
MessageEffectID string `json:"message_effect_id,omitempty"`
ReplyParameters *ReplyParameters `json:"reply_parameters,omitempty"`
// Media Required. A JSON-serialized Array describing messages to be sent, must include 2-10 items
Media []InputMedia `json:"media"`
// DisableNotification Optional. Sends messages silently. Users will receive a notification with no sound.
DisableNotification bool `json:"disable_notification,omitempty"`
// ProtectContent Optional. Protects the contents of the sent messages from forwarding and saving
ProtectContent bool `json:"protect_content,omitempty"`
// AllowPaidBroadcast Optional. Pass True to allow up to 1000 messages per second, ignoring broadcasting
// limits for a fee of 0.1 Telegram Stars per message. The relevant Stars will be withdrawn from the bot's
// balance.
AllowPaidBroadcast bool `json:"allow_paid_broadcast,omitempty"`
// MessageEffectID Optional. Unique identifier of the message effect to be added to the message; for private
// chats only
MessageEffectID string `json:"message_effect_id,omitempty"`
// ReplyParameters Optional. Description of the message to reply to
ReplyParameters *ReplyParameters `json:"reply_parameters,omitempty"`
}
// SendMediaGroup sends a group of photos, videos, documents or audios as an album.
@@ -420,32 +735,66 @@ func (api *API) SendMediaGroupWithContext(ctx context.Context, params SendMediaG
// Since: Bot API 10.0
// See https://core.telegram.org/bots/api#sendlivephoto
type SendLivePhoto struct {
BusinessConnectionID string `json:"business_connection_id,omitempty"`
ChatID int64 `json:"chat_id"`
MessageThreadID int `json:"message_thread_id,omitempty"`
DirectMessagesTopicID int `json:"direct_messages_topic_id,omitempty"`
// BusinessConnectionID Optional. Unique identifier of the business connection on behalf of which the
// message will be sent
BusinessConnectionID string `json:"business_connection_id,omitempty"`
// ChatID Required. Unique identifier for the target chat or username of the target channel (in the format
// @channelusername)
ChatID int64 `json:"chat_id"`
// MessageThreadID Optional. Unique identifier for the target message thread (topic) of a forum; for forum
// supergroups and private chats of bots with forum topic mode enabled only
MessageThreadID int `json:"message_thread_id,omitempty"`
// DirectMessagesTopicID Optional. Identifier of the direct messages topic to which the message will be
// sent; required if the message is sent to a direct messages chat
DirectMessagesTopicID int `json:"direct_messages_topic_id,omitempty"`
// ReceiverUserID identifies the user who can see the ephemeral message.
ReceiverUserID int64 `json:"receiver_user_id,omitempty"` // Since: Bot API 10.2
// CallbackQueryID identifies the callback query that triggered an ephemeral response.
CallbackQueryID string `json:"callback_query_id,omitempty"` // Since: Bot API 10.2
LivePhoto string `json:"live_photo"`
// LivePhoto Required. Live photo video to send. The video must be no longer than 10 seconds and must not
// exceed 10 MB in size. Pass a file_id as String to send a video that exists on the Telegram servers
// (recommended) or upload a new video using multipart/form-data. More information on Sending Files ».
// Sending live photos by a URL is currently unsupported.
LivePhoto string `json:"live_photo"`
// Photo contains or identifies the associated photo.
Photo string `json:"photo"`
Caption string `json:"caption,omitempty"`
ParseMode ParseMode `json:"parse_mode,omitempty"`
Photo string `json:"photo"`
// Caption Optional. Video caption (may also be used when resending videos by file_id), 0-1024 characters
// after entities parsing
Caption string `json:"caption,omitempty"`
// ParseMode Optional. Mode for parsing entities in the video caption. See formatting options for more
// details.
ParseMode ParseMode `json:"parse_mode,omitempty"`
// CaptionEntities Optional. A JSON-serialized list of special entities that appear in the caption, which
// can be specified instead of parse_mode
CaptionEntities []MessageEntity `json:"caption_entities,omitempty"`
ShowCaptionAboveMedia bool `json:"show_caption_above_media,omitempty"`
HasSpoiler bool `json:"has_spoiler,omitempty"`
DisableNotification bool `json:"disable_notification,omitempty"`
ProtectContent bool `json:"protect_content,omitempty"`
AllowPaidBroadcast bool `json:"allow_paid_broadcast,omitempty"`
MessageEffectID string `json:"message_effect_id,omitempty"`
// ShowCaptionAboveMedia Optional. Pass True if the caption must be shown above the message media
ShowCaptionAboveMedia bool `json:"show_caption_above_media,omitempty"`
// HasSpoiler Optional. Pass True if the video needs to be covered with a spoiler animation
HasSpoiler bool `json:"has_spoiler,omitempty"`
// DisableNotification Optional. Sends the message silently. Users will receive a notification with no
// sound.
DisableNotification bool `json:"disable_notification,omitempty"`
// ProtectContent Optional. Protects the contents of the sent message from forwarding and saving
ProtectContent bool `json:"protect_content,omitempty"`
// AllowPaidBroadcast Optional. Pass True to allow up to 1000 messages per second, ignoring broadcasting
// limits for a fee of 0.1 Telegram Stars per message. The relevant Stars will be withdrawn from the bot's
// balance.
AllowPaidBroadcast bool `json:"allow_paid_broadcast,omitempty"`
// MessageEffectID Optional. Unique identifier of the message effect to be added to the message; for private
// chats only
MessageEffectID string `json:"message_effect_id,omitempty"`
// SuggestedPostParameters Optional. A JSON-serialized object containing the parameters of the suggested
// post to send; for direct messages chats only. If the message is sent as a reply to another suggested
// post, then that suggested post is automatically declined.
SuggestedPostParameters *SuggestedPostParameters `json:"suggested_post_parameters,omitempty"`
ReplyParameters *ReplyParameters `json:"reply_parameters,omitempty"`
ReplyMarkup *ReplyMarkup `json:"reply_markup,omitempty"`
// ReplyParameters Optional. Description of the message to reply to
ReplyParameters *ReplyParameters `json:"reply_parameters,omitempty"`
// ReplyMarkup Optional. Additional interface options. A JSON-serialized object for an inline keyboard,
// custom reply keyboard, instructions to remove a reply keyboard or to force a reply from the user.
ReplyMarkup *ReplyMarkup `json:"reply_markup,omitempty"`
}
// SendLivePhoto sends a live photo.
+468 -177
View File
@@ -3,107 +3,183 @@ package tgapi
// Animation represents an animation file (GIF or H.264/MPEG-4 AVC without sound).
// Since: Bot API 4.0
type Animation struct {
FileID string `json:"file_id"`
// FileID Identifier for this file, which can be used to download or reuse the file
FileID string `json:"file_id"`
// FileUniqueID Unique identifier for this file, which is supposed to be the same over time and for
// different bots. Can't be used to download or reuse the file.
FileUniqueID string `json:"file_unique_id"`
Width int `json:"width"`
Height int `json:"height"`
Duration int `json:"duration"`
// Width Video width as defined by the sender
Width int `json:"width"`
// Height Video height as defined by the sender
Height int `json:"height"`
// Duration Duration of the video in seconds as defined by the sender
Duration int `json:"duration"`
// Thumbnail Optional. Animation thumbnail as defined by the sender
Thumbnail *PhotoSize `json:"thumbnail,omitempty"`
FileName string `json:"file_name"`
MimeType string `json:"mime_type"`
FileSize int `json:"file_size"`
// FileName Optional. Original animation filename as defined by the sender
FileName string `json:"file_name"`
// MimeType Optional. MIME type of the file as defined by the sender
MimeType string `json:"mime_type"`
// FileSize Optional. File size in bytes. It can be bigger than 2^31 and some programming languages may have
// difficulty/silent defects in interpreting it. But it has at most 52 significant bits, so a signed 64-bit
// integer or double-precision float type are safe for storing this value.
FileSize int `json:"file_size"`
}
// Audio represents an audio file to be treated as music by the Telegram clients.
// Since: Bot API 1.2
// See https://core.telegram.org/bots/api#audio
type Audio struct {
FileID string `json:"file_id"`
// FileID Identifier for this file, which can be used to download or reuse the file
FileID string `json:"file_id"`
// FileUniqueID Unique identifier for this file, which is supposed to be the same over time and for
// different bots. Can't be used to download or reuse the file.
FileUniqueID string `json:"file_unique_id"`
Duration int `json:"duration"`
// Duration Duration of the audio in seconds as defined by the sender
Duration int `json:"duration"`
Performer string `json:"performer,omitempty"`
Title string `json:"title,omitempty"`
FileName string `json:"file_name,omitempty"` // Since: Bot API 5.0
MimeType string `json:"mime_type,omitempty"`
FileSize int64 `json:"file_size,omitempty"`
// Performer Optional. Performer of the audio as defined by the sender or by audio tags
Performer string `json:"performer,omitempty"`
// Title Optional. Title of the audio as defined by the sender or by audio tags
Title string `json:"title,omitempty"`
// FileName Optional. Original filename as defined by the sender
FileName string `json:"file_name,omitempty"` // Since: Bot API 5.0
// MimeType Optional. MIME type of the file as defined by the sender
MimeType string `json:"mime_type,omitempty"`
// FileSize Optional. File size in bytes. It can be bigger than 2^31 and some programming languages may have
// difficulty/silent defects in interpreting it. But it has at most 52 significant bits, so a signed 64-bit
// integer or double-precision float type are safe for storing this value.
FileSize int64 `json:"file_size,omitempty"`
// Thumbnail Optional. Thumbnail of the album cover to which the music file belongs
Thumbnail *PhotoSize `json:"thumbnail,omitempty"`
}
// Document represents a general file (as opposed to photos, voice messages and audio files).
// Since: Bot API 1.0
type Document struct {
FileID string `json:"file_id"`
FileUniqueID string `json:"file_unique_id"`
Thumbnail *PhotoSize `json:"thumbnail,omitempty"`
FileName string `json:"file_name"`
MimeType string `json:"mime_type"`
FileSize int `json:"file_size,omitempty"`
// FileID Identifier for this file, which can be used to download or reuse the file
FileID string `json:"file_id"`
// FileUniqueID Unique identifier for this file, which is supposed to be the same over time and for
// different bots. Can't be used to download or reuse the file.
FileUniqueID string `json:"file_unique_id"`
// Thumbnail Optional. Document thumbnail as defined by the sender
Thumbnail *PhotoSize `json:"thumbnail,omitempty"`
// FileName Optional. Original filename as defined by the sender
FileName string `json:"file_name"`
// MimeType Optional. MIME type of the file as defined by the sender
MimeType string `json:"mime_type"`
// FileSize Optional. File size in bytes. It can be bigger than 2^31 and some programming languages may have
// difficulty/silent defects in interpreting it. But it has at most 52 significant bits, so a signed 64-bit
// integer or double-precision float type are safe for storing this value.
FileSize int `json:"file_size,omitempty"`
}
// Story represents a story.
// Since: Bot API 6.8
type Story struct {
// Chat Chat that posted the story
Chat Chat `json:"chat"`
ID int `json:"id"`
// ID Unique identifier for the story in the chat
ID int `json:"id"`
}
// Video represents a video file.
// Since: Bot API 1.0
type Video struct {
FileID string `json:"file_id"`
// FileID Identifier for this file, which can be used to download or reuse the file
FileID string `json:"file_id"`
// FileUniqueID Unique identifier for this file, which is supposed to be the same over time and for
// different bots. Can't be used to download or reuse the file.
FileUniqueID string `json:"file_unique_id"`
Width int `json:"width"`
Height int `json:"height"`
Duration int `json:"duration"`
// Width Video width as defined by the sender
Width int `json:"width"`
// Height Video height as defined by the sender
Height int `json:"height"`
// Duration Duration of the video in seconds as defined by the sender
Duration int `json:"duration"`
Thumbnail *PhotoSize `json:"thumbnail,omitempty"`
Cover []PhotoSize `json:"cover,omitempty"` // Since: Bot API 8.3
StartTimestamp int64 `json:"start_timestamp"` // Since: Bot API 8.3
Qualities []VideoQuality `json:"qualities,omitempty"` // Since: Bot API 9.4
FileName string `json:"file_name,omitempty"`
MimeType string `json:"mime_type,omitempty"`
FileSize int64 `json:"file_size,omitempty"`
// Thumbnail Optional. Video thumbnail
Thumbnail *PhotoSize `json:"thumbnail,omitempty"`
// Cover Optional. Available sizes of the cover of the video in the message
Cover []PhotoSize `json:"cover,omitempty"` // Since: Bot API 8.3
// StartTimestamp Optional. Timestamp in seconds from which the video will play in the message
StartTimestamp int64 `json:"start_timestamp"` // Since: Bot API 8.3
// Qualities Optional. List of available qualities of the video
Qualities []VideoQuality `json:"qualities,omitempty"` // Since: Bot API 9.4
// FileName Optional. Original filename as defined by the sender
FileName string `json:"file_name,omitempty"`
// MimeType Optional. MIME type of the file as defined by the sender
MimeType string `json:"mime_type,omitempty"`
// FileSize Optional. File size in bytes. It can be bigger than 2^31 and some programming languages may have
// difficulty/silent defects in interpreting it. But it has at most 52 significant bits, so a signed 64-bit
// integer or double-precision float type are safe for storing this value.
FileSize int64 `json:"file_size,omitempty"`
}
// VideoQuality describes an alternative quality for a video.
// Since: Bot API 9.4
// See https://core.telegram.org/bots/api#videoquality
type VideoQuality struct {
FileID string `json:"file_id"`
// FileID Identifier for this file, which can be used to download or reuse the file
FileID string `json:"file_id"`
// FileUniqueID Unique identifier for this file, which is supposed to be the same over time and for
// different bots. Can't be used to download or reuse the file.
FileUniqueID string `json:"file_unique_id"`
Width int `json:"width"`
Height int `json:"height"`
Codec string `json:"codec"`
FileSize int64 `json:"file_size,omitempty"`
// Width Video width
Width int `json:"width"`
// Height Video height
Height int `json:"height"`
// Codec Codec that was used to encode the video, for example, “h264”, “h265”, or “av01”
Codec string `json:"codec"`
// FileSize Optional. File size in bytes. It can be bigger than 2^31 and some programming languages may have
// difficulty/silent defects in interpreting it. But it has at most 52 significant bits, so a signed 64-bit
// integer or double-precision float type are safe for storing this value.
FileSize int64 `json:"file_size,omitempty"`
}
// VideoNote represents a video message.
// Since: Bot API 3.0
type VideoNote struct {
FileID string `json:"file_id"`
FileUniqueID string `json:"file_unique_id"`
Length int `json:"length"`
Duration int `json:"duration"`
Thumbnail *PhotoSize `json:"thumbnail,omitempty"`
FileSize int64 `json:"file_size,omitempty"`
// FileID Identifier for this file, which can be used to download or reuse the file
FileID string `json:"file_id"`
// FileUniqueID Unique identifier for this file, which is supposed to be the same over time and for
// different bots. Can't be used to download or reuse the file.
FileUniqueID string `json:"file_unique_id"`
// Length Video width and height (diameter of the video message) as defined by the sender
Length int `json:"length"`
// Duration Duration of the video in seconds as defined by the sender
Duration int `json:"duration"`
// Thumbnail Optional. Video thumbnail
Thumbnail *PhotoSize `json:"thumbnail,omitempty"`
// FileSize Optional. File size in bytes
FileSize int64 `json:"file_size,omitempty"`
}
// Voice represents a voice note.
// Since: Bot API 1.2
type Voice struct {
FileID string `json:"file_id"`
// FileID Identifier for this file, which can be used to download or reuse the file
FileID string `json:"file_id"`
// FileUniqueID Unique identifier for this file, which is supposed to be the same over time and for
// different bots. Can't be used to download or reuse the file.
FileUniqueID string `json:"file_unique_id"`
Duration int `json:"duration"`
MimeType string `json:"mime_type,omitempty"`
FileSize int `json:"file_size,omitempty"`
// Duration Duration of the audio in seconds as defined by the sender
Duration int `json:"duration"`
// MimeType Optional. MIME type of the file as defined by the sender
MimeType string `json:"mime_type,omitempty"`
// FileSize Optional. File size in bytes. It can be bigger than 2^31 and some programming languages may have
// difficulty/silent defects in interpreting it. But it has at most 52 significant bits, so a signed 64-bit
// integer or double-precision float type are safe for storing this value.
FileSize int `json:"file_size,omitempty"`
}
// PaidMediaInfo describes paid media.
// Since: Bot API 7.6
type PaidMediaInfo struct {
StarCount int `json:"star_count"`
// StarCount The number of Telegram Stars that must be paid to buy access to the media
StarCount int `json:"star_count"`
// PaidMedia Information about the paid media
PaidMedia []PaidMedia `json:"paid_media"`
}
@@ -125,48 +201,78 @@ const (
// PaidMedia describes paid media content.
// Since: Bot API 7.6
type PaidMedia struct {
// Type identifies the preview, photo, video, or live-photo variant.
Type PaidMediaType `json:"type,omitempty"`
Width int `json:"width,omitempty"`
Height int `json:"height,omitempty"`
// Width Optional. Media width as defined by the sender
Width int `json:"width,omitempty"`
// Height Optional. Media height as defined by the sender
Height int `json:"height,omitempty"`
// Duration Optional. Duration of the media in seconds as defined by the sender
Duration int `json:"duration,omitempty"`
// Photo The photo
Photo []PhotoSize `json:"photo,omitempty"`
Video *Video `json:"video,omitempty"`
// Video The video
Video *Video `json:"video,omitempty"`
// LivePhoto The photo
LivePhoto *LivePhoto `json:"live_photo,omitempty"` // Since: Bot API 10.0
}
// Contact represents a phone contact.
// Since: Bot API 1.0
type Contact struct {
// PhoneNumber Contact's phone number
PhoneNumber string `json:"phone_number"`
FirstName string `json:"first_name"`
LastName string `json:"last_name,omitempty"`
UserID int64 `json:"user_id,omitempty"`
Vcard string `json:"vcard,omitempty"`
// FirstName Contact's first name
FirstName string `json:"first_name"`
// LastName Optional. Contact's last name
LastName string `json:"last_name,omitempty"`
// UserID Optional. Contact's user identifier in Telegram. This number may have more than 32 significant
// bits and some programming languages may have difficulty/silent defects in interpreting it. But it has at
// most 52 significant bits, so a 64-bit integer or double-precision float type are safe for storing this
// identifier.
UserID int64 `json:"user_id,omitempty"`
// Vcard Optional. Additional data about the contact in the form of a vCard
Vcard string `json:"vcard,omitempty"`
}
// Dice represents an animated emoji with a random value.
// Since: Bot API 4.7
type Dice struct {
// Emoji Emoji on which the dice throw animation is based
Emoji string `json:"emoji"`
Value int `json:"value"`
// Value Value of the dice, 1-6 for “”, “” and “” base emoji, 1-5 for “” and “” base
// emoji, 1-64 for “” base emoji
Value int `json:"value"`
}
// PollOption contains information about one answer option in a poll.
// Since: Bot API 4.2
// See https://core.telegram.org/bots/api#polloption
type PollOption struct {
PersistentID string `json:"persistent_id"` // Since: Bot API 9.6
Text string `json:"text"`
// PersistentID Unique identifier of the option, persistent on option addition and deletion
PersistentID string `json:"persistent_id"` // Since: Bot API 9.6
// Text Option text, 1-100 characters
Text string `json:"text"`
// TextEntities Optional. Special entities that appear in the option text. Currently, only custom emoji
// entities are allowed in poll option texts
TextEntities []MessageEntity `json:"text_entities"`
Media *PollMedia `json:"media,omitempty"` // Since: Bot API 10.0
VoterCount int `json:"voter_count"`
// Media Optional. Media added to the poll option
Media *PollMedia `json:"media,omitempty"` // Since: Bot API 10.0
// VoterCount Number of users who voted for this option; may be 0 if unknown
VoterCount int `json:"voter_count"`
AddedByUser *User `json:"added_by_user,omitempty"` // Since: Bot API 9.6
AddedByChat *Chat `json:"added_by_chat,omitempty"` // Since: Bot API 9.6
AdditionDate int `json:"addition_date,omitempty"` // Since: Bot API 9.6
// AddedByUser Optional. User who added the option; omitted if the option wasn't added by a user after poll
// creation
AddedByUser *User `json:"added_by_user,omitempty"` // Since: Bot API 9.6
// AddedByChat Optional. Chat that added the option; omitted if the option wasn't added by a chat after poll
// creation
AddedByChat *Chat `json:"added_by_chat,omitempty"` // Since: Bot API 9.6
// AdditionDate Optional. Point in time (Unix timestamp) when the option was added; omitted if the option
// existed in the original poll
AdditionDate int `json:"addition_date,omitempty"` // Since: Bot API 9.6
}
// InputPollOptionMedia describes the media to attach to a poll option.
@@ -174,7 +280,9 @@ type PollOption struct {
// Since: Bot API 10.0
// See https://core.telegram.org/bots/api#inputpolloptionmedia
type InputPollOptionMedia struct {
Type string `json:"type"`
// Type identifies the poll-option media variant.
Type string `json:"type"`
// Media is the file_id or URL of the option media for non-link variants.
Media string `json:"media,omitempty"`
// URL contains the HTTP URL.
URL string `json:"url,omitempty"` // Since: Bot API 10.1; for type "link"
@@ -184,36 +292,55 @@ type InputPollOptionMedia struct {
// Since: Bot API 7.3
// See https://core.telegram.org/bots/api#inputpolloption
type InputPollOption struct {
Text string `json:"text"`
TextParseMode ParseMode `json:"text_parse_mode,omitempty"`
TextEntities []MessageEntity `json:"text_entities,omitempty"`
Media *InputPollOptionMedia `json:"media,omitempty"` // Since: Bot API 10.0
// Text Option text, 1-100 characters
Text string `json:"text"`
// TextParseMode Optional. Mode for parsing entities in the text. See formatting options for more details.
// Currently, only custom emoji entities are allowed.
TextParseMode ParseMode `json:"text_parse_mode,omitempty"`
// TextEntities Optional. A JSON-serialized list of special entities that appear in the poll option text. It
// can be specified instead of text_parse_mode.
TextEntities []MessageEntity `json:"text_entities,omitempty"`
// Media Optional. Media added to the poll option
Media *InputPollOptionMedia `json:"media,omitempty"` // Since: Bot API 10.0
}
// InputPollMedia describes the media to attach to a poll or its explanation.
// Since: Bot API 10.0
// See https://core.telegram.org/bots/api#inputpollmedia
type InputPollMedia struct {
Type string `json:"type"`
// Type identifies the poll-media variant.
Type string `json:"type"`
// Media is the file_id or URL of the poll media.
Media string `json:"media"`
}
// PollOptionAdded describes a service message about a poll option being added.
// Since: Bot API 9.6
type PollOptionAdded struct {
PollMessage *InaccessibleMessage `json:"poll_message,omitempty"`
OptionPersistentID string `json:"option_persistent_id"`
OptionText string `json:"option_text"`
OptionTextEntities []MessageEntity `json:"option_text_entities,omitempty"`
// PollMessage Optional. Message containing the poll to which the option was added, if known. Note that the
// Message object in this field will not contain the reply_to_message field even if it itself is a reply.
PollMessage *InaccessibleMessage `json:"poll_message,omitempty"`
// OptionPersistentID Unique identifier of the added option
OptionPersistentID string `json:"option_persistent_id"`
// OptionText Option text
OptionText string `json:"option_text"`
// OptionTextEntities Optional. Special entities that appear in the option_text
OptionTextEntities []MessageEntity `json:"option_text_entities,omitempty"`
}
// PollOptionDeleted describes a service message about a poll option being deleted.
// Since: Bot API 9.6
type PollOptionDeleted struct {
PollMessage *InaccessibleMessage `json:"poll_message,omitempty"`
OptionPersistentID string `json:"option_persistent_id"`
OptionText string `json:"option_text"`
OptionTextEntities []MessageEntity `json:"option_text_entities,omitempty"`
// PollMessage Optional. Message containing the poll from which the option was deleted, if known. Note that
// the Message object in this field will not contain the reply_to_message field even if it itself is a
// reply.
PollMessage *InaccessibleMessage `json:"poll_message,omitempty"`
// OptionPersistentID Unique identifier of the deleted option
OptionPersistentID string `json:"option_persistent_id"`
// OptionText Option text
OptionText string `json:"option_text"`
// OptionTextEntities Optional. Special entities that appear in the option_text
OptionTextEntities []MessageEntity `json:"option_text_entities,omitempty"`
}
// PollType represents the type of a poll.
@@ -226,43 +353,102 @@ const (
PollTypeQuiz PollType = "quiz"
)
// PollAnswer represents an answer of a user in a poll.
// PollAnswer represents an answer submitted by a poll voter.
//
// User and VoterChat remain value fields for v1 compatibility. Their pointer
// representation is subject to change in v2; use VoterUser and VoterChatInfo
// when presence matters.
// Since: Bot API 4.6
// See https://core.telegram.org/bots/api#pollanswer
type PollAnswer struct {
PollID string `json:"poll_id"`
VoterChat Chat `json:"voter_chat,omitempty"` // Since: Bot API 6.8
User User `json:"user,omitempty"` // FIXME: Pointer in v2
OptionIDs []int `json:"option_ids"`
// PollID identifies the poll.
PollID string `json:"poll_id"`
// VoterChat is the chat that changed the answer, when the voter is anonymous.
VoterChat Chat `json:"voter_chat,omitempty"` // Since: Bot API 6.8
// User is the user that changed the answer, when the voter is not anonymous.
User User `json:"user,omitempty"`
// OptionIDs contains the chosen option indices and is empty for a retracted vote.
OptionIDs []int `json:"option_ids"`
// OptionPersistentIDs contains the persistent identifiers of the chosen options.
OptionPersistentIDs []string `json:"option_persistent_ids"` // Since: Bot API 9.6
}
// VoterUser returns the non-anonymous voter when it is present.
//
// Since: Bot API 4.6
func (a PollAnswer) VoterUser() (*User, bool) {
if a.User.ID == 0 {
return nil, false
}
return &a.User, true
}
// VoterChatInfo returns the anonymous voter chat when it is present.
//
// Since: Bot API 6.8
func (a PollAnswer) VoterChatInfo() (*Chat, bool) {
if a.VoterChat.ID == 0 {
return nil, false
}
return &a.VoterChat, true
}
// Poll contains information about a poll.
// Since: Bot API 4.2
// See https://core.telegram.org/bots/api#poll
type Poll struct {
ID string `json:"id"`
Question string `json:"question"`
// ID Unique poll identifier
ID string `json:"id"`
// Question Poll question, 1-300 characters
Question string `json:"question"`
// QuestionEntities Optional. Special entities that appear in the question. Currently, only custom emoji
// entities are allowed in poll questions
QuestionEntities []MessageEntity `json:"question_entities"` // Since: Bot API 7.3
Options []PollOption `json:"options"`
TotalVoterCount int `json:"total_voter_count"`
IsClosed bool `json:"is_closed,omitempty"`
IsAnonymous bool `json:"is_anonymous,omitempty"`
Type PollType `json:"type"`
// Options List of poll options
Options []PollOption `json:"options"`
// TotalVoterCount Total number of users that voted in the poll
TotalVoterCount int `json:"total_voter_count"`
// IsClosed True, if the poll is closed
IsClosed bool `json:"is_closed,omitempty"`
// IsAnonymous True, if the poll is anonymous
IsAnonymous bool `json:"is_anonymous,omitempty"`
// Type Poll type, currently can be “regular” or “quiz”
Type PollType `json:"type"`
AllowsMultipleAnswers bool `json:"allows_multiple_answers,omitempty"` // Since: Bot API 4.6
AllowsRevoting bool `json:"allows_revoting,omitempty"` // Since: Bot API 9.6
MembersOnly bool `json:"members_only,omitempty"` // Since: Bot API 10.0
CountryCodes []string `json:"country_codes,omitempty"` // Since: Bot API 10.0
CorrectOptionIDs []int `json:"correct_option_ids,omitempty"` // Since: Bot API 9.6
Explanation string `json:"explanation,omitempty"` // Since: Bot API 4.8
ExplanationEntities []MessageEntity `json:"explanation_entities,omitempty"` // Since: Bot API 4.8
ExplanationMedia *PollMedia `json:"explanation_media,omitempty"` // Since: Bot API 10.0
OpenPeriod int `json:"open_period,omitempty"` // Since: Bot API 4.8
CloseDate int `json:"close_date,omitempty"` // Since: Bot API 4.8
Description string `json:"description,omitempty"` // Since: Bot API 9.6
DescriptionEntities []MessageEntity `json:"description_entities,omitempty"` // Since: Bot API 9.6
Media *PollMedia `json:"media,omitempty"` // Since: Bot API 10.0
// AllowsMultipleAnswers True, if the poll allows multiple answers
AllowsMultipleAnswers bool `json:"allows_multiple_answers,omitempty"` // Since: Bot API 4.6
// AllowsRevoting True, if the poll allows to change the chosen answer options
AllowsRevoting bool `json:"allows_revoting,omitempty"` // Since: Bot API 9.6
// MembersOnly True if voting is limited to users who have been members of the chat where the poll was
// originally sent for more than 24 hours
MembersOnly bool `json:"members_only,omitempty"` // Since: Bot API 10.0
// CountryCodes Optional. A list of two-letter ISO 3166-1 alpha-2 country codes indicating the countries
// from which users can vote in the poll. The country code “FT” is used for users with anonymous
// numbers. If omitted, then users from any country can participate in the poll.
CountryCodes []string `json:"country_codes,omitempty"` // Since: Bot API 10.0
// CorrectOptionIDs Optional. Array of 0-based identifiers of the correct answer options. Available only for
// polls in quiz mode which are closed or were sent (not forwarded) by the bot or to the private chat with
// the bot.
CorrectOptionIDs []int `json:"correct_option_ids,omitempty"` // Since: Bot API 9.6
// Explanation Optional. Text that is shown when a user chooses an incorrect answer or taps on the lamp icon
// in a quiz-style poll, 0-200 characters
Explanation string `json:"explanation,omitempty"` // Since: Bot API 4.8
// ExplanationEntities Optional. Special entities like usernames, URLs, bot commands, etc. that appear in
// the explanation
ExplanationEntities []MessageEntity `json:"explanation_entities,omitempty"` // Since: Bot API 4.8
// ExplanationMedia Optional. Media added to the quiz explanation
ExplanationMedia *PollMedia `json:"explanation_media,omitempty"` // Since: Bot API 10.0
// OpenPeriod Optional. Amount of time in seconds the poll will be active after creation
OpenPeriod int `json:"open_period,omitempty"` // Since: Bot API 4.8
// CloseDate Optional. Point in time (Unix timestamp) when the poll will be automatically closed
CloseDate int `json:"close_date,omitempty"` // Since: Bot API 4.8
// Description Optional. Description of the poll; for polls inside the Message object only
Description string `json:"description,omitempty"` // Since: Bot API 9.6
// DescriptionEntities Optional. Special entities like usernames, URLs, bot commands, etc. that appear in
// the description
DescriptionEntities []MessageEntity `json:"description_entities,omitempty"` // Since: Bot API 9.6
// Media Optional. Media added to the poll description; for polls inside the Message object only
Media *PollMedia `json:"media,omitempty"` // Since: Bot API 10.0
}
// Link represents an HTTP link.
@@ -276,73 +462,121 @@ type Link struct {
// PollMedia represents media attached to a poll.
// Since: Bot API 10.0
type PollMedia struct {
// Animation Optional. Media is an animation, information about the animation
Animation *Animation `json:"animation,omitempty"`
Audio *Audio `json:"audio,omitempty"`
Document *Document `json:"document,omitempty"`
// Audio Optional. Media is an audio file, information about the file; currently, can't be received in a
// poll option
Audio *Audio `json:"audio,omitempty"`
// Document Optional. Media is a general file, information about the file; currently, can't be received in a
// poll option
Document *Document `json:"document,omitempty"`
// Link contains link media attached to the poll.
Link *Link `json:"link,omitempty"` // Since: Bot API 10.1
LivePhoto *LivePhoto `json:"live_photo,omitempty"`
Location *Location `json:"location,omitempty"`
Photo []PhotoSize `json:"photo,omitempty"`
Sticker *Sticker `json:"sticker,omitempty"`
Venue *Venue `json:"venue,omitempty"`
Video *Video `json:"video,omitempty"`
Link *Link `json:"link,omitempty"` // Since: Bot API 10.1
// LivePhoto Optional. Media is a live photo, information about the live photo
LivePhoto *LivePhoto `json:"live_photo,omitempty"`
// Location Optional. Media is a shared location, information about the location
Location *Location `json:"location,omitempty"`
// Photo Optional. Media is a photo, available sizes of the photo
Photo []PhotoSize `json:"photo,omitempty"`
// Sticker Optional. Media is a sticker, information about the sticker; currently, for poll options only
Sticker *Sticker `json:"sticker,omitempty"`
// Venue Optional. Media is a venue, information about the venue
Venue *Venue `json:"venue,omitempty"`
// Video Optional. Media is a video, information about the video
Video *Video `json:"video,omitempty"`
}
// ChecklistTask represents a single task in a checklist.
// Since: Bot API 9.1
type ChecklistTask struct {
ID int `json:"id"`
Text string `json:"text"`
TextEntities []MessageEntity `json:"text_entities,omitempty"`
CompletedByUser *User `json:"completed_by_user,omitempty"`
CompletedByChat *Chat `json:"completed_by_chat,omitempty"`
CompletionDate int `json:"completion_date,omitempty"`
// ID Unique identifier of the task
ID int `json:"id"`
// Text Text of the task
Text string `json:"text"`
// TextEntities Optional. Special entities that appear in the task text
TextEntities []MessageEntity `json:"text_entities,omitempty"`
// CompletedByUser Optional. User that completed the task; omitted if the task wasn't completed by a user
CompletedByUser *User `json:"completed_by_user,omitempty"`
// CompletedByChat Optional. Chat that completed the task; omitted if the task wasn't completed by a chat
CompletedByChat *Chat `json:"completed_by_chat,omitempty"`
// CompletionDate Optional. Point in time (Unix timestamp) when the task was completed; 0 if the task wasn't
// completed
CompletionDate int `json:"completion_date,omitempty"`
}
// Checklist represents a checklist.
// Since: Bot API 9.1
type Checklist struct {
Title string `json:"title"`
TitleEntities []MessageEntity `json:"title_entities,omitempty"`
Tasks []ChecklistTask `json:"tasks"`
OthersCanAddTasks bool `json:"others_can_add_tasks,omitempty"`
OthersCanMarkTasksAsDone bool `json:"others_can_mark_tasks_as_done,omitempty"`
// Title Title of the checklist
Title string `json:"title"`
// TitleEntities Optional. Special entities that appear in the checklist title
TitleEntities []MessageEntity `json:"title_entities,omitempty"`
// Tasks List of tasks in the checklist
Tasks []ChecklistTask `json:"tasks"`
// OthersCanAddTasks Optional. True, if users other than the creator of the list can add tasks to the list
OthersCanAddTasks bool `json:"others_can_add_tasks,omitempty"`
// OthersCanMarkTasksAsDone Optional. True, if users other than the creator of the list can mark tasks as
// done or not done
OthersCanMarkTasksAsDone bool `json:"others_can_mark_tasks_as_done,omitempty"`
}
// InputChecklistTask describes a task in a checklist.
// Since: Bot API 9.1
type InputChecklistTask struct {
ID int `json:"id"`
Text string `json:"text"`
ParseMode ParseMode `json:"parse_mode,omitempty"`
// ID Unique identifier of the task; must be positive and unique among all task identifiers currently
// present in the checklist
ID int `json:"id"`
// Text Text of the task; 1-100 characters after entities parsing
Text string `json:"text"`
// ParseMode Optional. Mode for parsing entities in the text. See formatting options for more details.
ParseMode ParseMode `json:"parse_mode,omitempty"`
// TextEntities Optional. List of special entities that appear in the text, which can be specified instead
// of parse_mode. Currently, only bold, italic, underline, strikethrough, spoiler, custom_emoji, and
// date_time entities are allowed.
TextEntities []MessageEntity `json:"text_entities,omitempty"`
}
// InputChecklist represents a checklist to be sent.
// Since: Bot API 9.1
type InputChecklist struct {
Title string `json:"title"`
ParseMode ParseMode `json:"parse_mode,omitempty"`
TitleEntities []MessageEntity `json:"title_entities,omitempty"`
Tasks []InputChecklistTask `json:"tasks"`
OtherCanAddTasks bool `json:"other_can_add_tasks,omitempty"`
OtherCanMarkTasksAsDone bool `json:"other_can_mark_tasks_as_done,omitempty"`
// Title Title of the checklist; 1-255 characters after entities parsing
Title string `json:"title"`
// ParseMode Optional. Mode for parsing entities in the title. See formatting options for more details.
ParseMode ParseMode `json:"parse_mode,omitempty"`
// TitleEntities Optional. List of special entities that appear in the title, which can be specified instead
// of parse_mode. Currently, only bold, italic, underline, strikethrough, spoiler, custom_emoji, and
// date_time entities are allowed.
TitleEntities []MessageEntity `json:"title_entities,omitempty"`
// Tasks List of 1-30 tasks in the checklist
Tasks []InputChecklistTask `json:"tasks"`
// OtherCanAddTasks Optional. Pass True if other users can add tasks to the checklist
// Subject to change in v2: the Go field name may be corrected to OthersCanAddTasks.
OtherCanAddTasks bool `json:"others_can_add_tasks,omitempty"`
// OtherCanMarkTasksAsDone Optional. Pass True if other users can mark tasks as done or not done in the
// checklist
// Subject to change in v2: the Go field name may be corrected to OthersCanMarkTasksAsDone.
OtherCanMarkTasksAsDone bool `json:"others_can_mark_tasks_as_done,omitempty"`
}
// ChecklistTaskDone describes a service message about checklist tasks being marked as done.
// Since: Bot API 9.1
type ChecklistTaskDone struct {
ChecklistMessage *Message `json:"checklist_message,omitempty"`
MarkedAsDoneTaskIDs []int `json:"marked_as_done_task_ids,omitempty"`
MarkedAsNotDoneTaskIDs []int `json:"marked_as_not_done_task_ids,omitempty"`
// ChecklistMessage is the checklist message when it is available.
ChecklistMessage *Message `json:"checklist_message,omitempty"`
// MarkedAsDoneTaskIDs Optional. Identifiers of the tasks that were marked as done
MarkedAsDoneTaskIDs []int `json:"marked_as_done_task_ids,omitempty"`
// MarkedAsNotDoneTaskIDs Optional. Identifiers of the tasks that were marked as not done
MarkedAsNotDoneTaskIDs []int `json:"marked_as_not_done_task_ids,omitempty"`
}
// ChecklistTasksAdded describes a service message about new checklist tasks being added.
// Since: Bot API 9.1
type ChecklistTasksAdded struct {
ChecklistMessage *Message `json:"checklist_message,omitempty"`
Tasks []ChecklistTask `json:"tasks"`
// ChecklistMessage Optional. Message containing the checklist to which the tasks were added. Note that the
// Message object in this field will not contain the reply_to_message field even if it itself is a reply.
ChecklistMessage *Message `json:"checklist_message,omitempty"`
// Tasks List of tasks added to the checklist
Tasks []ChecklistTask `json:"tasks"`
}
// InputMediaType represents the type of input media.
@@ -378,35 +612,64 @@ const (
// Since: Bot API 4.0
// See https://core.telegram.org/bots/api#inputmedia
type InputMedia struct {
Type InputMediaType `json:"type"`
Media string `json:"media"`
// Type identifies the concrete input-media variant.
Type InputMediaType `json:"type"`
// Media is a file_id, HTTP URL, or attach:// reference for the media.
Media string `json:"media"`
Caption *string `json:"caption,omitempty"`
ParseMode *ParseMode `json:"parse_mode,omitempty"`
CaptionEntities []MessageEntity `json:"caption_entities,omitempty"`
ShowCaptionAboveMedia *bool `json:"show_caption_above_media,omitempty"` // Since: Bot API 7.4
HasSpoiler *bool `json:"has_spoiler,omitempty"` // Since: Bot API 6.4
// Caption is the optional media caption.
Caption *string `json:"caption,omitempty"`
// ParseMode selects how entities in Caption are parsed.
ParseMode *ParseMode `json:"parse_mode,omitempty"`
// CaptionEntities Optional. List of special entities that appear in the caption, which can be specified
// instead of parse_mode
CaptionEntities []MessageEntity `json:"caption_entities,omitempty"`
// ShowCaptionAboveMedia Optional. Pass True if the caption must be shown above the message media
ShowCaptionAboveMedia *bool `json:"show_caption_above_media,omitempty"` // Since: Bot API 7.4
// HasSpoiler requests that supported media be covered by a spoiler animation.
HasSpoiler *bool `json:"has_spoiler,omitempty"` // Since: Bot API 6.4
Cover *string `json:"cover"` // Since: Bot API 8.3
StartTimestamp *int `json:"start_timestamp"` // Since: Bot API 8.3
Width *int `json:"width,omitempty"`
Height *int `json:"height,omitempty"`
Duration *int `json:"duration,omitempty"`
SupportsStreaming *bool `json:"supports_streaming,omitempty"`
// Cover Optional. Cover for the video in the message. Pass a file_id to send a file that exists on the
// Telegram servers (recommended), pass an HTTP URL for Telegram to get a file from the Internet, or pass
// “attach://<file_attach_name>” to upload a new one using multipart/form-data under <file_attach_name>
// name. More information on Sending Files »
Cover *string `json:"cover"` // Since: Bot API 8.3
// StartTimestamp Optional. Start timestamp for the video in the message
StartTimestamp *int `json:"start_timestamp"` // Since: Bot API 8.3
// Width is the optional media width in pixels.
Width *int `json:"width,omitempty"`
// Height is the optional media height in pixels.
Height *int `json:"height,omitempty"`
// Duration is the optional duration of the media in seconds.
Duration *int `json:"duration,omitempty"`
// SupportsStreaming Optional. Pass True if the uploaded video is suitable for streaming
SupportsStreaming *bool `json:"supports_streaming,omitempty"`
// Performer Optional. Performer of the audio
Performer *string `json:"performer,omitempty"`
Title *string `json:"title,omitempty"`
// Title is the optional title of audio or venue media.
Title *string `json:"title,omitempty"`
// Emoji Optional. Emoji associated with the sticker; only for just uploaded stickers
Emoji *string `json:"emoji,omitempty"`
Latitude *float64 `json:"latitude,omitempty"`
Longitude *float64 `json:"longitude,omitempty"`
Address *string `json:"address,omitempty"`
FoursquareID *string `json:"foursquare_id,omitempty"`
FoursquareType *string `json:"foursquare_type,omitempty"`
GooglePlaceID *string `json:"google_place_id,omitempty"`
GooglePlaceType *string `json:"google_place_type,omitempty"`
// Latitude Latitude of the location
Latitude *float64 `json:"latitude,omitempty"`
// Longitude Longitude of the location
Longitude *float64 `json:"longitude,omitempty"`
// Address Address of the venue
Address *string `json:"address,omitempty"`
// FoursquareID Optional. Foursquare identifier of the venue
FoursquareID *string `json:"foursquare_id,omitempty"`
// FoursquareType Optional. Foursquare type of the venue, if known. (For example,
// “arts_entertainment/default”, “arts_entertainment/aquarium” or “food/icecream”.)
FoursquareType *string `json:"foursquare_type,omitempty"`
// GooglePlaceID Optional. Google Places identifier of the venue
GooglePlaceID *string `json:"google_place_id,omitempty"`
// GooglePlaceType Optional. Google Places type of the venue. (See supported types.)
GooglePlaceType *string `json:"google_place_type,omitempty"`
// HorizontalAccuracy Optional. The radius of uncertainty for the location, measured in meters; 0-1500
HorizontalAccuracy *float64 `json:"horizontal_accuracy,omitempty"`
}
@@ -426,37 +689,65 @@ const (
// Since: Bot API 7.6
// See https://core.telegram.org/bots/api#inputpaidmedia
type InputPaidMedia struct {
Type InputPaidMediaType `json:"type"`
Media string `json:"media"`
// Type identifies the concrete paid-media variant.
Type InputPaidMediaType `json:"type"`
// Media is a file_id, HTTP URL, or attach:// reference for the paid media.
Media string `json:"media"`
Cover *string `json:"cover,omitempty"` // Since: Bot API 8.3
StartTimestamp *int64 `json:"start_timestamp,omitempty"` // Since: Bot API 8.3
Width *int `json:"width,omitempty"`
Height *int `json:"height,omitempty"`
Duration *int `json:"duration,omitempty"`
SupportsStreaming *bool `json:"supports_streaming,omitempty"`
// Cover Optional. Cover for the video in the message. Pass a file_id to send a file that exists on the
// Telegram servers (recommended), pass an HTTP URL for Telegram to get a file from the Internet, or pass
// “attach://<file_attach_name>” to upload a new one using multipart/form-data under <file_attach_name>
// name. More information on Sending Files »
Cover *string `json:"cover,omitempty"` // Since: Bot API 8.3
// StartTimestamp Optional. Start timestamp for the video in the message
StartTimestamp *int64 `json:"start_timestamp,omitempty"` // Since: Bot API 8.3
// Width Optional. Video width
Width *int `json:"width,omitempty"`
// Height Optional. Video height
Height *int `json:"height,omitempty"`
// Duration Optional. Video duration in seconds
Duration *int `json:"duration,omitempty"`
// SupportsStreaming Optional. Pass True if the uploaded video is suitable for streaming
SupportsStreaming *bool `json:"supports_streaming,omitempty"`
}
// PhotoSize represents one size of a photo or a file/sticker thumbnail.
// Since: Bot API 1.0
// See https://core.telegram.org/bots/api#photosize
type PhotoSize struct {
FileID string `json:"file_id"`
// FileID Identifier for this file, which can be used to download or reuse the file
FileID string `json:"file_id"`
// FileUniqueID Unique identifier for this file, which is supposed to be the same over time and for
// different bots. Can't be used to download or reuse the file.
FileUniqueID string `json:"file_unique_id"`
Width int `json:"width"`
Height int `json:"height"`
FileSize int64 `json:"file_size,omitempty"`
// Width Photo width
Width int `json:"width"`
// Height Photo height
Height int `json:"height"`
// FileSize Optional. File size in bytes
FileSize int64 `json:"file_size,omitempty"`
}
// LivePhoto represents a live photo (a photo with a short video attached).
// Since: Bot API 10.0
type LivePhoto struct {
Photo []PhotoSize `json:"photo,omitempty"`
FileID string `json:"file_id"`
FileUniqueID string `json:"file_unique_id"`
Width int `json:"width"`
Height int `json:"height"`
Duration int `json:"duration"`
MIMEType string `json:"mime_type,omitempty"`
FileSize int64 `json:"file_size,omitempty"`
// Photo Optional. Available sizes of the corresponding static photo
Photo []PhotoSize `json:"photo,omitempty"`
// FileID Identifier for the video file which can be used to download or reuse the file
FileID string `json:"file_id"`
// FileUniqueID Unique identifier for the video file which is supposed to be the same over time and for
// different bots. Can't be used to download or reuse the file.
FileUniqueID string `json:"file_unique_id"`
// Width Video width as defined by the sender
Width int `json:"width"`
// Height Video height as defined by the sender
Height int `json:"height"`
// Duration Duration of the video in seconds as defined by the sender
Duration int `json:"duration"`
// MIMEType Optional. MIME type of the file as defined by the sender
MIMEType string `json:"mime_type,omitempty"`
// FileSize Optional. File size in bytes. It can be bigger than 2^31 and some programming languages may have
// difficulty/silent defects in interpreting it. But it has at most 52 significant bits, so a signed 64-bit
// integer or double-precision float type are safe for storing this value.
FileSize int64 `json:"file_size,omitempty"`
}
+20
View File
@@ -0,0 +1,20 @@
package tgapi
import "testing"
func TestPollAnswerVoterHelpers(t *testing.T) {
userAnswer := PollAnswer{User: User{ID: 42}}
user, ok := userAnswer.VoterUser()
if !ok || user.ID != 42 {
t.Fatalf("unexpected voter user: %#v, %v", user, ok)
}
if chat, ok := userAnswer.VoterChatInfo(); ok || chat != nil {
t.Fatalf("unexpected voter chat: %#v, %v", chat, ok)
}
chatAnswer := PollAnswer{VoterChat: Chat{ID: -100}}
chat, ok := chatAnswer.VoterChatInfo()
if !ok || chat.ID != -100 {
t.Fatalf("unexpected voter chat: %#v, %v", chat, ok)
}
}
+97 -27
View File
@@ -6,9 +6,15 @@ import "context"
// Since: Bot API 4.7
// See https://core.telegram.org/bots/api#setmycommands
type SetMyCommands struct {
Commands []BotCommand `json:"commands"`
Scope *BotCommandScope `json:"scope,omitempty"`
Language string `json:"language_code,omitempty"`
// Commands Required. A JSON-serialized list of bot commands to be set as the list of the bot's commands. At
// most 100 commands can be specified.
Commands []BotCommand `json:"commands"`
// Scope Optional. A JSON-serialized object, describing scope of users for which the commands are relevant.
// Defaults to BotCommandScopeDefault.
Scope *BotCommandScope `json:"scope,omitempty"`
// Language Optional. A two-letter ISO 639-1 language code. If empty, commands will be applied to all users
// from the given scope, for whose language there are no dedicated commands.
Language string `json:"language_code,omitempty"`
}
// SetMyCommands changes the list of the bot's commands.
@@ -33,8 +39,12 @@ func (api *API) SetMyCommandsWithContext(ctx context.Context, params SetMyComman
// Since: Bot API 5.3
// See https://core.telegram.org/bots/api#deletemycommands
type DeleteMyCommands struct {
Scope *BotCommandScope `json:"scope,omitempty"`
Language string `json:"language_code,omitempty"`
// Scope Optional. A JSON-serialized object, describing scope of users for which the commands are relevant.
// Defaults to BotCommandScopeDefault.
Scope *BotCommandScope `json:"scope,omitempty"`
// Language Optional. A two-letter ISO 639-1 language code. If empty, commands will be applied to all users
// from the given scope, for whose language there are no dedicated commands.
Language string `json:"language_code,omitempty"`
}
// DeleteMyCommands deletes the list of the bot's commands for the given scope and user language.
@@ -59,8 +69,10 @@ func (api *API) DeleteMyCommandsWithContext(ctx context.Context, params DeleteMy
// Since: Bot API 4.7
// See https://core.telegram.org/bots/api#getmycommands
type GetMyCommands struct {
Scope *BotCommandScope `json:"scope,omitempty"`
Language string `json:"language_code,omitempty"`
// Scope Optional. A JSON-serialized object, describing scope of users. Defaults to BotCommandScopeDefault.
Scope *BotCommandScope `json:"scope,omitempty"`
// Language Optional. A two-letter ISO 639-1 language code or an empty string
Language string `json:"language_code,omitempty"`
}
// GetMyCommands returns the current list of the bot's commands for the given scope and user language.
@@ -84,7 +96,11 @@ func (api *API) GetMyCommandsWithContext(ctx context.Context, params GetMyComman
// Since: Bot API 6.7
// See https://core.telegram.org/bots/api#setmyname
type SetMyName struct {
Name string `json:"name"`
// Name Optional. New bot name; 0-64 characters. Pass an empty string to remove the dedicated name for the
// given language.
Name string `json:"name"`
// Language Optional. A two-letter ISO 639-1 language code. If empty, the name will be shown to all users
// for whose language there is no dedicated name.
Language string `json:"language_code,omitempty"`
}
@@ -110,6 +126,7 @@ func (api *API) SetMyNameWithContext(ctx context.Context, params SetMyName) (boo
// Since: Bot API 6.7
// See https://core.telegram.org/bots/api#getmyname
type GetMyName struct {
// Language Optional. A two-letter ISO 639-1 language code or an empty string
Language string `json:"language_code,omitempty"`
}
@@ -134,8 +151,12 @@ func (api *API) GetMyNameWithContext(ctx context.Context, params GetMyName) (Bot
// Since: Bot API 6.6
// See https://core.telegram.org/bots/api#setmydescription
type SetMyDescription struct {
// Description Optional. New bot description; 0-512 characters. Pass an empty string to remove the dedicated
// description for the given language.
Description string `json:"description"`
Language string `json:"language_code,omitempty"`
// Language Optional. A two-letter ISO 639-1 language code. If empty, the description will be applied to all
// users for whose language there is no dedicated description.
Language string `json:"language_code,omitempty"`
}
// SetMyDescription changes the bot's description.
@@ -160,6 +181,7 @@ func (api *API) SetMyDescriptionWithContext(ctx context.Context, params SetMyDes
// Since: Bot API 6.6
// See https://core.telegram.org/bots/api#getmydescription
type GetMyDescription struct {
// Language Optional. A two-letter ISO 639-1 language code or an empty string
Language string `json:"language_code,omitempty"`
}
@@ -184,8 +206,12 @@ func (api *API) GetMyDescriptionWithContext(ctx context.Context, params GetMyDes
// Since: Bot API 6.6
// See https://core.telegram.org/bots/api#setmyshortdescription
type SetMyShortDescription struct {
// ShortDescription Optional. New short description for the bot; 0-120 characters. Pass an empty string to
// remove the dedicated short description for the given language.
ShortDescription string `json:"short_description,omitempty"`
Language string `json:"language_code,omitempty"`
// Language Optional. A two-letter ISO 639-1 language code. If empty, the short description will be applied
// to all users for whose language there is no dedicated short description.
Language string `json:"language_code,omitempty"`
}
// SetMyShortDescription changes the bot's short description.
@@ -210,6 +236,7 @@ func (api *API) SetMyShortDescriptionWithContext(ctx context.Context, params Set
// Since: Bot API 6.6
// See https://core.telegram.org/bots/api#getmyshortdescription
type GetMyShortDescription struct {
// Language Optional. A two-letter ISO 639-1 language code or an empty string
Language string `json:"language_code,omitempty"`
}
@@ -234,6 +261,7 @@ func (api *API) GetMyShortDescriptionWithContext(ctx context.Context, params Get
// Since: Bot API 9.0
// See https://core.telegram.org/bots/api#setmyprofilephoto
type SetMyProfilePhoto struct {
// Photo Required. The new profile photo to set
Photo InputProfilePhoto `json:"photo"`
}
@@ -277,7 +305,11 @@ func (api *API) RemoveMyProfilePhotoWithContext(ctx context.Context) (bool, erro
// Since: Bot API 6.0
// See https://core.telegram.org/bots/api#setchatmenubutton
type SetChatMenuButton struct {
ChatID int64 `json:"chat_id,omitempty"`
// ChatID Optional. Unique identifier for the target private chat. If not specified, the bot's default menu
// button will be changed.
ChatID int64 `json:"chat_id,omitempty"`
// MenuButton Optional. A JSON-serialized object for the bot's new menu button. Defaults to
// MenuButtonDefault.
MenuButton *MenuButton `json:"menu_button,omitempty"`
}
@@ -303,6 +335,8 @@ func (api *API) SetChatMenuButtonWithContext(ctx context.Context, params SetChat
// Since: Bot API 6.0
// See https://core.telegram.org/bots/api#getchatmenubutton
type GetChatMenuButton struct {
// ChatID Optional. Unique identifier for the target private chat. If not specified, the bot's default menu
// button will be returned.
ChatID int64 `json:"chat_id,omitempty"`
}
@@ -327,8 +361,12 @@ func (api *API) GetChatMenuButtonWithContext(ctx context.Context, params GetChat
// Since: Bot API 6.0
// See https://core.telegram.org/bots/api#setmydefaultadministratorrights
type SetMyDefaultAdministratorRights struct {
Rights *ChatAdministratorRights `json:"rights"`
ForChannels bool `json:"for_channels"`
// Rights Optional. A JSON-serialized object describing new default administrator rights. If not specified,
// the default administrator rights will be cleared.
Rights *ChatAdministratorRights `json:"rights"`
// ForChannels Optional. Pass True to change the default administrator rights of the bot in channels.
// Otherwise, the default administrator rights of the bot for groups and supergroups will be changed.
ForChannels bool `json:"for_channels"`
}
// SetMyDefaultAdministratorRights changes the default administrator rights for the bot.
@@ -353,6 +391,8 @@ func (api *API) SetMyDefaultAdministratorRightsWithContext(ctx context.Context,
// Since: Bot API 6.0
// See https://core.telegram.org/bots/api#getmydefaultadministratorrights
type GetMyDefaultAdministratorRights struct {
// ForChannels Optional. Pass True to get default administrator rights of the bot in channels. Otherwise,
// default administrator rights of the bot for groups and supergroups will be returned.
ForChannels bool `json:"for_channels"`
}
@@ -394,13 +434,27 @@ func (api *API) GetAvailableGiftsWithContext(ctx context.Context) (Gifts, error)
// Since: Bot API 9.0
// See https://core.telegram.org/bots/api#sendgift
type SendGift struct {
UserID int64 `json:"user_id,omitempty"`
ChatID int64 `json:"chat_id,omitempty"`
GiftID string `json:"gift_id"`
PayForUpgrade bool `json:"pay_for_upgrade"`
Text string `json:"text"`
TextParseMode ParseMode `json:"text_parse_mode,omitempty"`
TextEntities []MessageEntity `json:"text_entities,omitempty"`
// UserID Optional. Required if chat_id is not specified. Unique identifier of the target user who will
// receive the gift.
UserID int64 `json:"user_id,omitempty"`
// ChatID Optional. Required if user_id is not specified. Unique identifier for the chat or username of the
// channel (in the format @username) that will receive the gift.
ChatID int64 `json:"chat_id,omitempty"`
// GiftID Required. Identifier of the gift; limited gifts can't be sent to channel chats
GiftID string `json:"gift_id"`
// PayForUpgrade Optional. Pass True to pay for the gift upgrade from the bot's balance, thereby making the
// upgrade free for the receiver
PayForUpgrade bool `json:"pay_for_upgrade"`
// Text Optional. Text that will be shown along with the gift; 0-128 characters
Text string `json:"text"`
// TextParseMode Optional. Mode for parsing entities in the text. See formatting options for more details.
// Entities other than “bold”, “italic”, “underline”, “strikethrough”, “spoiler”,
// “custom_emoji”, and “date_time” are ignored.
TextParseMode ParseMode `json:"text_parse_mode,omitempty"`
// TextEntities Optional. A JSON-serialized list of special entities that appear in the gift text. It can be
// specified instead of text_parse_mode. Entities other than “bold”, “italic”, “underline”,
// “strikethrough”, “spoiler”, “custom_emoji”, and “date_time” are ignored.
TextEntities []MessageEntity `json:"text_entities,omitempty"`
}
// SendGift sends a gift to the given user or chat.
@@ -425,12 +479,25 @@ func (api *API) SendGiftWithContext(ctx context.Context, params SendGift) (bool,
// Since: Bot API 9.0
// See https://core.telegram.org/bots/api#giftpremiumsubscription
type GiftPremiumSubscription struct {
UserID int64 `json:"user_id"`
MonthCount int `json:"month_count"`
StarCount int `json:"star_count"`
Text string `json:"text,omitempty"`
TextParseMode ParseMode `json:"text_parse_mode,omitempty"`
TextEntities []MessageEntity `json:"text_entities,omitempty"`
// UserID Required. Unique identifier of the target user who will receive a Telegram Premium subscription
UserID int64 `json:"user_id"`
// MonthCount Required. Number of months the Telegram Premium subscription will be active for the user; must
// be one of 3, 6, or 12
MonthCount int `json:"month_count"`
// StarCount Required. Number of Telegram Stars to pay for the Telegram Premium subscription; must be 1000
// for 3 months, 1500 for 6 months, and 2500 for 12 months
StarCount int `json:"star_count"`
// Text Optional. Text that will be shown along with the service message about the subscription; 0-128
// characters
Text string `json:"text,omitempty"`
// TextParseMode Optional. Mode for parsing entities in the text. See formatting options for more details.
// Entities other than “bold”, “italic”, “underline”, “strikethrough”, “spoiler”,
// “custom_emoji”, and “date_time” are ignored.
TextParseMode ParseMode `json:"text_parse_mode,omitempty"`
// TextEntities Optional. A JSON-serialized list of special entities that appear in the gift text. It can be
// specified instead of text_parse_mode. Entities other than “bold”, “italic”, “underline”,
// “strikethrough”, “spoiler”, “custom_emoji”, and “date_time” are ignored.
TextEntities []MessageEntity `json:"text_entities,omitempty"`
}
// GiftPremiumSubscription gifts a Telegram Premium subscription to the user.
@@ -455,6 +522,7 @@ func (api *API) GiftPremiumSubscriptionWithContext(ctx context.Context, params G
// Since: Bot API 10.0
// See https://core.telegram.org/bots/api#getmanagedbotaccesssettings
type GetManagedBotAccessSettings struct {
// BotUserID identifies the managed bot.
BotUserID int64 `json:"bot_user_id"`
}
@@ -479,7 +547,9 @@ func (api *API) GetManagedBotAccessSettingsWithContext(ctx context.Context, para
// Since: Bot API 10.0
// See https://core.telegram.org/bots/api#setmanagedbotaccesssettings
type SetManagedBotAccessSettings struct {
BotUserID int64 `json:"bot_user_id"`
// BotUserID identifies the managed bot.
BotUserID int64 `json:"bot_user_id"`
// AccessSettings contains the access settings to apply to the managed bot.
AccessSettings BotAccessSettings `json:"access_settings"`
}
+32 -6
View File
@@ -4,7 +4,10 @@ package tgapi
// Since: Bot API 4.7
// See https://core.telegram.org/bots/api#botcommand
type BotCommand struct {
Command string `json:"command"`
// Command Text of the command; 1-32 characters. Can contain only lowercase English letters, digits and
// underscores.
Command string `json:"command"`
// Description Description of the command; 1-256 characters
Description string `json:"description"`
// IsEphemeral marks the command as visible only in ephemeral command contexts.
IsEphemeral bool `json:"is_ephemeral,omitempty"` // Since: Bot API 10.2
@@ -34,26 +37,33 @@ const (
// Since: Bot API 5.3
// See https://core.telegram.org/bots/api#botcommandscope
type BotCommandScope struct {
Type BotCommandScopeType `json:"type"`
ChatID *int64 `json:"chat_id,omitempty"`
UserID *int64 `json:"user_id,omitempty"`
// Type identifies the concrete command-scope variant.
Type BotCommandScopeType `json:"type"`
// ChatID Unique identifier for the target chat or username of the target supergroup in the format
// @username. Channel direct messages chats and channel chats aren't supported.
ChatID *int64 `json:"chat_id,omitempty"`
// UserID Unique identifier of the target user
UserID *int64 `json:"user_id,omitempty"`
}
// BotName represents the bot's name.
// Since: Bot API 6.7
type BotName struct {
// Name The bot's name
Name string `json:"name"`
}
// BotDescription represents the bot's description.
// Since: Bot API 6.6
type BotDescription struct {
// Description The bot's description
Description string `json:"description"`
}
// BotShortDescription represents the bot's short description.
// Since: Bot API 6.6
type BotShortDescription struct {
// ShortDescription The bot's short description
ShortDescription string `json:"short_description"`
}
@@ -71,13 +81,22 @@ const (
// Since: Bot API 9.0
// See https://core.telegram.org/bots/api#inputprofilephoto
type InputProfilePhoto struct {
// Type identifies the static-photo or animated-photo variant.
Type InputProfilePhotoType `json:"type"`
// Photo The static profile photo. Profile photos can't be reused and can only be uploaded as a new file, so
// you can pass “attach://<file_attach_name>” if the photo was uploaded using multipart/form-data under
// <file_attach_name>. More information on Sending Files »
// Static fields (for static photos)
Photo *string `json:"photo,omitempty"`
// Animation The animated profile photo. Profile photos can't be reused and can only be uploaded as a new
// file, so you can pass “attach://<file_attach_name>” if the photo was uploaded using
// multipart/form-data under <file_attach_name>. More information on Sending Files »
// Animated fields (for animated profile videos)
Animation *string `json:"animation,omitempty"`
Animation *string `json:"animation,omitempty"`
// MainFrameTimestamp Optional. Timestamp in seconds of the frame that will be used as the static profile
// photo. Defaults to 0.0.
MainFrameTimestamp *float64 `json:"main_frame_timestamp,omitempty"`
}
@@ -97,10 +116,16 @@ const (
// Since: Bot API 6.0
// See https://core.telegram.org/bots/api#menubutton
type MenuButton struct {
// Type identifies the commands, web_app, or default menu-button variant.
Type MenuButtonType `json:"type"`
// Text Text on the button
// WebApp fields (for web_app button)
Text *string `json:"text"`
Text *string `json:"text"`
// WebApp Description of the Web App that will be launched when the user presses the button. The Web App
// will be able to send an arbitrary message on behalf of the user using the method answerWebAppQuery.
// Alternatively, a t.me link to a Web App of the bot can be specified in the object instead of the Web
// App's URL, in which case the Web App will be opened as if the user pressed the link.
WebApp *WebAppInfo `json:"web_app"`
}
@@ -108,5 +133,6 @@ type MenuButton struct {
// Since: Bot API 10.0
// See https://core.telegram.org/bots/api#botaccesssettings
type BotAccessSettings struct {
// AllowAllPrivateChats reports whether the managed bot may access all private chats of its owner.
AllowAllPrivateChats bool `json:"allow_all_private_chats"`
}
+158 -53
View File
@@ -6,7 +6,10 @@ import "context"
// Since: Bot API 8.0
// See https://core.telegram.org/bots/api#verifyuser
type VerifyUser struct {
UserID int64 `json:"user_id"`
// UserID Required. Unique identifier of the target user
UserID int64 `json:"user_id"`
// CustomDescription Optional. Custom description for the verification; 0-70 characters. Must be empty if
// the organization isn't allowed to provide a custom verification description.
CustomDescription string `json:"custom_description,omitempty"`
}
@@ -32,7 +35,11 @@ func (api *API) VerifyUserWithContext(ctx context.Context, params VerifyUser) (b
// Since: Bot API 8.0
// See https://core.telegram.org/bots/api#verifychat
type VerifyChat struct {
ChatID int64 `json:"chat_id"`
// ChatID Required. Unique identifier for the target chat or username of the target bot, supergroup or
// channel in the format @username. Channel direct messages chats can't be verified.
ChatID int64 `json:"chat_id"`
// CustomDescription Optional. Custom description for the verification; 0-70 characters. Must be empty if
// the organization isn't allowed to provide a custom verification description.
CustomDescription string `json:"custom_description,omitempty"`
}
@@ -58,6 +65,7 @@ func (api *API) VerifyChatWithContext(ctx context.Context, params VerifyChat) (b
// Since: Bot API 8.0
// See https://core.telegram.org/bots/api#removeuserverification
type RemoveUserVerification struct {
// UserID Required. Unique identifier of the target user
UserID int64 `json:"user_id"`
}
@@ -83,6 +91,8 @@ func (api *API) RemoveUserVerificationWithContext(ctx context.Context, params Re
// Since: Bot API 8.0
// See https://core.telegram.org/bots/api#removechatverification
type RemoveChatVerification struct {
// ChatID Required. Unique identifier for the target chat or username of the target bot or channel in the
// format @username
ChatID int64 `json:"chat_id"`
}
@@ -108,9 +118,14 @@ func (api *API) RemoveChatVerificationWithContext(ctx context.Context, params Re
// Since: Bot API 9.0
// See https://core.telegram.org/bots/api#readbusinessmessage
type ReadBusinessMessage struct {
// BusinessConnectionID Required. Unique identifier of the business connection on behalf of which to read
// the message
BusinessConnectionID string `json:"business_connection_id"`
ChatID int64 `json:"chat_id"`
MessageID int `json:"message_id"`
// ChatID Required. Unique identifier of the chat in which the message was received. The chat must have been
// active in the last 24 hours.
ChatID int64 `json:"chat_id"`
// MessageID Required. Unique identifier of the message to mark as read
MessageID int `json:"message_id"`
}
// ReadBusinessMessage marks a business message as read.
@@ -135,6 +150,7 @@ func (api *API) ReadBusinessMessageWithContext(ctx context.Context, params ReadB
// Since: Bot API 7.2
// See https://core.telegram.org/bots/api#getbusinessconnection
type GetBusinessConnection struct {
// BusinessConnectionID Required. Unique identifier of the business connection
BusinessConnectionID string `json:"business_connection_id"`
}
@@ -159,8 +175,12 @@ func (api *API) GetBusinessConnectionWithContext(ctx context.Context, params Get
// Since: Bot API 9.0
// See https://core.telegram.org/bots/api#deletebusinessmessages
type DeleteBusinessMessages struct {
// BusinessConnectionID Required. Unique identifier of the business connection on behalf of which to delete
// the messages
BusinessConnectionID string `json:"business_connection_id"`
MessageIDs []int `json:"message_ids"`
// MessageIDs Required. A JSON-serialized list of 1-100 identifiers of messages to delete. All messages must
// be from the same chat. See deleteMessage for limitations on which messages can be deleted.
MessageIDs []int `json:"message_ids"`
}
// DeleteBusinessMessages deletes business messages.
@@ -185,9 +205,12 @@ func (api *API) DeleteBusinessMessagesWithContext(ctx context.Context, params De
// Since: Bot API 9.0
// See https://core.telegram.org/bots/api#setbusinessaccountname
type SetBusinessAccountName struct {
// BusinessConnectionID Required. Unique identifier of the business connection
BusinessConnectionID string `json:"business_connection_id"`
FirstName string `json:"first_name"`
LastName string `json:"last_name,omitempty"`
// FirstName Required. The new value of the first name for the business account; 1-64 characters
FirstName string `json:"first_name"`
// LastName Optional. The new value of the last name for the business account; 0-64 characters
LastName string `json:"last_name,omitempty"`
}
// SetBusinessAccountName sets the first and last name of a business account.
@@ -212,8 +235,10 @@ func (api *API) SetBusinessAccountNameWithContext(ctx context.Context, params Se
// Since: Bot API 9.0
// See https://core.telegram.org/bots/api#setbusinessaccountusername
type SetBusinessAccountUsername struct {
// BusinessConnectionID Required. Unique identifier of the business connection
BusinessConnectionID string `json:"business_connection_id"`
Username string `json:"username,omitempty"`
// Username Optional. The new value of the username for the business account; 0-32 characters
Username string `json:"username,omitempty"`
}
// SetBusinessAccountUsername sets the username of a business account.
@@ -238,8 +263,10 @@ func (api *API) SetBusinessAccountUsernameWithContext(ctx context.Context, param
// Since: Bot API 9.0
// See https://core.telegram.org/bots/api#setbusinessaccountbio
type SetBusinessAccountBio struct {
// BusinessConnectionID Required. Unique identifier of the business connection
BusinessConnectionID string `json:"business_connection_id"`
Bio string `json:"bio,omitempty"`
// Bio Optional. The new value of the bio for the business account; 0-140 characters
Bio string `json:"bio,omitempty"`
}
// SetBusinessAccountBio sets the bio of a business account.
@@ -264,9 +291,13 @@ func (api *API) SetBusinessAccountBioWithContext(ctx context.Context, params Set
// Since: Bot API 9.0
// See https://core.telegram.org/bots/api#setbusinessaccountprofilephoto
type SetBusinessAccountProfilePhoto struct {
BusinessConnectionID string `json:"business_connection_id"`
Photo InputProfilePhoto `json:"photo,omitempty"`
IsPublic bool `json:"is_public,omitempty"`
// BusinessConnectionID Required. Unique identifier of the business connection
BusinessConnectionID string `json:"business_connection_id"`
// Photo Required. The new profile photo to set
Photo InputProfilePhoto `json:"photo,omitempty"`
// IsPublic Optional. Pass True to set the public photo, which will be visible even if the main photo is
// hidden by the business account's privacy settings. An account can have only one public photo.
IsPublic bool `json:"is_public,omitempty"`
}
// SetBusinessAccountProfilePhoto sets the profile photo of a business account.
@@ -291,8 +322,12 @@ func (api *API) SetBusinessAccountProfilePhotoWithContext(ctx context.Context, p
// Since: Bot API 9.0
// See https://core.telegram.org/bots/api#removebusinessaccountprofilephoto
type RemoveBusinessAccountProfilePhoto struct {
// BusinessConnectionID Required. Unique identifier of the business connection
BusinessConnectionID string `json:"business_connection_id"`
IsPublic bool `json:"is_public,omitempty"`
// IsPublic Optional. Pass True to remove the public photo, which is visible even if the main photo is
// hidden by the business account's privacy settings. After the main photo is removed, the previous profile
// photo (if present) becomes the main photo.
IsPublic bool `json:"is_public,omitempty"`
}
// RemoveBusinessAccountProfilePhoto removes the profile photo of a business account.
@@ -317,9 +352,13 @@ func (api *API) RemoveBusinessAccountProfilePhotoWithContext(ctx context.Context
// Since: Bot API 9.0
// See https://core.telegram.org/bots/api#setbusinessaccountgiftsettings
type SetBusinessAccountGiftSettings struct {
BusinessConnectionID string `json:"business_connection_id"`
ShowGiftButton bool `json:"show_gift_button"`
AcceptedGiftTypes AcceptedGiftTypes `json:"accepted_gift_types"`
// BusinessConnectionID Required. Unique identifier of the business connection
BusinessConnectionID string `json:"business_connection_id"`
// ShowGiftButton Required. Pass True if a button for sending a gift to the user or by the business account
// must always be shown in the input field
ShowGiftButton bool `json:"show_gift_button"`
// AcceptedGiftTypes Required. Types of gifts accepted by the business account
AcceptedGiftTypes AcceptedGiftTypes `json:"accepted_gift_types"`
}
// SetBusinessAccountGiftSettings sets gift settings for a business account.
@@ -344,6 +383,7 @@ func (api *API) SetBusinessAccountGiftSettingsWithContext(ctx context.Context, p
// Since: Bot API 9.0
// See https://core.telegram.org/bots/api#getbusinessaccountstarbalance
type GetBusinessAccountStarBalance struct {
// BusinessConnectionID Required. Unique identifier of the business connection
BusinessConnectionID string `json:"business_connection_id"`
}
@@ -368,8 +408,10 @@ func (api *API) GetBusinessAccountStarBalanceWithContext(ctx context.Context, pa
// Since: Bot API 9.0
// See https://core.telegram.org/bots/api#transferbusinessaccountstars
type TransferBusinessAccountStars struct {
// BusinessConnectionID Required. Unique identifier of the business connection
BusinessConnectionID string `json:"business_connection_id"`
StarCount int `json:"star_count"`
// StarCount Required. Number of Telegram Stars to transfer; 1-10000
StarCount int `json:"star_count"`
}
// TransferBusinessAccountStars transfers stars from a business account.
@@ -394,17 +436,33 @@ func (api *API) TransferBusinessAccountStarsWithContext(ctx context.Context, par
// Since: Bot API 9.0
// See https://core.telegram.org/bots/api#getbusinessaccountgifts
type GetBusinessAccountGifts struct {
BusinessConnectionID string `json:"business_connection_id"`
ExcludeUnsaved bool `json:"exclude_unsaved,omitempty"`
ExcludeSaved bool `json:"exclude_saved,omitempty"`
ExcludeUnlimited bool `json:"exclude_unlimited,omitempty"`
ExcludeLimitedUpgradable bool `json:"exclude_limited_upgradable,omitempty"`
ExcludeLimitedNonUpgradable bool `json:"exclude_limited_non_upgradable,omitempty"`
ExcludeUnique bool `json:"exclude_unique,omitempty"`
ExcludeFromBlockchain bool `json:"exclude_from_blockchain,omitempty"`
SortByPrice bool `json:"sort_by_price,omitempty"`
Offset string `json:"offset,omitempty"`
Limit int `json:"limit,omitempty"`
// BusinessConnectionID Required. Unique identifier of the business connection
BusinessConnectionID string `json:"business_connection_id"`
// ExcludeUnsaved Optional. Pass True to exclude gifts that aren't saved to the account's profile page
ExcludeUnsaved bool `json:"exclude_unsaved,omitempty"`
// ExcludeSaved Optional. Pass True to exclude gifts that are saved to the account's profile page
ExcludeSaved bool `json:"exclude_saved,omitempty"`
// ExcludeUnlimited Optional. Pass True to exclude gifts that can be purchased an unlimited number of times
ExcludeUnlimited bool `json:"exclude_unlimited,omitempty"`
// ExcludeLimitedUpgradable Optional. Pass True to exclude gifts that can be purchased a limited number of
// times and can be upgraded to unique
ExcludeLimitedUpgradable bool `json:"exclude_limited_upgradable,omitempty"`
// ExcludeLimitedNonUpgradable Optional. Pass True to exclude gifts that can be purchased a limited number
// of times and can't be upgraded to unique
ExcludeLimitedNonUpgradable bool `json:"exclude_limited_non_upgradable,omitempty"`
// ExcludeUnique Optional. Pass True to exclude unique gifts
ExcludeUnique bool `json:"exclude_unique,omitempty"`
// ExcludeFromBlockchain Optional. Pass True to exclude gifts that were assigned from the TON blockchain and
// can't be resold or transferred in Telegram
ExcludeFromBlockchain bool `json:"exclude_from_blockchain,omitempty"`
// SortByPrice Optional. Pass True to sort results by gift price instead of send date. Sorting is applied
// before pagination.
SortByPrice bool `json:"sort_by_price,omitempty"`
// Offset Optional. Offset of the first entry to return as received from the previous request; use empty
// string to get the first chunk of results
Offset string `json:"offset,omitempty"`
// Limit Optional. The maximum number of gifts to be returned; 1-100. Defaults to 100.
Limit int `json:"limit,omitempty"`
}
// GetBusinessAccountGifts returns gifts owned by a business account.
@@ -428,8 +486,10 @@ func (api *API) GetBusinessAccountGiftsWithContext(ctx context.Context, params G
// Since: Bot API 9.0
// See https://core.telegram.org/bots/api#convertgifttostars
type ConvertGiftToStars struct {
// BusinessConnectionID Required. Unique identifier of the business connection
BusinessConnectionID string `json:"business_connection_id"`
OwnedGiftID string `json:"owned_gift_id"`
// OwnedGiftID Required. Unique identifier of the regular gift that should be converted to Telegram Stars
OwnedGiftID string `json:"owned_gift_id"`
}
// ConvertGiftToStars converts a gift to Telegram Stars.
@@ -454,10 +514,17 @@ func (api *API) ConvertGiftToStarsWithContext(ctx context.Context, params Conver
// Since: Bot API 9.0
// See https://core.telegram.org/bots/api#upgradegift
type UpgradeGift struct {
// BusinessConnectionID Required. Unique identifier of the business connection
BusinessConnectionID string `json:"business_connection_id"`
OwnedGiftID string `json:"owned_gift_id"`
KeepOriginalDetails bool `json:"keep_original_details,omitempty"`
StarCount int `json:"star_count,omitempty"`
// OwnedGiftID Required. Unique identifier of the regular gift that should be upgraded to a unique one
OwnedGiftID string `json:"owned_gift_id"`
// KeepOriginalDetails Optional. Pass True to keep the original gift text, sender and receiver in the
// upgraded gift
KeepOriginalDetails bool `json:"keep_original_details,omitempty"`
// StarCount Optional. The amount of Telegram Stars that will be paid for the upgrade from the business
// account balance. If gift.prepaid_upgrade_star_count > 0, then pass 0, otherwise, the can_transfer_stars
// business bot right is required and gift.upgrade_star_count must be passed.
StarCount int `json:"star_count,omitempty"`
}
// UpgradeGift upgrades a gift.
@@ -482,10 +549,16 @@ func (api *API) UpgradeGiftWithContext(ctx context.Context, params UpgradeGift)
// Since: Bot API 9.0
// See https://core.telegram.org/bots/api#transfergift
type TransferGift struct {
// BusinessConnectionID Required. Unique identifier of the business connection
BusinessConnectionID string `json:"business_connection_id"`
OwnedGiftID string `json:"owned_gift_id"`
NewOwnerChatID int64 `json:"new_owner_chat_id"`
StarCount int `json:"star_count,omitempty"`
// OwnedGiftID Required. Unique identifier of the regular gift that should be transferred
OwnedGiftID string `json:"owned_gift_id"`
// NewOwnerChatID Required. Unique identifier of the chat which will own the gift. The chat must be active
// in the last 24 hours.
NewOwnerChatID int64 `json:"new_owner_chat_id"`
// StarCount Optional. The amount of Telegram Stars that will be paid for the transfer from the business
// account balance. If positive, then the can_transfer_stars business bot right is required.
StarCount int `json:"star_count,omitempty"`
}
// TransferGift transfers a gift to another chat.
@@ -510,16 +583,29 @@ func (api *API) TransferGiftWithContext(ctx context.Context, params TransferGift
// Since: Bot API 7.2
// See https://core.telegram.org/bots/api#poststory
type PostStory struct {
BusinessConnectionID string `json:"business_connection_id"`
Content InputStoryContent `json:"content"`
ActivePeriod int `json:"active_period"`
// BusinessConnectionID Required. Unique identifier of the business connection
BusinessConnectionID string `json:"business_connection_id"`
// Content Required. Content of the story
Content InputStoryContent `json:"content"`
// ActivePeriod Required. Period after which the story is moved to the archive, in seconds; must be one of 6
// * 3600, 12 * 3600, 86400, or 2 * 86400
ActivePeriod int `json:"active_period"`
Caption string `json:"caption,omitempty"`
ParseMode ParseMode `json:"parse_mode,omitempty"`
// Caption Optional. Caption of the story, 0-2048 characters after entities parsing
Caption string `json:"caption,omitempty"`
// ParseMode Optional. Mode for parsing entities in the story caption. See formatting options for more
// details.
ParseMode ParseMode `json:"parse_mode,omitempty"`
// CaptionEntities Optional. A JSON-serialized list of special entities that appear in the caption, which
// can be specified instead of parse_mode
CaptionEntities []MessageEntity `json:"caption_entities,omitempty"`
Areas []StoryArea `json:"areas"`
// Areas Optional. A JSON-serialized list of clickable areas to be shown on the story
Areas []StoryArea `json:"areas"`
// PostToChatPage Optional. Pass True to keep the story accessible after it expires
PostToChatPage bool `json:"post_to_chat_page,omitempty"`
// ProtectContent Optional. Pass True if the content of the story must be protected from forwarding and
// screenshotting
ProtectContent bool `json:"protect_content,omitempty"`
}
@@ -544,12 +630,20 @@ func (api *API) PostStoryWithContext(ctx context.Context, params PostStory) (Sto
// Since: Bot API 7.2
// See https://core.telegram.org/bots/api#repoststory
type RepostStory struct {
// BusinessConnectionID Required. Unique identifier of the business connection
BusinessConnectionID string `json:"business_connection_id"`
FromChatID int64 `json:"from_chat_id"`
FromStoryID int `json:"from_story_id"`
ActivePeriod int `json:"active_period"`
PostToChatPage bool `json:"post_to_chat_page,omitempty"`
ProtectContent bool `json:"protect_content,omitempty"`
// FromChatID Required. Unique identifier of the chat which posted the story that should be reposted
FromChatID int64 `json:"from_chat_id"`
// FromStoryID Required. Unique identifier of the story that should be reposted
FromStoryID int `json:"from_story_id"`
// ActivePeriod Required. Period after which the story is moved to the archive, in seconds; must be one of 6
// * 3600, 12 * 3600, 86400, or 2 * 86400
ActivePeriod int `json:"active_period"`
// PostToChatPage Optional. Pass True to keep the story accessible after it expires
PostToChatPage bool `json:"post_to_chat_page,omitempty"`
// ProtectContent Optional. Pass True if the content of the story must be protected from forwarding and
// screenshotting
ProtectContent bool `json:"protect_content,omitempty"`
}
// RepostStory reposts a story from another chat.
@@ -574,14 +668,23 @@ func (api *API) RepostStoryWithContext(ctx context.Context, params RepostStory)
// Since: Bot API 7.2
// See https://core.telegram.org/bots/api#editstory
type EditStory struct {
BusinessConnectionID string `json:"business_connection_id"`
StoryID int `json:"story_id"`
Content InputStoryContent `json:"content"`
// BusinessConnectionID Required. Unique identifier of the business connection
BusinessConnectionID string `json:"business_connection_id"`
// StoryID Required. Unique identifier of the story to edit
StoryID int `json:"story_id"`
// Content Required. Content of the story
Content InputStoryContent `json:"content"`
Caption string `json:"caption,omitempty"`
ParseMode ParseMode `json:"parse_mode,omitempty"`
// Caption Optional. Caption of the story, 0-2048 characters after entities parsing
Caption string `json:"caption,omitempty"`
// ParseMode Optional. Mode for parsing entities in the story caption. See formatting options for more
// details.
ParseMode ParseMode `json:"parse_mode,omitempty"`
// CaptionEntities Optional. A JSON-serialized list of special entities that appear in the caption, which
// can be specified instead of parse_mode
CaptionEntities []MessageEntity `json:"caption_entities,omitempty"`
Areas []StoryArea `json:"areas,omitempty"`
// Areas Optional. A JSON-serialized list of clickable areas to be shown on the story
Areas []StoryArea `json:"areas,omitempty"`
}
// EditStory edits an existing story.
@@ -606,8 +709,10 @@ func (api *API) EditStoryWithContext(ctx context.Context, params EditStory) (Sto
// Since: Bot API 7.2
// See https://core.telegram.org/bots/api#deletestory
type DeleteStory struct {
// BusinessConnectionID Required. Unique identifier of the business connection
BusinessConnectionID string `json:"business_connection_id"`
StoryID int `json:"story_id"`
// StoryID Required. Unique identifier of the story to delete
StoryID int `json:"story_id"`
}
// DeleteStory deletes a story.
+112 -42
View File
@@ -4,8 +4,11 @@ package tgapi
// Since: Bot API 7.2
// See https://core.telegram.org/bots/api#businessintro
type BusinessIntro struct {
Title string `json:"title,omitempty"`
Message string `json:"message,omitempty"`
// Title Optional. Title text of the business intro
Title string `json:"title,omitempty"`
// Message Optional. Message text of the business intro
Message string `json:"message,omitempty"`
// Sticker Optional. Sticker of the business intro
Sticker *Sticker `json:"sticker,omitempty"`
}
@@ -13,7 +16,9 @@ type BusinessIntro struct {
// Since: Bot API 7.2
// See https://core.telegram.org/bots/api#businesslocation
type BusinessLocation struct {
Address string `json:"address"`
// Address Address of the business
Address string `json:"address"`
// Location Optional. Location of the business
Location *Location `json:"location,omitempty"`
}
@@ -21,7 +26,11 @@ type BusinessLocation struct {
// Since: Bot API 7.2
// See https://core.telegram.org/bots/api#businessopeninghoursinterval
type BusinessOpeningHoursInterval struct {
// OpeningMinute The minute's sequence number in a week, starting on Monday, marking the start of the time
// interval during which the business is open; 0 - 7 * 24 * 60
OpeningMinute int `json:"opening_minute"`
// ClosingMinute The minute's sequence number in a week, starting on Monday, marking the end of the time
// interval during which the business is open; 0 - 8 * 24 * 60
ClosingMinute int `json:"closing_minute"`
}
@@ -29,7 +38,9 @@ type BusinessOpeningHoursInterval struct {
// Since: Bot API 7.2
// See https://core.telegram.org/bots/api#businessopeninghours
type BusinessOpeningHours struct {
TimeZoneName string `json:"time_zone_name"`
// TimeZoneName Unique name of the time zone for which the opening hours are defined
TimeZoneName string `json:"time_zone_name"`
// OpeningHours List of time intervals describing business opening hours
OpeningHours []BusinessOpeningHoursInterval `json:"opening_hours"`
}
@@ -38,41 +49,75 @@ type BusinessOpeningHours struct {
// Since: Bot API 9.0
// See https://core.telegram.org/bots/api#businessbotrights
type BusinessBotRights struct {
CanReply *bool `json:"can_reply,omitempty"`
CanReadMessages *bool `json:"can_read_messages,omitempty"`
CanDeleteSentMessages *bool `json:"can_delete_sent_messages,omitempty"`
CanDeleteAllMessages *bool `json:"can_delete_all_messages,omitempty"`
CanEditName *bool `json:"can_edit_name,omitempty"`
CanEditBio *bool `json:"can_edit_bio,omitempty"`
CanEditProfilePhoto *bool `json:"can_edit_profile_photo,omitempty"`
CanEditUsername *bool `json:"can_edit_username,omitempty"`
CanChangeGiftSettings *bool `json:"can_change_gift_settings,omitempty"`
CanViewGiftsAndStars *bool `json:"can_view_gifts_and_stars,omitempty"`
CanConvertGiftsToStars *bool `json:"can_convert_gifts_to_stars,omitempty"`
// CanReply Optional. True, if the bot can send and edit messages in the private chats that had incoming
// messages in the last 24 hours
CanReply *bool `json:"can_reply,omitempty"`
// CanReadMessages Optional. True, if the bot can mark incoming private messages as read
CanReadMessages *bool `json:"can_read_messages,omitempty"`
// CanDeleteSentMessages Optional. True, if the bot can delete messages sent by the bot
CanDeleteSentMessages *bool `json:"can_delete_sent_messages,omitempty"`
// CanDeleteAllMessages Optional. True, if the bot can delete all private messages in managed chats
CanDeleteAllMessages *bool `json:"can_delete_all_messages,omitempty"`
// CanEditName Optional. True, if the bot can edit the first and last name of the business account
CanEditName *bool `json:"can_edit_name,omitempty"`
// CanEditBio Optional. True, if the bot can edit the bio of the business account
CanEditBio *bool `json:"can_edit_bio,omitempty"`
// CanEditProfilePhoto Optional. True, if the bot can edit the profile photo of the business account
CanEditProfilePhoto *bool `json:"can_edit_profile_photo,omitempty"`
// CanEditUsername Optional. True, if the bot can edit the username of the business account
CanEditUsername *bool `json:"can_edit_username,omitempty"`
// CanChangeGiftSettings Optional. True, if the bot can change the privacy settings pertaining to gifts for
// the business account
CanChangeGiftSettings *bool `json:"can_change_gift_settings,omitempty"`
// CanViewGiftsAndStars Optional. True, if the bot can view gifts and the amount of Telegram Stars owned by
// the business account
CanViewGiftsAndStars *bool `json:"can_view_gifts_and_stars,omitempty"`
// CanConvertGiftsToStars Optional. True, if the bot can convert regular gifts owned by the business account
// to Telegram Stars
CanConvertGiftsToStars *bool `json:"can_convert_gifts_to_stars,omitempty"`
// CanTransferAndUpgradeGifts Optional. True, if the bot can transfer and upgrade gifts owned by the
// business account
CanTransferAndUpgradeGifts *bool `json:"can_transfer_and_upgrade_gifts,omitempty"`
CanTransferStars *bool `json:"can_transfer_stars,omitempty"`
CanManageStories *bool `json:"can_manage_stories,omitempty"`
// CanTransferStars Optional. True, if the bot can transfer Telegram Stars received by the business account
// to its own account, or use them to upgrade and transfer gifts
CanTransferStars *bool `json:"can_transfer_stars,omitempty"`
// CanManageStories Optional. True, if the bot can post, edit and delete stories on behalf of the business
// account
CanManageStories *bool `json:"can_manage_stories,omitempty"`
}
// BusinessConnection contains information about a business connection.
// Since: Bot API 7.2
// See https://core.telegram.org/bots/api#businessconnection
type BusinessConnection struct {
ID string `json:"id"`
User User `json:"user"`
UserChatID int64 `json:"user_chat_id"`
Date int `json:"date"`
Rights *BusinessBotRights `json:"rights,omitempty"`
IsEnabled bool `json:"is_enabled"`
// ID Unique identifier of the business connection
ID string `json:"id"`
// User Business account user that created the business connection
User User `json:"user"`
// UserChatID Identifier of a private chat with the user who created the business connection. This number
// may have more than 32 significant bits and some programming languages may have difficulty/silent defects
// in interpreting it. But it has at most 52 significant bits, so a 64-bit integer or double-precision float
// type are safe for storing this identifier.
UserChatID int64 `json:"user_chat_id"`
// Date Date the connection was established in Unix time
Date int `json:"date"`
// Rights Optional. Rights of the business bot
Rights *BusinessBotRights `json:"rights,omitempty"`
// IsEnabled True, if the connection is active
IsEnabled bool `json:"is_enabled"`
}
// BusinessMessagesDeleted is received when messages are deleted from a connected business account.
// Since: Bot API 7.2
// See https://core.telegram.org/bots/api#businessmessagesdeleted
type BusinessMessagesDeleted struct {
// BusinessConnectionID Unique identifier of the business connection
BusinessConnectionID string `json:"business_connection_id"`
Chat Chat `json:"chat"`
MessageIDs []int `json:"message_ids"`
// Chat Information about a chat in the business account. The bot may not have access to the chat or the
// corresponding user.
Chat Chat `json:"chat"`
// MessageIDs The list of identifiers of deleted messages in the chat of the business account
MessageIDs []int `json:"message_ids"`
}
// InputStoryContentType indicates the type of input story content.
@@ -89,27 +134,38 @@ const (
// Since: Bot API 9.0
// See https://core.telegram.org/bots/api#inputstorycontent
type InputStoryContent struct {
// Type identifies the photo or video story-content variant.
Type InputStoryContentType `json:"type"`
// Photo fields
Photo *string `json:"photo,omitempty"`
// Video fields
Video *string `json:"video,omitempty"`
Duration *float64 `json:"duration,omitempty"`
Video *string `json:"video,omitempty"`
// Duration Optional. Precise duration of the video in seconds; 0-60
Duration *float64 `json:"duration,omitempty"`
// CoverFrameTimestamp Optional. Timestamp in seconds of the frame that will be used as the static cover for
// the story. Defaults to 0.0.
CoverFrameTimestamp *float64 `json:"cover_frame_timestamp,omitempty"`
IsAnimation *bool `json:"is_animation,omitempty"`
// IsAnimation Optional. Pass True if the video has no sound
IsAnimation *bool `json:"is_animation,omitempty"`
}
// StoryAreaPosition describes the position of a clickable area on a story.
// Since: Bot API 9.0
// See https://core.telegram.org/bots/api#storyareaposition
type StoryAreaPosition struct {
XPercentage float64 `json:"x_percentage"`
YPercentage float64 `json:"y_percentage"`
WidthPercentage float64 `json:"width_percentage"`
HeightPercentage float64 `json:"height_percentage"`
RotationAngle float64 `json:"rotation_angle"`
// XPercentage The abscissa of the area's center, as a percentage of the media width
XPercentage float64 `json:"x_percentage"`
// YPercentage The ordinate of the area's center, as a percentage of the media height
YPercentage float64 `json:"y_percentage"`
// WidthPercentage The width of the area's rectangle, as a percentage of the media width
WidthPercentage float64 `json:"width_percentage"`
// HeightPercentage The height of the area's rectangle, as a percentage of the media height
HeightPercentage float64 `json:"height_percentage"`
// RotationAngle The clockwise rotation angle of the rectangle, in degrees; 0-360
RotationAngle float64 `json:"rotation_angle"`
// CornerRadiusPercentage The radius of the rectangle corner rounding, as a percentage of the media width
CornerRadiusPercentage float64 `json:"corner_radius_percentage"`
}
@@ -133,26 +189,38 @@ const (
// Since: Bot API 9.0
// See https://core.telegram.org/bots/api#storyareatype
type StoryAreaType struct {
// Type identifies the concrete story-area variant.
Type StoryAreaTypeType `json:"type"`
// Latitude Location latitude in degrees
// Location
Latitude *float64 `json:"latitude,omitempty"`
Longitude *float64 `json:"longitude,omitempty"`
Address *LocationAddress `json:"address,omitempty"`
Latitude *float64 `json:"latitude,omitempty"`
// Longitude Location longitude in degrees
Longitude *float64 `json:"longitude,omitempty"`
// Address Optional. Address of the location
Address *LocationAddress `json:"address,omitempty"`
// ReactionType Type of the reaction
// Suggested reaction
ReactionType *ReactionType `json:"reaction_type,omitempty"`
IsDark *bool `json:"is_dark,omitempty"`
IsFlipped *bool `json:"is_flipped,omitempty"`
// IsDark Optional. Pass True if the reaction area has a dark background
IsDark *bool `json:"is_dark,omitempty"`
// IsFlipped Optional. Pass True if reaction area corner is flipped
IsFlipped *bool `json:"is_flipped,omitempty"`
// URL HTTP or tg:// URL to be opened when the area is clicked
// Link
URL *string `json:"url,omitempty"`
// Temperature Temperature, in degree Celsius
// Weather
Temperature *float64 `json:"temperature,omitempty"`
Emoji *string `json:"emoji,omitempty"`
BackgroundColor *int `json:"background_color,omitempty"`
Temperature *float64 `json:"temperature,omitempty"`
// Emoji Emoji representing the weather
Emoji *string `json:"emoji,omitempty"`
// BackgroundColor A color of the area background in the ARGB format
BackgroundColor *int `json:"background_color,omitempty"`
// Name Unique name of the gift
// Unique gift
Name *string `json:"name,omitempty"`
}
@@ -161,6 +229,8 @@ type StoryAreaType struct {
// Since: Bot API 9.0
// See https://core.telegram.org/bots/api#storyarea
type StoryArea struct {
// Position Position of the area
Position StoryAreaPosition `json:"position"`
Type StoryAreaType `json:"type"`
// Type Type of the area
Type StoryAreaType `json:"type"`
}
+272 -80
View File
@@ -6,10 +6,19 @@ import "context"
// Since: Bot API 5.3
// See https://core.telegram.org/bots/api#banchatmember
type BanChatMember struct {
ChatID int64 `json:"chat_id"`
UserID int64 `json:"user_id"`
UntilDate int `json:"until_date,omitempty"`
RevokeMessages bool `json:"revoke_messages,omitempty"`
// ChatID Required. Unique identifier for the target group or username of the target supergroup or channel
// in the format @username
ChatID int64 `json:"chat_id"`
// UserID Required. Unique identifier of the target user
UserID int64 `json:"user_id"`
// UntilDate Optional. Date when the user will be unbanned; Unix time. If user is banned for more than 366
// days or less than 30 seconds from the current time they are considered to be banned forever. Applied for
// supergroups and channels only.
UntilDate int `json:"until_date,omitempty"`
// RevokeMessages Optional. Pass True to delete all messages from the chat for the user that is being
// removed. If False, the user will be able to see messages in the group that were sent before the user was
// removed. Always True for supergroups and channels.
RevokeMessages bool `json:"revoke_messages,omitempty"`
}
// BanChatMember bans a user in a chat.
@@ -34,9 +43,13 @@ func (api *API) BanChatMemberWithContext(ctx context.Context, params BanChatMemb
// Since: Bot API 2.0
// See https://core.telegram.org/bots/api#unbanchatmember
type UnbanChatMember struct {
ChatID int64 `json:"chat_id"`
UserID int64 `json:"user_id"`
OnlyIfBanned bool `json:"only_if_banned"`
// ChatID Required. Unique identifier for the target group or username of the target supergroup or channel
// in the format @username
ChatID int64 `json:"chat_id"`
// UserID Required. Unique identifier of the target user
UserID int64 `json:"user_id"`
// OnlyIfBanned Optional. Do nothing if the user is not banned
OnlyIfBanned bool `json:"only_if_banned"`
}
// UnbanChatMember unbans a previously banned user in a chat.
@@ -61,11 +74,23 @@ func (api *API) UnbanChatMemberWithContext(ctx context.Context, params UnbanChat
// Since: Bot API 3.1
// See https://core.telegram.org/bots/api#restrictchatmember
type RestrictChatMember struct {
ChatID int64 `json:"chat_id"`
UserID int64 `json:"user_id"`
Permissions ChatPermissions `json:"permissions"`
UseIndependentChatPermissions bool `json:"use_independent_chat_permissions,omitempty"`
UntilDate int `json:"until_date,omitempty"`
// ChatID Required. Unique identifier for the target chat or username of the target supergroup in the format
// @username
ChatID int64 `json:"chat_id"`
// UserID Required. Unique identifier of the target user
UserID int64 `json:"user_id"`
// Permissions Required. A JSON-serialized object for new user permissions
Permissions ChatPermissions `json:"permissions"`
// UseIndependentChatPermissions Optional. Pass True if chat permissions are set independently. Otherwise,
// the can_send_other_messages and can_add_web_page_previews permissions will imply the can_send_messages,
// can_send_audios, can_send_documents, can_send_photos, can_send_videos, can_send_video_notes, and
// can_send_voice_notes permissions; the can_send_polls permission will imply the can_send_messages
// permission.
UseIndependentChatPermissions bool `json:"use_independent_chat_permissions,omitempty"`
// UntilDate Optional. Date when restrictions will be lifted for the user; Unix time. If user is restricted
// for more than 366 days or less than 30 seconds from the current time, they are considered to be
// restricted forever.
UntilDate int `json:"until_date,omitempty"`
}
// RestrictChatMember restricts a user in a chat.
@@ -90,26 +115,58 @@ func (api *API) RestrictChatMemberWithContext(ctx context.Context, params Restri
// Since: Bot API 3.1
// See https://core.telegram.org/bots/api#promotechatmember
type PromoteChatMember struct {
ChatID int64 `json:"chat_id"`
UserID int64 `json:"user_id"`
IsAnonymous bool `json:"is_anonymous,omitempty"` // Since: Bot API 5.1
// ChatID Required. Unique identifier for the target chat or username of the target channel in the format
// @username
ChatID int64 `json:"chat_id"`
// UserID Required. Unique identifier of the target user
UserID int64 `json:"user_id"`
// IsAnonymous Optional. Pass True if the administrator's presence in the chat is hidden
IsAnonymous bool `json:"is_anonymous,omitempty"` // Since: Bot API 5.1
CanManageChat bool `json:"can_manage_chat,omitempty"` // Since: Bot API 5.3
CanDeleteMessages bool `json:"can_delete_messages,omitempty"`
CanManageVideoChats bool `json:"can_manage_video_chats,omitempty"` // Since: Bot API 6.0
CanRestrictMembers bool `json:"can_restrict_members,omitempty"`
CanPromoteMembers bool `json:"can_promote_members,omitempty"`
CanChangeInfo bool `json:"can_change_info,omitempty"`
CanInviteUsers bool `json:"can_invite_users,omitempty"`
CanPostStories bool `json:"can_post_stories,omitempty"` // Since: Bot API 6.9
CanEditStories bool `json:"can_edit_stories,omitempty"` // Since: Bot API 6.9
CanDeleteStories bool `json:"can_delete_stories,omitempty"` // Since: Bot API 6.9
CanPostMessages bool `json:"can_post_messages,omitempty"`
CanEditMessages bool `json:"can_edit_messages,omitempty"`
CanPinMessages bool `json:"can_pin_messages,omitempty"`
CanManageTopics bool `json:"can_manage_topics,omitempty"` // Since: Bot API 6.3
// CanManageChat Optional. Pass True if the administrator can access the chat event log, get boost list, see
// hidden supergroup and channel members, report spam messages, ignore slow mode, and send messages to the
// chat without paying Telegram Stars. Implied by any other administrator privilege.
CanManageChat bool `json:"can_manage_chat,omitempty"` // Since: Bot API 5.3
// CanDeleteMessages Optional. Pass True if the administrator can delete messages of other users
CanDeleteMessages bool `json:"can_delete_messages,omitempty"`
// CanManageVideoChats Optional. Pass True if the administrator can manage video chats
CanManageVideoChats bool `json:"can_manage_video_chats,omitempty"` // Since: Bot API 6.0
// CanRestrictMembers Optional. Pass True if the administrator can restrict, ban or unban chat members, or
// access supergroup statistics. For backward compatibility, defaults to True for promotions of channel
// administrators.
CanRestrictMembers bool `json:"can_restrict_members,omitempty"`
// CanPromoteMembers Optional. Pass True if the administrator can add new administrators with a subset of
// their own privileges or demote administrators that they have promoted, directly or indirectly (promoted
// by administrators that were appointed by him)
CanPromoteMembers bool `json:"can_promote_members,omitempty"`
// CanChangeInfo Optional. Pass True if the administrator can change chat title, photo and other settings
CanChangeInfo bool `json:"can_change_info,omitempty"`
// CanInviteUsers Optional. Pass True if the administrator can invite new users to the chat
CanInviteUsers bool `json:"can_invite_users,omitempty"`
// CanPostStories Optional. Pass True if the administrator can post stories to the chat
CanPostStories bool `json:"can_post_stories,omitempty"` // Since: Bot API 6.9
// CanEditStories Optional. Pass True if the administrator can edit stories posted by other users, post
// stories to the chat page, pin chat stories, and access the chat's story archive
CanEditStories bool `json:"can_edit_stories,omitempty"` // Since: Bot API 6.9
// CanDeleteStories Optional. Pass True if the administrator can delete stories posted by other users
CanDeleteStories bool `json:"can_delete_stories,omitempty"` // Since: Bot API 6.9
// CanPostMessages Optional. Pass True if the administrator can post messages in the channel, approve
// suggested posts, or access channel statistics; for channels only
CanPostMessages bool `json:"can_post_messages,omitempty"`
// CanEditMessages Optional. Pass True if the administrator can edit messages of other users and can pin
// messages; for channels only
CanEditMessages bool `json:"can_edit_messages,omitempty"`
// CanPinMessages Optional. Pass True if the administrator can pin messages; for supergroups only
CanPinMessages bool `json:"can_pin_messages,omitempty"`
// CanManageTopics Optional. Pass True if the user is allowed to create, rename, close, and reopen forum
// topics; for supergroups only
CanManageTopics bool `json:"can_manage_topics,omitempty"` // Since: Bot API 6.3
// CanManageDirectMessages Optional. Pass True if the administrator can manage direct messages within the
// channel and decline suggested posts; for channels only
CanManageDirectMessages bool `json:"can_manage_direct_messages,omitempty"` // Since: Bot API 9.1
CanManageTags bool `json:"can_manage_tags,omitempty"` // Since: Bot API 9.5
// CanManageTags Optional. Pass True if the administrator can edit the tags of regular members; for groups
// and supergroups only
CanManageTags bool `json:"can_manage_tags,omitempty"` // Since: Bot API 9.5
}
// PromoteChatMember promotes or demotes a user in a chat.
@@ -134,8 +191,12 @@ func (api *API) PromoteChatMemberWithContext(ctx context.Context, params Promote
// Since: Bot API 5.0
// See https://core.telegram.org/bots/api#setchatadministratorcustomtitle
type SetChatAdministratorCustomTitle struct {
ChatID int64 `json:"chat_id"`
UserID int64 `json:"user_id"`
// ChatID Required. Unique identifier for the target chat or username of the target supergroup in the format
// @username
ChatID int64 `json:"chat_id"`
// UserID Required. Unique identifier of the target user
UserID int64 `json:"user_id"`
// CustomTitle Required. New custom title for the administrator; 0-16 characters, emoji are not allowed
CustomTitle string `json:"custom_title"`
}
@@ -161,9 +222,13 @@ func (api *API) SetChatAdministratorCustomTitleWithContext(ctx context.Context,
// Since: Bot API 9.5
// See https://core.telegram.org/bots/api#setchatmembertag
type SetChatMemberTag struct {
ChatID int64 `json:"chat_id"`
UserID int64 `json:"user_id"`
Tag string `json:"tag,omitempty"`
// ChatID Required. Unique identifier for the target chat or username of the target supergroup in the format
// @username
ChatID int64 `json:"chat_id"`
// UserID Required. Unique identifier of the target user
UserID int64 `json:"user_id"`
// Tag Optional. New tag for the member; 0-16 characters, emoji are not allowed
Tag string `json:"tag,omitempty"`
}
// SetChatMemberTag sets a tag for a chat member.
@@ -188,7 +253,10 @@ func (api *API) SetChatMemberTagWithContext(ctx context.Context, params SetChatM
// Since: Bot API 5.6
// See https://core.telegram.org/bots/api#banchatsenderchat
type BanChatSenderChat struct {
ChatID int64 `json:"chat_id"`
// ChatID Required. Unique identifier for the target chat or username of the target channel in the format
// @username
ChatID int64 `json:"chat_id"`
// SenderChatID Required. Unique identifier of the target sender chat
SenderChatID int64 `json:"sender_chat_id"`
}
@@ -214,7 +282,10 @@ func (api *API) BanChatSenderChatWithContext(ctx context.Context, params BanChat
// Since: Bot API 5.6
// See https://core.telegram.org/bots/api#unbanchatsenderchat
type UnbanChatSenderChat struct {
ChatID int64 `json:"chat_id"`
// ChatID Required. Unique identifier for the target chat or username of the target channel in the format
// @username
ChatID int64 `json:"chat_id"`
// SenderChatID Required. Unique identifier of the target sender chat
SenderChatID int64 `json:"sender_chat_id"`
}
@@ -240,9 +311,17 @@ func (api *API) UnbanChatSenderChatWithContext(ctx context.Context, params Unban
// Since: Bot API 4.4
// See https://core.telegram.org/bots/api#setchatpermissions
type SetChatPermissions struct {
ChatID int64 `json:"chat_id"`
Permissions ChatPermissions `json:"permissions"`
UseIndependentChatPermissions bool `json:"use_independent_chat_permissions,omitempty"`
// ChatID Required. Unique identifier for the target chat or username of the target supergroup in the format
// @username
ChatID int64 `json:"chat_id"`
// Permissions Required. A JSON-serialized object for new default chat permissions
Permissions ChatPermissions `json:"permissions"`
// UseIndependentChatPermissions Optional. Pass True if chat permissions are set independently. Otherwise,
// the can_send_other_messages and can_add_web_page_previews permissions will imply the can_send_messages,
// can_send_audios, can_send_documents, can_send_photos, can_send_videos, can_send_video_notes, and
// can_send_voice_notes permissions; the can_send_polls permission will imply the can_send_messages
// permission.
UseIndependentChatPermissions bool `json:"use_independent_chat_permissions,omitempty"`
}
// SetChatPermissions sets default chat permissions for all members.
@@ -267,6 +346,8 @@ func (api *API) SetChatPermissionsWithContext(ctx context.Context, params SetCha
// Since: Bot API 3.1
// See https://core.telegram.org/bots/api#exportchatinvitelink
type ExportChatInviteLink struct {
// ChatID Required. Unique identifier for the target chat or username of the target channel in the format
// @username
ChatID int64 `json:"chat_id"`
}
@@ -292,11 +373,19 @@ func (api *API) ExportChatInviteLinkWithContext(ctx context.Context, params Expo
// Since: Bot API 5.1
// See https://core.telegram.org/bots/api#createchatinvitelink
type CreateChatInviteLink struct {
ChatID int64 `json:"chat_id"`
Name *string `json:"name,omitempty"`
ExpireDate int `json:"expire_date,omitempty"`
MemberLimit int `json:"member_limit,omitempty"`
CreatesJoinRequest bool `json:"creates_join_request,omitempty"`
// ChatID Required. Unique identifier for the target chat or username of the target channel in the format
// @username
ChatID int64 `json:"chat_id"`
// Name Optional. Invite link name; 0-32 characters
Name *string `json:"name,omitempty"`
// ExpireDate Optional. Point in time (Unix timestamp) when the link will expire
ExpireDate int `json:"expire_date,omitempty"`
// MemberLimit Optional. The maximum number of users that can be members of the chat simultaneously after
// joining the chat via this invite link; 1-99999
MemberLimit int `json:"member_limit,omitempty"`
// CreatesJoinRequest Optional. True, if users joining the chat via the link need to be approved by chat
// administrators. If True, member_limit can't be specified.
CreatesJoinRequest bool `json:"creates_join_request,omitempty"`
}
// CreateChatInviteLink creates an additional invite link for a chat.
@@ -321,13 +410,22 @@ func (api *API) CreateChatInviteLinkWithContext(ctx context.Context, params Crea
// Since: Bot API 5.1
// See https://core.telegram.org/bots/api#editchatinvitelink
type EditChatInviteLink struct {
ChatID int64 `json:"chat_id"`
// ChatID Required. Unique identifier for the target chat or username of the target channel in the format
// @username
ChatID int64 `json:"chat_id"`
// InviteLink Required. The invite link to edit
InviteLink string `json:"invite_link"`
Name string `json:"name,omitempty"`
ExpireDate int `json:"expire_date,omitempty"`
MemberLimit int `json:"member_limit,omitempty"`
CreatesJoinRequest bool `json:"creates_join_request,omitempty"`
// Name Optional. Invite link name; 0-32 characters
Name string `json:"name,omitempty"`
// ExpireDate Optional. Point in time (Unix timestamp) when the link will expire
ExpireDate int `json:"expire_date,omitempty"`
// MemberLimit Optional. The maximum number of users that can be members of the chat simultaneously after
// joining the chat via this invite link; 1-99999
MemberLimit int `json:"member_limit,omitempty"`
// CreatesJoinRequest Optional. True, if users joining the chat via the link need to be approved by chat
// administrators. If True, member_limit can't be specified.
CreatesJoinRequest bool `json:"creates_join_request,omitempty"`
}
// EditChatInviteLink edits a nonprimary invite link.
@@ -352,10 +450,17 @@ func (api *API) EditChatInviteLinkWithContext(ctx context.Context, params EditCh
// Since: Bot API 8.0
// See https://core.telegram.org/bots/api#createchatsubscriptioninvitelink
type CreateChatSubscriptionInviteLink struct {
ChatID int64 `json:"chat_id"`
Name string `json:"name,omitempty"`
SubscriptionPeriod int `json:"subscription_period,omitempty"`
SubscriptionPrice int `json:"subscription_price,omitempty"`
// ChatID Required. Unique identifier for the target channel chat or username of the target channel in the
// format @username
ChatID int64 `json:"chat_id"`
// Name Optional. Invite link name; 0-32 characters
Name string `json:"name,omitempty"`
// SubscriptionPeriod Required. The number of seconds the subscription will be active for before the next
// payment. Currently, it must always be 2592000 (30 days).
SubscriptionPeriod int `json:"subscription_period,omitempty"`
// SubscriptionPrice Required. The amount of Telegram Stars a user must pay initially and after each
// subsequent subscription period to be a member of the chat; 1-10000
SubscriptionPrice int `json:"subscription_price,omitempty"`
}
// CreateChatSubscriptionInviteLink creates a subscription invite link for a channel chat.
@@ -380,9 +485,13 @@ func (api *API) CreateChatSubscriptionInviteLinkWithContext(ctx context.Context,
// Since: Bot API 8.0
// See https://core.telegram.org/bots/api#editchatsubscriptioninvitelink
type EditChatSubscriptionInviteLink struct {
ChatID int64 `json:"chat_id"`
// ChatID Required. Unique identifier for the target chat or username of the target channel in the format
// @username
ChatID int64 `json:"chat_id"`
// InviteLink Required. The invite link to edit
InviteLink string `json:"invite_link"`
Name string `json:"name,omitempty"`
// Name Optional. Invite link name; 0-32 characters
Name string `json:"name,omitempty"`
}
// EditChatSubscriptionInviteLink edits a subscription invite link.
@@ -407,7 +516,10 @@ func (api *API) EditChatSubscriptionInviteLinkWithContext(ctx context.Context, p
// Since: Bot API 5.1
// See https://core.telegram.org/bots/api#revokechatinvitelink
type RevokeChatInviteLink struct {
ChatID int64 `json:"chat_id"`
// ChatID Required. Unique identifier of the target chat or username of the target channel in the format
// @username
ChatID int64 `json:"chat_id"`
// InviteLink Required. The invite link to revoke
InviteLink string `json:"invite_link"`
}
@@ -433,7 +545,10 @@ func (api *API) RevokeChatInviteLinkWithContext(ctx context.Context, params Revo
// Since: Bot API 5.4
// See https://core.telegram.org/bots/api#approvechatjoinrequest
type ApproveChatJoinRequest struct {
// ChatID Required. Unique identifier for the target chat or username of the target channel in the format
// @username
ChatID int64 `json:"chat_id"`
// UserID Required. Unique identifier of the target user
UserID int64 `json:"user_id"`
}
@@ -459,7 +574,10 @@ func (api *API) ApproveChatJoinRequestWithContext(ctx context.Context, params Ap
// Since: Bot API 5.4
// See https://core.telegram.org/bots/api#declinechatjoinrequest
type DeclineChatJoinRequest struct {
// ChatID Required. Unique identifier for the target chat or username of the target channel in the format
// @username
ChatID int64 `json:"chat_id"`
// UserID Required. Unique identifier of the target user
UserID int64 `json:"user_id"`
}
@@ -556,6 +674,8 @@ func (api *API) SendChatJoinRequestWebAppWithContext(ctx context.Context, params
// Since: Bot API 3.1
// See https://core.telegram.org/bots/api#setchatphoto
type SetChatPhoto struct {
// ChatID Required. Unique identifier for the target chat or username of the target channel in the format
// @username
ChatID int64 `json:"chat_id"`
}
@@ -565,18 +685,29 @@ type SetChatPhoto struct {
// Returns True on success.
// See https://core.telegram.org/bots/api#setchatphoto
func (api *API) SetChatPhoto(params SetChatPhoto, photo UploaderFile) (bool, error) {
return api.SetChatPhotoWithContext(context.Background(), params, photo)
}
// SetChatPhotoWithContext changes the chat photo using ctx for cancellation and deadlines.
// Since: Bot API 3.1
// photo is the file to upload as the new photo.
// Returns True on success.
// See https://core.telegram.org/bots/api#setchatphoto
func (api *API) SetChatPhotoWithContext(ctx context.Context, params SetChatPhoto, photo UploaderFile) (bool, error) {
uploader := NewUploader(api)
defer func() {
_ = uploader.Close()
}()
req := NewUploaderRequestWithChatID[bool]("setChatPhoto", params, params.ChatID, photo.SetType(UploaderPhotoType))
return req.Do(uploader)
return req.DoWithContext(ctx, uploader)
}
// DeleteChatPhoto holds parameters for the deleteChatPhoto method.
// Since: Bot API 3.1
// See https://core.telegram.org/bots/api#deletechatphoto
type DeleteChatPhoto struct {
// ChatID Required. Unique identifier for the target chat or username of the target channel in the format
// @username
ChatID int64 `json:"chat_id"`
}
@@ -602,8 +733,11 @@ func (api *API) DeleteChatPhotoWithContext(ctx context.Context, params DeleteCha
// Since: Bot API 3.1
// See https://core.telegram.org/bots/api#setchattitle
type SetChatTitle struct {
ChatID int64 `json:"chat_id"`
Title string `json:"title"`
// ChatID Required. Unique identifier for the target chat or username of the target channel in the format
// @username
ChatID int64 `json:"chat_id"`
// Title Required. New chat title, 1-128 characters
Title string `json:"title"`
}
// SetChatTitle changes the chat title.
@@ -628,7 +762,10 @@ func (api *API) SetChatTitleWithContext(ctx context.Context, params SetChatTitle
// Since: Bot API 3.1
// See https://core.telegram.org/bots/api#setchatdescription
type SetChatDescription struct {
ChatID int64 `json:"chat_id"`
// ChatID Required. Unique identifier for the target chat or username of the target channel in the format
// @username
ChatID int64 `json:"chat_id"`
// Description Optional. New chat description, 0-255 characters
Description string `json:"description"`
}
@@ -654,10 +791,17 @@ func (api *API) SetChatDescriptionWithContext(ctx context.Context, params SetCha
// Since: Bot API 3.1
// See https://core.telegram.org/bots/api#pinchatmessage
type PinChatMessage struct {
// BusinessConnectionID Optional. Unique identifier of the business connection on behalf of which the
// message will be pinned
BusinessConnectionID *string `json:"business_connection_id,omitempty"`
ChatID int64 `json:"chat_id"`
MessageID int `json:"message_id"`
DisableNotification bool `json:"disable_notification,omitempty"`
// ChatID Required. Unique identifier for the target chat or username of the target channel in the format
// @username
ChatID int64 `json:"chat_id"`
// MessageID Required. Identifier of a message to pin
MessageID int `json:"message_id"`
// DisableNotification Optional. Pass True if it is not necessary to send a notification to all chat members
// about the new pinned message. Notifications are always disabled in channels and private chats.
DisableNotification bool `json:"disable_notification,omitempty"`
}
// PinChatMessage pins a message in a chat.
@@ -682,9 +826,15 @@ func (api *API) PinChatMessageWithContext(ctx context.Context, params PinChatMes
// Since: Bot API 3.1
// See https://core.telegram.org/bots/api#unpinchatmessage
type UnpinChatMessage struct {
// BusinessConnectionID Optional. Unique identifier of the business connection on behalf of which the
// message will be unpinned
BusinessConnectionID *string `json:"business_connection_id,omitempty"`
ChatID int64 `json:"chat_id"`
MessageID int `json:"message_id"`
// ChatID Required. Unique identifier for the target chat or username of the target channel in the format
// @username
ChatID int64 `json:"chat_id"`
// MessageID Optional. Identifier of the message to unpin. Required if business_connection_id is specified.
// If not specified, the most recent pinned message (by sending date) will be unpinned.
MessageID int `json:"message_id"`
}
// UnpinChatMessage unpins a message in a chat.
@@ -709,6 +859,8 @@ func (api *API) UnpinChatMessageWithContext(ctx context.Context, params UnpinCha
// Since: Bot API 5.0
// See https://core.telegram.org/bots/api#unpinallchatmessages
type UnpinAllChatMessages struct {
// ChatID Required. Unique identifier for the target chat or username of the target channel in the format
// @username
ChatID int64 `json:"chat_id"`
}
@@ -734,6 +886,9 @@ func (api *API) UnpinAllChatMessagesWithContext(ctx context.Context, params Unpi
// Since: Bot API 2.1
// See https://core.telegram.org/bots/api#leavechat
type LeaveChat struct {
// ChatID Required. Unique identifier for the target chat or username of the target supergroup or channel in
// the format @username. Channel direct messages chats aren't supported; leave the corresponding channel
// instead.
ChatID int64 `json:"chat_id"`
}
@@ -759,6 +914,8 @@ func (api *API) LeaveChatWithContext(ctx context.Context, params LeaveChat) (boo
// Since: Bot API 2.1
// See https://core.telegram.org/bots/api#getchat
type GetChat struct {
// ChatID Required. Unique identifier for the target chat or username of the target supergroup or channel in
// the format @username
ChatID int64 `json:"chat_id"`
}
@@ -783,8 +940,12 @@ func (api *API) GetChatWithContext(ctx context.Context, params GetChat) (ChatFul
// Since: Bot API 2.1
// See https://core.telegram.org/bots/api#getchatadministrators
type GetChatAdministrators struct {
ChatID int64 `json:"chat_id"`
ReturnBots bool `json:"return_bots,omitempty"` // Since: Bot API 10.0
// ChatID Required. Unique identifier for the target chat or username of the target supergroup or channel in
// the format @username
ChatID int64 `json:"chat_id"`
// ReturnBots Optional. Pass True to additionally receive all bots that are administrators of the chat. By
// default, bots other than the current bot are omitted.
ReturnBots bool `json:"return_bots,omitempty"` // Since: Bot API 10.0
}
// GetChatAdministrators returns a list of administrators in a chat.
@@ -808,6 +969,8 @@ func (api *API) GetChatAdministratorsWithContext(ctx context.Context, params Get
// Since: Bot API 2.1
// See https://core.telegram.org/bots/api#getchatmembercount
type GetChatMemberCount struct {
// ChatID Required. Unique identifier for the target chat or username of the target supergroup or channel in
// the format @username
ChatID int64 `json:"chat_id"`
}
@@ -832,7 +995,10 @@ func (api *API) GetChatMemberCountWithContext(ctx context.Context, params GetCha
// Since: Bot API 2.1
// See https://core.telegram.org/bots/api#getchatmember
type GetChatMember struct {
// ChatID Required. Unique identifier for the target chat or username of the target supergroup or channel in
// the format @username
ChatID int64 `json:"chat_id"`
// UserID Required. Unique identifier of the target user
UserID int64 `json:"user_id"`
}
@@ -857,7 +1023,10 @@ func (api *API) GetChatMemberWithContext(ctx context.Context, params GetChatMemb
// Since: Bot API 3.2
// See https://core.telegram.org/bots/api#setchatstickerset
type SetChatStickerSet struct {
ChatID int64 `json:"chat_id"`
// ChatID Required. Unique identifier for the target chat or username of the target supergroup in the format
// @username
ChatID int64 `json:"chat_id"`
// StickerSetName Required. Name of the sticker set to be set as the group sticker set
StickerSetName string `json:"sticker_set_name"`
}
@@ -883,6 +1052,8 @@ func (api *API) SetChatStickerSetWithContext(ctx context.Context, params SetChat
// Since: Bot API 3.2
// See https://core.telegram.org/bots/api#deletechatstickerset
type DeleteChatStickerSet struct {
// ChatID Required. Unique identifier for the target chat or username of the target supergroup in the format
// @username
ChatID int64 `json:"chat_id"`
}
@@ -908,7 +1079,9 @@ func (api *API) DeleteChatStickerSetWithContext(ctx context.Context, params Dele
// Since: Bot API 7.0
// See https://core.telegram.org/bots/api#getuserchatboosts
type GetUserChatBoosts struct {
// ChatID Required. Unique identifier for the chat or username of the channel in the format @username
ChatID int64 `json:"chat_id"`
// UserID Required. Unique identifier of the target user
UserID int64 `json:"user_id"`
}
@@ -933,17 +1106,36 @@ func (api *API) GetUserChatBoostsWithContext(ctx context.Context, params GetUser
// Since: Bot API 9.3
// See https://core.telegram.org/bots/api#getchatgifts
type GetChatGifts struct {
ChatID int64 `json:"chat_id"`
ExcludeUnsaved bool `json:"exclude_unsaved,omitempty"`
ExcludeSaved bool `json:"exclude_saved,omitempty"`
ExcludeUnlimited bool `json:"exclude_unlimited,omitempty"`
ExcludeLimitedUpgradable bool `json:"exclude_limited_upgradable,omitempty"`
ExcludeLimitedNonUpgradable bool `json:"exclude_limited_non_upgradable,omitempty"`
ExcludeUnique bool `json:"exclude_unique,omitempty"`
ExcludeFromBlockchain bool `json:"exclude_from_blockchain,omitempty"`
SortByPrice bool `json:"sort_by_price,omitempty"`
Offset string `json:"offset,omitempty"`
Limit int `json:"limit,omitempty"`
// ChatID Required. Unique identifier for the target chat or username of the target channel in the format
// @username
ChatID int64 `json:"chat_id"`
// ExcludeUnsaved Optional. Pass True to exclude gifts that aren't saved to the chat's profile page. Always
// True, unless the bot has the can_post_messages administrator right in the channel.
ExcludeUnsaved bool `json:"exclude_unsaved,omitempty"`
// ExcludeSaved Optional. Pass True to exclude gifts that are saved to the chat's profile page. Always
// False, unless the bot has the can_post_messages administrator right in the channel.
ExcludeSaved bool `json:"exclude_saved,omitempty"`
// ExcludeUnlimited Optional. Pass True to exclude gifts that can be purchased an unlimited number of times
ExcludeUnlimited bool `json:"exclude_unlimited,omitempty"`
// ExcludeLimitedUpgradable Optional. Pass True to exclude gifts that can be purchased a limited number of
// times and can be upgraded to unique
ExcludeLimitedUpgradable bool `json:"exclude_limited_upgradable,omitempty"`
// ExcludeLimitedNonUpgradable Optional. Pass True to exclude gifts that can be purchased a limited number
// of times and can't be upgraded to unique
ExcludeLimitedNonUpgradable bool `json:"exclude_limited_non_upgradable,omitempty"`
// ExcludeUnique Optional. Pass True to exclude unique gifts
ExcludeUnique bool `json:"exclude_unique,omitempty"`
// ExcludeFromBlockchain Optional. Pass True to exclude gifts that were assigned from the TON blockchain and
// can't be resold or transferred in Telegram
ExcludeFromBlockchain bool `json:"exclude_from_blockchain,omitempty"`
// SortByPrice Optional. Pass True to sort results by gift price instead of send date. Sorting is applied
// before pagination.
SortByPrice bool `json:"sort_by_price,omitempty"`
// Offset Optional. Offset of the first entry to return as received from the previous request; use an empty
// string to get the first chunk of results
Offset string `json:"offset,omitempty"`
// Limit Optional. The maximum number of gifts to be returned; 1-100. Defaults to 100.
Limit int `json:"limit,omitempty"`
}
// GetChatGifts returns gifts owned by a chat.
+379 -141
View File
@@ -4,14 +4,25 @@ package tgapi
// Since: Bot API 1.0
// See https://core.telegram.org/bots/api#chat
type Chat struct {
ID int64 `json:"id"`
Type ChatType `json:"type"`
Title *string `json:"title,omitempty"`
Username *string `json:"username,omitempty"`
FirstName *string `json:"first_name,omitempty"`
LastName *string `json:"last_name,omitempty"`
IsForum *bool `json:"is_forum,omitempty"` // Since: Bot API 6.3
IsDirectMessages *bool `json:"is_direct_messages,omitempty"` // Since: Bot API 9.2
// ID Unique identifier for this chat. This number may have more than 32 significant bits and some
// programming languages may have difficulty/silent defects in interpreting it. But it has at most 52
// significant bits, so a signed 64-bit integer or double-precision float type are safe for storing this
// identifier.
ID int64 `json:"id"`
// Type Type of the chat, can be either “private”, “group”, “supergroup” or “channel”
Type ChatType `json:"type"`
// Title Optional. Title, for supergroups, channels and group chats
Title *string `json:"title,omitempty"`
// Username Optional. Username, for private chats, supergroups and channels if available
Username *string `json:"username,omitempty"`
// FirstName Optional. First name of the other party in a private chat
FirstName *string `json:"first_name,omitempty"`
// LastName Optional. Last name of the other party in a private chat
LastName *string `json:"last_name,omitempty"`
// IsForum Optional. True, if the supergroup chat is a forum (has topics enabled)
IsForum *bool `json:"is_forum,omitempty"` // Since: Bot API 6.3
// IsDirectMessages Optional. True, if the chat is the direct messages chat of a channel
IsDirectMessages *bool `json:"is_direct_messages,omitempty"` // Since: Bot API 9.2
}
// ChatType represents the type of a chat.
@@ -32,65 +43,146 @@ const (
// Since: Bot API 7.5
// See https://core.telegram.org/bots/api#chatfullinfo
type ChatFullInfo struct {
ID int64 `json:"id"`
Type ChatType `json:"type"`
Title string `json:"title"`
Username string `json:"username"`
FirstName string `json:"first_name"`
LastName string `json:"last_name"`
IsForum bool `json:"is_forum"`
IsDirectMessages bool `json:"is_direct_messages"`
AccentColorID int `json:"accent_color_id"`
MaxReactionCount int `json:"max_reaction_count"`
Photo *ChatPhoto `json:"photo,omitempty"`
ActiveUsernames []string `json:"active_usernames,omitempty"`
Birthdate *Birthdate `json:"birthdate,omitempty"`
// ID Unique identifier for this chat. This number may have more than 32 significant bits and some
// programming languages may have difficulty/silent defects in interpreting it. But it has at most 52
// significant bits, so a signed 64-bit integer or double-precision float type are safe for storing this
// identifier.
ID int64 `json:"id"`
// Type Type of the chat, can be either “private”, “group”, “supergroup” or “channel”
Type ChatType `json:"type"`
// Title Optional. Title, for supergroups, channels and group chats
Title string `json:"title"`
// Username Optional. Username, for private chats, supergroups and channels if available
Username string `json:"username"`
// FirstName Optional. First name of the other party in a private chat
FirstName string `json:"first_name"`
// LastName Optional. Last name of the other party in a private chat
LastName string `json:"last_name"`
// IsForum Optional. True, if the supergroup chat is a forum (has topics enabled)
IsForum bool `json:"is_forum"`
// IsDirectMessages Optional. True, if the chat is the direct messages chat of a channel
IsDirectMessages bool `json:"is_direct_messages"`
// AccentColorID Identifier of the accent color for the chat name and backgrounds of the chat photo, reply
// header, and link preview. See accent colors for more details.
AccentColorID int `json:"accent_color_id"`
// MaxReactionCount The maximum number of reactions that can be set on a message in the chat
MaxReactionCount int `json:"max_reaction_count"`
// Photo Optional. Chat photo
Photo *ChatPhoto `json:"photo,omitempty"`
// ActiveUsernames Optional. If non-empty, the list of all active chat usernames; for private chats,
// supergroups and channels
ActiveUsernames []string `json:"active_usernames,omitempty"`
// Birthdate Optional. For private chats, the date of birth of the user
Birthdate *Birthdate `json:"birthdate,omitempty"`
BusinessIntro *BusinessIntro `json:"business_intro,omitempty"`
BusinessLocation *BusinessLocation `json:"business_location,omitempty"`
// BusinessIntro Optional. For private chats with business accounts, the intro of the business
BusinessIntro *BusinessIntro `json:"business_intro,omitempty"`
// BusinessLocation Optional. For private chats with business accounts, the location of the business
BusinessLocation *BusinessLocation `json:"business_location,omitempty"`
// BusinessOpeningHours Optional. For private chats with business accounts, the opening hours of the
// business
BusinessOpeningHours *BusinessOpeningHours `json:"business_opening_hours,omitempty"`
// PersonalChat Optional. For private chats, the personal channel of the user
PersonalChat *Chat `json:"personal_chat,omitempty"`
ParentChat *Chat `json:"parent_chat,omitempty"` // Since: Bot API 9.2
// ParentChat Optional. Information about the corresponding channel chat; for direct messages chats only
ParentChat *Chat `json:"parent_chat,omitempty"` // Since: Bot API 9.2
AvailableReaction []ReactionType `json:"available_reaction,omitempty"`
// AvailableReaction Optional. List of available reactions allowed in the chat. If omitted, then all emoji
// reactions are allowed.
// Subject to change in v2: the Go field name may be pluralized to AvailableReactions.
AvailableReaction []ReactionType `json:"available_reactions,omitempty"`
BackgroundCustomEmojiID *string `json:"background_custom_emoji_id,omitempty"`
ProfileAccentColorID *int `json:"profile_accent_color_id,omitempty"`
// BackgroundCustomEmojiID Optional. Custom emoji identifier of the emoji chosen by the chat for the reply
// header and link preview background
BackgroundCustomEmojiID *string `json:"background_custom_emoji_id,omitempty"`
// ProfileAccentColorID Optional. Identifier of the accent color for the chat's profile background. See
// profile accent colors for more details.
ProfileAccentColorID *int `json:"profile_accent_color_id,omitempty"`
// ProfileBackgroundCustomEmojiID Optional. Custom emoji identifier of the emoji chosen by the chat for its
// profile background
ProfileBackgroundCustomEmojiID *string `json:"profile_background_custom_emoji_id,omitempty"`
EmojiStatusCustomEmojiID *string `json:"emoji_status_custom_emoji_id,omitempty"`
EmojiStatusExpirationDate *int `json:"emoji_status_expiration_date,omitempty"`
// EmojiStatusCustomEmojiID Optional. Custom emoji identifier of the emoji status of the chat or the other
// party in a private chat
EmojiStatusCustomEmojiID *string `json:"emoji_status_custom_emoji_id,omitempty"`
// EmojiStatusExpirationDate Optional. Expiration date of the emoji status of the chat or the other party in
// a private chat, in Unix time, if any
EmojiStatusExpirationDate *int `json:"emoji_status_expiration_date,omitempty"`
Bio *string `json:"bio,omitempty"`
HasPrivateForwards *bool `json:"has_private_forwards,omitempty"`
HasRestrictedVoiceAndVideoMessages *bool `json:"has_restricted_voice_and_video_messages,omitempty"`
JoinToSendMessages *bool `json:"join_to_send_messages,omitempty"`
JoinByRequest *bool `json:"join_by_request,omitempty"`
// Bio Optional. Bio of the other party in a private chat
Bio *string `json:"bio,omitempty"`
// HasPrivateForwards Optional. True, if privacy settings of the other party in the private chat allows to
// use tg://user?id=<user_id> links only in chats with the user
HasPrivateForwards *bool `json:"has_private_forwards,omitempty"`
// HasRestrictedVoiceAndVideoMessages Optional. True, if the privacy settings of the other party restrict
// sending voice and video note messages in the private chat
HasRestrictedVoiceAndVideoMessages *bool `json:"has_restricted_voice_and_video_messages,omitempty"`
// JoinToSendMessages Optional. True, if users need to join the supergroup before they can send messages
JoinToSendMessages *bool `json:"join_to_send_messages,omitempty"`
// JoinByRequest Optional. True, if all users directly joining the supergroup without using an invite link
// need to be approved by supergroup administrators
JoinByRequest *bool `json:"join_by_request,omitempty"`
Description *string `json:"description,omitempty"`
InviteLink *string `json:"invite_link,omitempty"`
PinnedMessage *Message `json:"pinned_message,omitempty"`
Permissions *ChatPermissions `json:"permissions,omitempty"`
// Description Optional. Description, for groups, supergroups and channel chats
Description *string `json:"description,omitempty"`
// InviteLink Optional. Primary invite link, for groups, supergroups and channel chats
InviteLink *string `json:"invite_link,omitempty"`
// PinnedMessage Optional. The most recent pinned message (by sending date)
PinnedMessage *Message `json:"pinned_message,omitempty"`
// Permissions Optional. Default chat member permissions, for groups and supergroups
Permissions *ChatPermissions `json:"permissions,omitempty"`
// AcceptedGiftTypes Information about types of gifts that are accepted by the chat or by the corresponding
// user for private chats
AcceptedGiftTypes *AcceptedGiftTypes `json:"accepted_gift_types,omitempty"`
CanSendPaidMedia *bool `json:"can_send_paid_media,omitempty"`
SlowModeDelay *int `json:"slow_mode_delay,omitempty"`
UnrestrictedBoostCount *int `json:"unrestricted_boost_count,omitempty"`
MessageAutoDeleteTime *int `json:"message_auto_delete_time,omitempty"`
HasAggressiveAntiSpamEnabled *bool `json:"has_aggressive_anti_spam_enabled,omitempty"`
HasHiddenMembers *bool `json:"has_hidden_members,omitempty"`
HasProtectedContent *bool `json:"has_protected_content,omitempty"`
HasVisibleHistory *bool `json:"has_visible_history,omitempty"`
StickerSetName *string `json:"sticker_set_name,omitempty"`
CanSetStickerSet *bool `json:"can_set_sticker_set,omitempty"`
CustomEmojiStickerSetName *string `json:"custom_emoji_sticker_set_name,omitempty"`
LinkedChatID *int64 `json:"linked_chat_id,omitempty"`
// CanSendPaidMedia Optional. True, if paid media messages can be sent or forwarded to the channel chat. The
// field is available only for channel chats.
CanSendPaidMedia *bool `json:"can_send_paid_media,omitempty"`
// SlowModeDelay Optional. For supergroups, the minimum allowed delay between consecutive messages sent by
// each unprivileged user; in seconds
SlowModeDelay *int `json:"slow_mode_delay,omitempty"`
// UnrestrictedBoostCount is the number of unrestricted boosts available to the chat.
UnrestrictedBoostCount *int `json:"unrestricted_boost_count,omitempty"`
// MessageAutoDeleteTime Optional. The time after which all messages sent to the chat will be automatically
// deleted; in seconds
MessageAutoDeleteTime *int `json:"message_auto_delete_time,omitempty"`
// HasAggressiveAntiSpamEnabled Optional. True, if aggressive anti-spam checks are enabled in the
// supergroup. The field is only available to chat administrators.
HasAggressiveAntiSpamEnabled *bool `json:"has_aggressive_anti_spam_enabled,omitempty"`
// HasHiddenMembers Optional. True, if non-administrators can only get the list of bots and administrators
// in the chat
HasHiddenMembers *bool `json:"has_hidden_members,omitempty"`
// HasProtectedContent Optional. True, if messages from the chat can't be forwarded to other chats
HasProtectedContent *bool `json:"has_protected_content,omitempty"`
// HasVisibleHistory Optional. True, if new chat members will have access to old messages; available only to
// chat administrators
HasVisibleHistory *bool `json:"has_visible_history,omitempty"`
// StickerSetName Optional. For supergroups, name of the group sticker set
StickerSetName *string `json:"sticker_set_name,omitempty"`
// CanSetStickerSet Optional. True, if the bot can change the group sticker set
CanSetStickerSet *bool `json:"can_set_sticker_set,omitempty"`
// CustomEmojiStickerSetName Optional. For supergroups, the name of the group's custom emoji sticker set.
// Custom emoji from this set can be used by all users and bots in the group.
CustomEmojiStickerSetName *string `json:"custom_emoji_sticker_set_name,omitempty"`
// LinkedChatID Optional. Unique identifier for the linked chat, i.e. the discussion group identifier for a
// channel and vice versa; for supergroups and channel chats. This identifier may be greater than 32 bits
// and some programming languages may have difficulty/silent defects in interpreting it. But it is smaller
// than 52 bits, so a signed 64 bit integer or double-precision float type are safe for storing this
// identifier.
LinkedChatID *int64 `json:"linked_chat_id,omitempty"`
Location *ChatLocation `json:"location,omitempty"`
Rating *UserRating `json:"rating,omitempty"`
FirstProfileAudio *Audio `json:"first_profile_audio,omitempty"` // Since: Bot API 9.4
UniqueGiftColors *UniqueGiftColors `json:"unique_gift_colors,omitempty"` // Since: Bot API 9.3
PaidMessageStarCount *int `json:"paid_message_star_count,omitempty"` // Since: Bot API 9.3
// Location Optional. For supergroups, the location to which the supergroup is connected
Location *ChatLocation `json:"location,omitempty"`
// Rating Optional. For private chats, the rating of the user if any
Rating *UserRating `json:"rating,omitempty"`
// FirstProfileAudio Optional. For private chats, the first audio added to the profile of the user
FirstProfileAudio *Audio `json:"first_profile_audio,omitempty"` // Since: Bot API 9.4
// UniqueGiftColors Optional. The color scheme based on a unique gift that must be used for the chat's name,
// message replies and link previews
UniqueGiftColors *UniqueGiftColors `json:"unique_gift_colors,omitempty"` // Since: Bot API 9.3
// PaidMessageStarCount Optional. The number of Telegram Stars a general user has to pay to send a message
// to the chat
PaidMessageStarCount *int `json:"paid_message_star_count,omitempty"` // Since: Bot API 9.3
// GuardBot contains the guard bot visible to chat administrators.
GuardBot *User `json:"guard_bot,omitempty"` // Since: Bot API 10.1; visible to chat administrators only
// Community contains information about the affected community.
@@ -101,58 +193,105 @@ type ChatFullInfo struct {
// Since: Bot API 3.1
// See https://core.telegram.org/bots/api#chatphoto
type ChatPhoto struct {
SmallFileID string `json:"small_file_id"`
// SmallFileID File identifier of small (160x160) chat photo. This file_id can be used only for photo
// download and only for as long as the photo is not changed.
SmallFileID string `json:"small_file_id"`
// SmallFileUniqueID Unique file identifier of small (160x160) chat photo, which is supposed to be the same
// over time and for different bots. Can't be used to download or reuse the file.
SmallFileUniqueID string `json:"small_file_unique_id"`
BigFileID string `json:"big_file_id"`
BigFileUniqueID string `json:"big_file_unique_id"`
// BigFileID File identifier of big (640x640) chat photo. This file_id can be used only for photo download
// and only for as long as the photo is not changed.
BigFileID string `json:"big_file_id"`
// BigFileUniqueID Unique file identifier of big (640x640) chat photo, which is supposed to be the same over
// time and for different bots. Can't be used to download or reuse the file.
BigFileUniqueID string `json:"big_file_unique_id"`
}
// ChatPermissions describes actions that a nonadministrator user is allowed to take in a chat.
// Since: Bot API 4.4
// See https://core.telegram.org/bots/api#chatpermissions
type ChatPermissions struct {
CanSendMessages bool `json:"can_send_messages"`
CanSendAudios bool `json:"can_send_audios"` // Since: Bot API 6.5
CanSendDocuments bool `json:"can_send_documents"` // Since: Bot API 6.5
CanSendPhotos bool `json:"can_send_photos"` // Since: Bot API 6.5
CanSendVideos bool `json:"can_send_videos"` // Since: Bot API 6.5
CanSendVideoNotes bool `json:"can_send_video_notes"` // Since: Bot API 6.5
CanSendVoiceNotes bool `json:"can_send_voice_notes"` // Since: Bot API 6.5
CanSendPolls bool `json:"can_send_polls"`
// CanSendMessages Optional. True, if the user is allowed to send text messages, rich messages, contacts,
// giveaways, giveaway winners, invoices, locations and venues
CanSendMessages bool `json:"can_send_messages"`
// CanSendAudios Optional. True, if the user is allowed to send audios
CanSendAudios bool `json:"can_send_audios"` // Since: Bot API 6.5
// CanSendDocuments Optional. True, if the user is allowed to send documents
CanSendDocuments bool `json:"can_send_documents"` // Since: Bot API 6.5
// CanSendPhotos Optional. True, if the user is allowed to send photos
CanSendPhotos bool `json:"can_send_photos"` // Since: Bot API 6.5
// CanSendVideos Optional. True, if the user is allowed to send videos
CanSendVideos bool `json:"can_send_videos"` // Since: Bot API 6.5
// CanSendVideoNotes Optional. True, if the user is allowed to send video notes
CanSendVideoNotes bool `json:"can_send_video_notes"` // Since: Bot API 6.5
// CanSendVoiceNotes Optional. True, if the user is allowed to send voice notes
CanSendVoiceNotes bool `json:"can_send_voice_notes"` // Since: Bot API 6.5
// CanSendPolls Optional. True, if the user is allowed to send polls and checklists
CanSendPolls bool `json:"can_send_polls"`
// CanSendOtherMessages Optional. True, if the user is allowed to send animations, games, stickers and use
// inline bots
CanSendOtherMessages bool `json:"can_send_other_messages"`
// CanAddWebPagePreview Optional. True, if the user is allowed to add web page previews to their messages
CanAddWebPagePreview bool `json:"can_add_web_page_previews"`
CanReactToMessages bool `json:"can_react_to_messages"` // Since: Bot API 10.0
CanEditTag bool `json:"can_edit_tag"` // Since: Bot API 9.5
CanChangeInfo bool `json:"can_change_info"`
CanInviteUsers bool `json:"can_invite_users"`
CanPinMessages bool `json:"can_pin_messages"`
CanManageTopics bool `json:"can_manage_topics"` // Since: Bot API 6.3
// CanReactToMessages Optional. True, if the user is allowed to react to messages. If omitted, defaults to
// the value of can_send_messages.
CanReactToMessages bool `json:"can_react_to_messages"` // Since: Bot API 10.0
// CanEditTag Optional. True, if the user is allowed to edit their own tag. If omitted, defaults to the
// value of can_pin_messages.
CanEditTag bool `json:"can_edit_tag"` // Since: Bot API 9.5
// CanChangeInfo Optional. True, if the user is allowed to change the chat title, photo and other settings.
// Ignored in public supergroups.
CanChangeInfo bool `json:"can_change_info"`
// CanInviteUsers Optional. True, if the user is allowed to invite new users to the chat
CanInviteUsers bool `json:"can_invite_users"`
// CanPinMessages Optional. True, if the user is allowed to pin messages. Ignored in public supergroups.
CanPinMessages bool `json:"can_pin_messages"`
// CanManageTopics Optional. True, if the user is allowed to create forum topics. If omitted, defaults to
// the value of can_pin_messages.
CanManageTopics bool `json:"can_manage_topics"` // Since: Bot API 6.3
}
// ChatLocation represents a location to which a chat is connected.
// Since: Bot API 5.0
// See https://core.telegram.org/bots/api#chatlocation
type ChatLocation struct {
// Location The location to which the supergroup is connected. Can't be a live location.
Location Location `json:"location"`
Address string `json:"address"`
// Address Location address; 1-64 characters, as defined by the chat owner
Address string `json:"address"`
}
// ChatInviteLink represents an invite link for a chat.
// Since: Bot API 5.1
// See https://core.telegram.org/bots/api#chatinvitelink
type ChatInviteLink struct {
InviteLink string `json:"invite_link"`
Creator User `json:"creator"`
CreateJoinRequest bool `json:"creates_join_request"`
IsPrimary bool `json:"is_primary"`
IsRevoked bool `json:"is_revoked"`
// InviteLink The invite link. If the link was created by another chat administrator, then the second part
// of the link will be replaced with “…”.
InviteLink string `json:"invite_link"`
// Creator Creator of the link
Creator User `json:"creator"`
// CreateJoinRequest True, if users joining the chat via the link need to be approved by chat administrators
CreateJoinRequest bool `json:"creates_join_request"`
// IsPrimary True, if the link is primary
IsPrimary bool `json:"is_primary"`
// IsRevoked True, if the link is revoked
IsRevoked bool `json:"is_revoked"`
Name *string `json:"name,omitempty"`
ExpireDate *int `json:"expire_date,omitempty"`
MemberLimit *int `json:"member_limit,omitempty"`
PendingJoinRequestCount *int `json:"pending_join_request_count,omitempty"`
SubscriptionPeriod *int `json:"subscription_period,omitempty"`
SubscriptionPrice *int `json:"subscription_price,omitempty"`
// Name Optional. Invite link name
Name *string `json:"name,omitempty"`
// ExpireDate Optional. Point in time (Unix timestamp) when the link will expire or has been expired
ExpireDate *int `json:"expire_date,omitempty"`
// MemberLimit Optional. The maximum number of users that can be members of the chat simultaneously after
// joining the chat via this invite link; 1-99999
MemberLimit *int `json:"member_limit,omitempty"`
// PendingJoinRequestCount Optional. Number of pending join requests created using this link
PendingJoinRequestCount *int `json:"pending_join_request_count,omitempty"`
// SubscriptionPeriod Optional. The number of seconds the subscription will be active for before the next
// payment
SubscriptionPeriod *int `json:"subscription_period,omitempty"`
// SubscriptionPrice Optional. The amount of Telegram Stars a user must pay initially and after each
// subsequent subscription period to be a member of the chat using the link
SubscriptionPrice *int `json:"subscription_price,omitempty"`
}
// ChatMemberStatusType indicates the status of a chat member.
@@ -177,92 +316,154 @@ const (
// Since: Bot API 3.1
// See https://core.telegram.org/bots/api#chatmember
type ChatMember struct {
// Status is the member's current status in the chat.
Status ChatMemberStatusType `json:"status"`
User User `json:"user"`
Tag string `json:"tag,omitempty"` // Since: Bot API 9.5
// User Information about the user
User User `json:"user"`
// Tag Optional. Tag of the member
Tag string `json:"tag,omitempty"` // Since: Bot API 9.5
// IsAnonymous True, if the user's presence in the chat is hidden
// Owner
IsAnonymous *bool `json:"is_anonymous"`
IsAnonymous *bool `json:"is_anonymous"`
// CustomTitle Optional. Custom title for this user
CustomTitle *string `json:"custom_title,omitempty"`
// CanBeEdited True, if the bot is allowed to edit administrator privileges of that user
// Administrator
CanBeEdited *bool `json:"can_be_edited,omitempty"`
CanManageChat *bool `json:"can_manage_chat,omitempty"`
CanDeleteMessages *bool `json:"can_delete_messages,omitempty"`
CanBeEdited *bool `json:"can_be_edited,omitempty"`
// CanManageChat True, if the administrator can access the chat event log, get boost list, see hidden
// supergroup and channel members, report spam messages, ignore slow mode, and send messages to the chat
// without paying Telegram Stars. Implied by any other administrator privilege.
CanManageChat *bool `json:"can_manage_chat,omitempty"`
// CanDeleteMessages True, if the administrator can delete messages of other users
CanDeleteMessages *bool `json:"can_delete_messages,omitempty"`
// CanManageVideoChats True, if the administrator can manage video chats
CanManageVideoChats *bool `json:"can_manage_video_chats,omitempty"`
CanRestrictMembers *bool `json:"can_restrict_members,omitempty"`
CanPromoteMembers *bool `json:"can_promote_members,omitempty"`
CanChangeInfo *bool `json:"can_change_info,omitempty"`
CanInviteUsers *bool `json:"can_invite_users,omitempty"`
CanPostStories *bool `json:"can_post_stories,omitempty"` // Since: Bot API 6.9
CanEditStories *bool `json:"can_edit_stories,omitempty"` // Since: Bot API 6.9
CanDeleteStories *bool `json:"can_delete_stories,omitempty"` // Since: Bot API 6.9
// CanRestrictMembers True, if the administrator can restrict, ban or unban chat members, or access
// supergroup statistics
CanRestrictMembers *bool `json:"can_restrict_members,omitempty"`
// CanPromoteMembers True, if the administrator can add new administrators with a subset of their own
// privileges or demote administrators that they have promoted, directly or indirectly (promoted by
// administrators that were appointed by the user)
CanPromoteMembers *bool `json:"can_promote_members,omitempty"`
// CanChangeInfo True, if the user is allowed to change the chat title, photo and other settings
CanChangeInfo *bool `json:"can_change_info,omitempty"`
// CanInviteUsers True, if the user is allowed to invite new users to the chat
CanInviteUsers *bool `json:"can_invite_users,omitempty"`
// CanPostStories True, if the administrator can post stories to the chat
CanPostStories *bool `json:"can_post_stories,omitempty"` // Since: Bot API 6.9
// CanEditStories True, if the administrator can edit stories posted by other users, post stories to the
// chat page, pin chat stories, and access the chat's story archive
CanEditStories *bool `json:"can_edit_stories,omitempty"` // Since: Bot API 6.9
// CanDeleteStories True, if the administrator can delete stories posted by other users
CanDeleteStories *bool `json:"can_delete_stories,omitempty"` // Since: Bot API 6.9
CanPostMessages *bool `json:"can_post_messages,omitempty"`
CanEditMessages *bool `json:"can_edit_messages,omitempty"`
CanPinMessages *bool `json:"can_pin_messages,omitempty"`
CanManageTopics *bool `json:"can_manage_topics,omitempty"` // Since: Bot API 6.3
// CanPostMessages Optional. True, if the administrator can post messages in the channel, approve suggested
// posts, or access channel statistics; for channels only
CanPostMessages *bool `json:"can_post_messages,omitempty"`
// CanEditMessages Optional. True, if the administrator can edit messages of other users and can pin
// messages; for channels only
CanEditMessages *bool `json:"can_edit_messages,omitempty"`
// CanPinMessages reports whether the member may pin messages.
CanPinMessages *bool `json:"can_pin_messages,omitempty"`
// CanManageTopics reports whether the member may manage forum topics.
CanManageTopics *bool `json:"can_manage_topics,omitempty"` // Since: Bot API 6.3
// CanManageDirectMessages Optional. True, if the administrator can manage direct messages of the channel
// and decline suggested posts; for channels only
CanManageDirectMessages *bool `json:"can_manage_direct_messages,omitempty"` // Since: Bot API 9.1
CanManageTags *bool `json:"can_manage_tags,omitempty"` // Since: Bot API 9.5
// CanManageTags Optional. True, if the administrator can edit the tags of regular members; for groups and
// supergroups only. If omitted, defaults to the value of can_pin_messages.
CanManageTags *bool `json:"can_manage_tags,omitempty"` // Since: Bot API 9.5
// UntilDate is the Unix time when restrictions expire; zero means forever.
// Member
UntilDate *int `json:"until_date,omitempty"`
// IsMember True, if the user is a member of the chat at the moment of the request
// Restricted
IsMember *bool `json:"is_member,omitempty"`
CanSendMessages *bool `json:"can_send_messages,omitempty"`
CanSendAudios *bool `json:"can_send_audios,omitempty"` // Since: Bot API 6.5
CanSendDocuments *bool `json:"can_send_documents,omitempty"` // Since: Bot API 6.5
CanSendPhotos *bool `json:"can_send_photos,omitempty"` // Since: Bot API 6.5
CanSendVideos *bool `json:"can_send_videos,omitempty"` // Since: Bot API 6.5
CanSendVideoNotes *bool `json:"can_send_video_notes,omitempty"` // Since: Bot API 6.5
CanSendVoiceNotes *bool `json:"can_send_voice_notes,omitempty"` // Since: Bot API 6.5
CanSendPolls *bool `json:"can_send_polls,omitempty"`
IsMember *bool `json:"is_member,omitempty"`
// CanSendMessages True, if the user is allowed to send text messages, rich messages, contacts, giveaways,
// giveaway winners, invoices, locations and venues
CanSendMessages *bool `json:"can_send_messages,omitempty"`
// CanSendAudios True, if the user is allowed to send audios
CanSendAudios *bool `json:"can_send_audios,omitempty"` // Since: Bot API 6.5
// CanSendDocuments True, if the user is allowed to send documents
CanSendDocuments *bool `json:"can_send_documents,omitempty"` // Since: Bot API 6.5
// CanSendPhotos True, if the user is allowed to send photos
CanSendPhotos *bool `json:"can_send_photos,omitempty"` // Since: Bot API 6.5
// CanSendVideos True, if the user is allowed to send videos
CanSendVideos *bool `json:"can_send_videos,omitempty"` // Since: Bot API 6.5
// CanSendVideoNotes True, if the user is allowed to send video notes
CanSendVideoNotes *bool `json:"can_send_video_notes,omitempty"` // Since: Bot API 6.5
// CanSendVoiceNotes True, if the user is allowed to send voice notes
CanSendVoiceNotes *bool `json:"can_send_voice_notes,omitempty"` // Since: Bot API 6.5
// CanSendPolls True, if the user is allowed to send polls and checklists
CanSendPolls *bool `json:"can_send_polls,omitempty"`
// CanSendOtherMessages True, if the user is allowed to send animations, games, stickers and use inline bots
CanSendOtherMessages *bool `json:"can_send_other_messages,omitempty"`
// CanAddWebPagePreview True, if the user is allowed to add web page previews to their messages
CanAddWebPagePreview *bool `json:"can_add_web_page_previews,omitempty"`
CanReactToMessages *bool `json:"can_react_to_messages,omitempty"` // Since: Bot API 10.0
CanEditTag *bool `json:"can_edit_tag,omitempty"` // Since: Bot API 9.5
// CanReactToMessages True, if the user is allowed to react to messages
CanReactToMessages *bool `json:"can_react_to_messages,omitempty"` // Since: Bot API 10.0
// CanEditTag True, if the user is allowed to edit their own tag
CanEditTag *bool `json:"can_edit_tag,omitempty"` // Since: Bot API 9.5
}
// ChatBoostSource describes the source of a chat boost.
// Since: Bot API 7.0
// See https://core.telegram.org/bots/api#chatboostsource
type ChatBoostSource struct {
// Source identifies the source variant: premium, gift_code, or giveaway.
Source string `json:"source"`
User User `json:"user"`
// User is the user responsible for the boost when supplied by the source variant.
User User `json:"user"`
// GiveawayMessageID Identifier of a message in the chat with the giveaway; the message could have been
// deleted already. May be 0 if the message isn't sent yet.
// Giveaway
GiveawayMessageID *int `json:"giveaway_message_id,omitempty"`
PrizeStarCount *int `json:"prize_star_count,omitempty"`
IsUnclaimed *bool `json:"is_unclaimed,omitempty"`
GiveawayMessageID *int `json:"giveaway_message_id,omitempty"`
// PrizeStarCount Optional. The number of Telegram Stars to be split between giveaway winners; for Telegram
// Star giveaways only
PrizeStarCount *int `json:"prize_star_count,omitempty"`
// IsUnclaimed Optional. True, if the giveaway was completed, but there was no user to win the prize
IsUnclaimed *bool `json:"is_unclaimed,omitempty"`
}
// ChatBoost represents a boost added to a chat.
// Since: Bot API 7.0
// See https://core.telegram.org/bots/api#chatboost
type ChatBoost struct {
BoostID string `json:"boost_id"`
AddDate int `json:"add_date"`
ExpirationDate int `json:"expiration_date"`
Source ChatBoostSource `json:"source"`
// BoostID Unique identifier of the boost
BoostID string `json:"boost_id"`
// AddDate Point in time (Unix timestamp) when the chat was boosted
AddDate int `json:"add_date"`
// ExpirationDate Point in time (Unix timestamp) when the boost will automatically expire, unless the
// booster's Telegram Premium subscription is prolonged
ExpirationDate int `json:"expiration_date"`
// Source Source of the added boost
Source ChatBoostSource `json:"source"`
}
// UserChatBoosts represents a list of boosts a user has given to a chat.
// Since: Bot API 7.0
// See https://core.telegram.org/bots/api#userchatboosts
type UserChatBoosts struct {
// Boosts The list of boosts added to the chat by the user
Boosts []ChatBoost `json:"boosts"`
}
// ChatBoostAdded describes a service message about a user boosting a chat.
// Since: Bot API 7.1
type ChatBoostAdded struct {
// BoostCount Number of boosts added by the user
BoostCount int `json:"boost_count"`
}
// ChatBackground represents a chat background.
// Since: Bot API 7.5
type ChatBackground struct {
// Type Type of the background
Type BackgroundType `json:"type"`
}
@@ -270,6 +471,8 @@ type ChatBackground struct {
// Since: Bot API 9.4
// See https://core.telegram.org/bots/api#chatownerleft
type ChatOwnerLeft struct {
// NewOwner Optional. The user who will become the new owner of the chat if the previous owner does not
// return to the chat
NewOwner *User `json:"new_owner,omitempty"`
}
@@ -277,6 +480,7 @@ type ChatOwnerLeft struct {
// Since: Bot API 9.4
// See https://core.telegram.org/bots/api#chatownerchanged
type ChatOwnerChanged struct {
// NewOwner The new owner of the chat
NewOwner User `json:"new_owner"`
}
@@ -284,31 +488,61 @@ type ChatOwnerChanged struct {
// Since: Bot API 6.0
// See https://core.telegram.org/bots/api#chatadministratorrights
type ChatAdministratorRights struct {
IsAnonymous bool `json:"is_anonymous"`
CanManageChat bool `json:"can_manage_chat"`
CanDeleteMessages bool `json:"can_delete_messages"`
// IsAnonymous True, if the user's presence in the chat is hidden
IsAnonymous bool `json:"is_anonymous"`
// CanManageChat True, if the administrator can access the chat event log, get boost list, see hidden
// supergroup and channel members, report spam messages, ignore slow mode, and send messages to the chat
// without paying Telegram Stars. Implied by any other administrator privilege.
CanManageChat bool `json:"can_manage_chat"`
// CanDeleteMessages True, if the administrator can delete messages of other users
CanDeleteMessages bool `json:"can_delete_messages"`
// CanManageVideoChats True, if the administrator can manage video chats
CanManageVideoChats bool `json:"can_manage_video_chats"`
CanRestrictMembers bool `json:"can_restrict_members"`
CanPromoteMembers bool `json:"can_promote_members"`
CanChangeInfo bool `json:"can_change_info"`
CanInviteUsers bool `json:"can_invite_users"`
CanPostStories bool `json:"can_post_stories"`
CanEditStories bool `json:"can_edit_stories"`
CanDeleteStories bool `json:"can_delete_stories"`
// CanRestrictMembers True, if the administrator can restrict, ban or unban chat members, or access
// supergroup statistics
CanRestrictMembers bool `json:"can_restrict_members"`
// CanPromoteMembers True, if the administrator can add new administrators with a subset of their own
// privileges or demote administrators that they have promoted, directly or indirectly (promoted by
// administrators that were appointed by the user)
CanPromoteMembers bool `json:"can_promote_members"`
// CanChangeInfo True, if the user is allowed to change the chat title, photo and other settings
CanChangeInfo bool `json:"can_change_info"`
// CanInviteUsers True, if the user is allowed to invite new users to the chat
CanInviteUsers bool `json:"can_invite_users"`
// CanPostStories True, if the administrator can post stories to the chat
CanPostStories bool `json:"can_post_stories"`
// CanEditStories True, if the administrator can edit stories posted by other users, post stories to the
// chat page, pin chat stories, and access the chat's story archive
CanEditStories bool `json:"can_edit_stories"`
// CanDeleteStories True, if the administrator can delete stories posted by other users
CanDeleteStories bool `json:"can_delete_stories"`
CanPostMessages *bool `json:"can_post_messages,omitempty"`
CanEditMessages *bool `json:"can_edit_messages,omitempty"`
CanPinMessages *bool `json:"can_pin_messages,omitempty"`
CanManageTopics *bool `json:"can_manage_topics,omitempty"`
// CanPostMessages Optional. True, if the administrator can post messages in the channel, approve suggested
// posts, or access channel statistics; for channels only
CanPostMessages *bool `json:"can_post_messages,omitempty"`
// CanEditMessages Optional. True, if the administrator can edit messages of other users and can pin
// messages; for channels only
CanEditMessages *bool `json:"can_edit_messages,omitempty"`
// CanPinMessages Optional. True, if the user is allowed to pin messages; for groups and supergroups only
CanPinMessages *bool `json:"can_pin_messages,omitempty"`
// CanManageTopics Optional. True, if the user is allowed to create, rename, close, and reopen forum topics;
// for supergroups only
CanManageTopics *bool `json:"can_manage_topics,omitempty"`
// CanManageDirectMessages Optional. True, if the administrator can manage direct messages of the channel
// and decline suggested posts; for channels only
CanManageDirectMessages *bool `json:"can_manage_direct_messages,omitempty"`
CanManageTags *bool `json:"can_manage_tags,omitempty"`
// CanManageTags Optional. True, if the administrator can edit the tags of regular members; for groups and
// supergroups only. If omitted, defaults to the value of can_pin_messages.
CanManageTags *bool `json:"can_manage_tags,omitempty"`
}
// ChatBoostUpdated represents a boost added to a chat or changed.
// Since: Bot API 7.0
// See https://core.telegram.org/bots/api#chatboostupdated
type ChatBoostUpdated struct {
Chat Chat `json:"chat"`
// Chat Chat which was boosted
Chat Chat `json:"chat"`
// Boost Information about the chat boost
Boost ChatBoost `json:"boost"`
}
@@ -316,10 +550,14 @@ type ChatBoostUpdated struct {
// Since: Bot API 7.0
// See https://core.telegram.org/bots/api#chatboostremoved
type ChatBoostRemoved struct {
Chat Chat `json:"chat"`
BoostID string `json:"boost_id"`
RemoveDate int `json:"remove_date"`
Source ChatBoostSource `json:"source"`
// Chat Chat which was boosted
Chat Chat `json:"chat"`
// BoostID Unique identifier of the boost
BoostID string `json:"boost_id"`
// RemoveDate Point in time (Unix timestamp) when the boost was removed
RemoveDate int `json:"remove_date"`
// Source Source of the removed boost
Source ChatBoostSource `json:"source"`
}
// Community represents a group of chats.
+23 -2
View File
@@ -14,6 +14,24 @@ var ErrPoolQueueFull = errors.New("worker pool queue full")
// ErrPoolStopped reports that a request was submitted after the worker pool stopped.
var ErrPoolStopped = errors.New("worker pool stopped")
// ErrPoolWorkerPanic reports a panic recovered while executing a worker-pool request.
var ErrPoolWorkerPanic = errors.New("worker pool request panicked")
// ErrResponseTooLarge reports a Telegram API response larger than the safety limit.
var ErrResponseTooLarge = errors.New("telegram API response is too large")
// ErrFileTooLarge reports a file download that exceeds the caller's limit.
var ErrFileTooLarge = errors.New("telegram file exceeds size limit")
// ErrRichJSONDepth reports a rich-message JSON tree deeper than the decoder limit.
var ErrRichJSONDepth = errors.New("rich-message JSON exceeds depth limit")
// ErrRichJSONNodes reports a rich-message JSON tree larger than the decoder limit.
var ErrRichJSONNodes = errors.New("rich-message JSON exceeds node limit")
// ErrRetryLimit reports that a request exhausted its configured 429 retries.
var ErrRetryLimit = errors.New("telegram retry limit reached")
// ErrRichMessageDraftUploadUnsupported reports a direct file upload attempted for a rich draft.
//
// Since: Bot API 10.2
@@ -21,9 +39,12 @@ var ErrRichMessageDraftUploadUnsupported = errors.New("sendRichMessageDraft does
// ResponseError reports an unsuccessful Telegram API response.
type ResponseError struct {
Code int
// Code is the Telegram API error code.
Code int
// Description is the human-readable Telegram API error description.
Description string
Parameters *ResponseParameters
// Parameters contains additional recovery metadata such as retry_after.
Parameters *ResponseParameters
}
// Error returns the Telegram API error code and description.
+28 -9
View File
@@ -5,8 +5,10 @@ import "context"
// BaseForumTopic contains common fields for forum topic operations that require a chat ID and a message thread ID.
// Since: Bot API 6.3
type BaseForumTopic struct {
ChatID int64 `json:"chat_id"`
MessageThreadID int `json:"message_thread_id"`
// ChatID identifies the target supergroup.
ChatID int64 `json:"chat_id"`
// MessageThreadID identifies the target forum topic.
MessageThreadID int `json:"message_thread_id"`
}
// GetForumTopicIconStickers returns the list of custom emoji that can be used as a forum topic icon.
@@ -30,10 +32,18 @@ func (api *API) GetForumTopicIconStickersWithContext(ctx context.Context) ([]Sti
// Since: Bot API 6.3
// See https://core.telegram.org/bots/api#createforumtopic
type CreateForumTopic struct {
ChatID int64 `json:"chat_id"`
Name string `json:"name"`
IconColor ForumTopicIconColor `json:"icon_color"`
IconCustomEmojiID string `json:"icon_custom_emoji_id"`
// ChatID Required. Unique identifier for the target chat or username of the target supergroup in the format
// @username
ChatID int64 `json:"chat_id"`
// Name Required. Topic name, 1-128 characters
Name string `json:"name"`
// IconColor Optional. Color of the topic icon in RGB format. Currently, must be one of 7322096 (0x6FB9F0),
// 16766590 (0xFFD67E), 13338331 (0xCB86DB), 9367192 (0x8EEE98), 16749490 (0xFF93B2), or 16478047
// (0xFB6F5F).
IconColor ForumTopicIconColor `json:"icon_color"`
// IconCustomEmojiID Optional. Unique identifier of the custom emoji shown as the topic icon. Use
// getForumTopicIconStickers to get all allowed custom emoji identifiers.
IconCustomEmojiID string `json:"icon_custom_emoji_id"`
}
// CreateForumTopic creates a topic in a forum supergroup.
@@ -59,7 +69,12 @@ func (api *API) CreateForumTopicWithContext(ctx context.Context, params CreateFo
// See https://core.telegram.org/bots/api#editforumtopic
type EditForumTopic struct {
BaseForumTopic
Name string `json:"name"`
// Name Optional. New topic name, 0-128 characters. If not specified or empty, the current name of the topic
// will be kept.
Name string `json:"name"`
// IconCustomEmojiID Optional. New unique identifier of the custom emoji shown as the topic icon. Use
// getForumTopicIconStickers to get all allowed custom emoji identifiers. Pass an empty string to remove the
// icon. If not specified, the current icon will be kept.
IconCustomEmojiID string `json:"icon_custom_emoji_id"`
}
@@ -156,6 +171,7 @@ func (api *API) UnpinAllForumTopicMessagesWithContext(ctx context.Context, param
// BaseGeneralForumTopic contains common fields for general forum topic operations that require a chat ID.
// Since: Bot API 6.4
type BaseGeneralForumTopic struct {
// ChatID identifies the target supergroup.
ChatID int64 `json:"chat_id"`
}
@@ -163,8 +179,11 @@ type BaseGeneralForumTopic struct {
// Since: Bot API 6.4
// See https://core.telegram.org/bots/api#editgeneralforumtopic
type EditGeneralForumTopic struct {
ChatID int64 `json:"chat_id"`
Name string `json:"name"`
// ChatID Required. Unique identifier for the target chat or username of the target supergroup in the format
// @username
ChatID int64 `json:"chat_id"`
// Name Required. New topic name, 1-128 characters
Name string `json:"name"`
}
// EditGeneralForumTopic edits the name of the 'General' topic in a forum supergroup.
+22 -8
View File
@@ -4,11 +4,17 @@ package tgapi
// Since: Bot API 6.3
// See https://core.telegram.org/bots/api#forumtopic
type ForumTopic struct {
MessageThreadID int `json:"message_thread_id"`
Name string `json:"name"`
IconColor int `json:"icon_color"`
// MessageThreadID Unique identifier of the forum topic
MessageThreadID int `json:"message_thread_id"`
// Name Name of the topic
Name string `json:"name"`
// IconColor Color of the topic icon in RGB format
IconColor int `json:"icon_color"`
// IconCustomEmojiID Optional. Unique identifier of the custom emoji shown as the topic icon
IconCustomEmojiID string `json:"icon_custom_emoji_id,omitempty"`
IsNameImplicit bool `json:"is_name_implicit,omitempty"`
// IsNameImplicit Optional. True, if the name of the topic wasn't specified explicitly by its creator and
// likely needs to be changed by the bot
IsNameImplicit bool `json:"is_name_implicit,omitempty"`
}
// ForumTopicIconColor represents the color of a forum topic icon.
@@ -25,16 +31,24 @@ const (
// ForumTopicCreated represents a service message about a new forum topic created.
// Since: Bot API 6.3
type ForumTopicCreated struct {
Name string `json:"name"`
IconColor int `json:"icon_color"`
// Name Name of the topic
Name string `json:"name"`
// IconColor Color of the topic icon in RGB format
IconColor int `json:"icon_color"`
// IconCustomEmojiID Optional. Unique identifier of the custom emoji shown as the topic icon
IconCustomEmojiID string `json:"icon_custom_emoji_id,omitempty"`
IsNameImplicit bool `json:"is_name_implicit,omitempty"`
// IsNameImplicit Optional. True, if the name of the topic wasn't specified explicitly by its creator and
// likely needs to be changed by the bot
IsNameImplicit bool `json:"is_name_implicit,omitempty"`
}
// ForumTopicEdited represents a service message about an edited forum topic.
// Since: Bot API 6.4
type ForumTopicEdited struct {
Name string `json:"name,omitempty"`
// Name Optional. New name of the topic, if it was edited
Name string `json:"name,omitempty"`
// IconCustomEmojiID Optional. New identifier of the custom emoji shown as the topic icon, if it was edited;
// an empty string if the icon was removed
IconCustomEmojiID string `json:"icon_custom_emoji_id,omitempty"`
}
+52 -18
View File
@@ -6,18 +6,37 @@ import "context"
// Since: Bot API 2.2
// See https://core.telegram.org/bots/api#sendgame
type SendGame struct {
// BusinessConnectionID Optional. Unique identifier of the business connection on behalf of which the
// message will be sent
BusinessConnectionID string `json:"business_connection_id,omitempty"`
ChatID int64 `json:"chat_id"`
MessageThreadID int `json:"message_thread_id,omitempty"`
// ChatID Required. Unique identifier for the target chat or username of the target bot in the format
// @username. Games can't be sent to channel direct messages chats and channel chats.
ChatID int64 `json:"chat_id"`
// MessageThreadID Optional. Unique identifier for the target message thread (topic) of a forum; for forum
// supergroups and private chats of bots with forum topic mode enabled only
MessageThreadID int `json:"message_thread_id,omitempty"`
// GameShortName Required. Short name of the game, serves as the unique identifier for the game. Set up your
// games via @BotFather.
GameShortName string `json:"game_short_name"`
DisableNotification bool `json:"disable_notification,omitempty"`
ProtectContent bool `json:"protect_content,omitempty"`
AllowPaidBroadcast bool `json:"allow_paid_broadcast,omitempty"`
MessageEffectID string `json:"message_effect_id,omitempty"`
ReplyParameters *ReplyParameters `json:"reply_parameters,omitempty"`
ReplyMarkup *InlineKeyboardMarkup `json:"reply_markup,omitempty"`
// DisableNotification Optional. Sends the message silently. Users will receive a notification with no
// sound.
DisableNotification bool `json:"disable_notification,omitempty"`
// ProtectContent Optional. Protects the contents of the sent message from forwarding and saving
ProtectContent bool `json:"protect_content,omitempty"`
// AllowPaidBroadcast Optional. Pass True to allow up to 1000 messages per second, ignoring broadcasting
// limits for a fee of 0.1 Telegram Stars per message. The relevant Stars will be withdrawn from the bot's
// balance.
AllowPaidBroadcast bool `json:"allow_paid_broadcast,omitempty"`
// MessageEffectID Optional. Unique identifier of the message effect to be added to the message; for private
// chats only
MessageEffectID string `json:"message_effect_id,omitempty"`
// ReplyParameters Optional. Description of the message to reply to
ReplyParameters *ReplyParameters `json:"reply_parameters,omitempty"`
// ReplyMarkup Optional. A JSON-serialized object for an inline keyboard. If empty, one 'Play game_title'
// button will be shown. If not empty, the first button must launch the game.
ReplyMarkup *InlineKeyboardMarkup `json:"reply_markup,omitempty"`
}
// SendGame sends a game message.
@@ -41,13 +60,23 @@ func (api *API) SendGameWithContext(ctx context.Context, params SendGame) (Messa
// Since: Bot API 2.2
// See https://core.telegram.org/bots/api#setgamescore
type SetGameScore struct {
UserID int64 `json:"user_id"`
Score int `json:"score"`
Force bool `json:"force,omitempty"`
DisableEditMessage bool `json:"disable_edit_message,omitempty"`
ChatID int64 `json:"chat_id,omitempty"`
MessageID int `json:"message_id,omitempty"`
InlineMessageID string `json:"inline_message_id,omitempty"`
// UserID Required. User identifier
UserID int64 `json:"user_id"`
// Score Required. New score, must be non-negative
Score int `json:"score"`
// Force Optional. Pass True if the high score is allowed to decrease. This can be useful when fixing
// mistakes or banning cheaters.
Force bool `json:"force,omitempty"`
// DisableEditMessage Optional. Pass True if the game message should not be automatically edited to include
// the current scoreboard
DisableEditMessage bool `json:"disable_edit_message,omitempty"`
// ChatID Optional. Required if inline_message_id is not specified. Unique identifier for the target chat.
ChatID int64 `json:"chat_id,omitempty"`
// MessageID Optional. Required if inline_message_id is not specified. Identifier of the sent message.
MessageID int `json:"message_id,omitempty"`
// InlineMessageID Optional. Required if chat_id and message_id are not specified. Identifier of the inline
// message.
InlineMessageID string `json:"inline_message_id,omitempty"`
}
// SetGameScore sets a user's score in a game message.
@@ -87,9 +116,14 @@ func (api *API) SetGameScoreWithContext(ctx context.Context, params SetGameScore
// Since: Bot API 2.2
// See https://core.telegram.org/bots/api#getgamehighscores
type GetGameHighScores struct {
UserID int64 `json:"user_id"`
ChatID int64 `json:"chat_id,omitempty"`
MessageID int `json:"message_id,omitempty"`
// UserID Required. Target user id
UserID int64 `json:"user_id"`
// ChatID Optional. Required if inline_message_id is not specified. Unique identifier for the target chat.
ChatID int64 `json:"chat_id,omitempty"`
// MessageID Optional. Required if inline_message_id is not specified. Identifier of the sent message.
MessageID int `json:"message_id,omitempty"`
// InlineMessageID Optional. Required if chat_id and message_id are not specified. Identifier of the inline
// message.
InlineMessageID string `json:"inline_message_id,omitempty"`
}
+19 -8
View File
@@ -3,12 +3,20 @@ package tgapi
// Game represents a game.
// Since: Bot API 2.2
type Game struct {
Title string `json:"title"`
Description string `json:"description"`
Photo []PhotoSize `json:"photo"`
Text string `json:"text,omitempty"`
// Title Title of the game
Title string `json:"title"`
// Description Description of the game
Description string `json:"description"`
// Photo Photo that will be displayed in the game message in chats
Photo []PhotoSize `json:"photo"`
// Text Optional. Brief description of the game or high scores included in the game message. Can be
// automatically edited to include current high scores for the game when the bot calls setGameScore, or
// manually edited using editMessageText. 0-4096 characters.
Text string `json:"text,omitempty"`
// TextEntities Optional. Special entities that appear in text, such as usernames, URLs, bot commands, etc.
TextEntities []MessageEntity `json:"text_entities,omitempty"`
Animation *Animation `json:"animation,omitempty"`
// Animation Optional. Animation that will be displayed in the game message in chats. Upload via BotFather.
Animation *Animation `json:"animation,omitempty"`
}
// CallbackGame is a placeholder for the future use of callback games.
@@ -19,7 +27,10 @@ type CallbackGame struct{}
// Since: Bot API 2.2
// See https://core.telegram.org/bots/api#gamehighscore
type GameHighScore struct {
Position int `json:"position"`
User User `json:"user"`
Score int `json:"score"`
// Position Position in high score table for the game
Position int `json:"position"`
// User User
User User `json:"user"`
// Score Score
Score int `json:"score"`
}
+36 -15
View File
@@ -6,12 +6,22 @@ import "context"
// Since: Bot API 1.7
// See https://core.telegram.org/bots/api#answerinlinequery
type AnswerInlineQuery struct {
InlineQueryID string `json:"inline_query_id"`
Results []InlineQueryResult `json:"results"`
CacheTime int `json:"cache_time,omitempty"`
IsPersonal bool `json:"is_personal,omitempty"`
NextOffset string `json:"next_offset,omitempty"`
Button *InlineQueryResultsButton `json:"button,omitempty"`
// InlineQueryID Required. Unique identifier for the answered query
InlineQueryID string `json:"inline_query_id"`
// Results Required. A JSON-serialized Array of results for the inline query
Results []InlineQueryResult `json:"results"`
// CacheTime Optional. The maximum amount of time in seconds that the result of the inline query may be
// cached on the server. Defaults to 300.
CacheTime int `json:"cache_time,omitempty"`
// IsPersonal Optional. Pass True if results may be cached on the server side only for the user that sent
// the query. By default, results may be returned to any user who sends the same query.
IsPersonal bool `json:"is_personal,omitempty"`
// NextOffset Optional. Pass the offset that a client should send in the next query with the same text to
// receive more results. Pass an empty string if there are no more results or if you don't support
// pagination. Offset length can't exceed 64 bytes.
NextOffset string `json:"next_offset,omitempty"`
// Button Optional. A JSON-serialized object describing a button to be shown above inline query results
Button *InlineQueryResultsButton `json:"button,omitempty"`
}
// AnswerInlineQuery sends answers to an inline query.
@@ -36,8 +46,10 @@ func (api *API) AnswerInlineQueryWithContext(ctx context.Context, params AnswerI
// Since: Bot API 8.0
// See https://core.telegram.org/bots/api#answerwebappquery
type AnswerWebAppQuery struct {
WebAppQueryID string `json:"web_app_query_id"`
Result InlineQueryResult `json:"result"`
// WebAppQueryID Required. Unique identifier for the query to be answered
WebAppQueryID string `json:"web_app_query_id"`
// Result Required. A JSON-serialized object describing the message to be sent
Result InlineQueryResult `json:"result"`
}
// AnswerWebAppQuery sets the result of a Web App interaction.
@@ -61,12 +73,18 @@ func (api *API) AnswerWebAppQueryWithContext(ctx context.Context, params AnswerW
// Since: Bot API 8.0
// See https://core.telegram.org/bots/api#savepreparedinlinemessage
type SavePreparedInlineMessage struct {
UserID int64 `json:"user_id"`
Result InlineQueryResult `json:"result"`
AllowUserChats bool `json:"allow_user_chats,omitempty"`
AllowBotChats bool `json:"allow_bot_chats,omitempty"`
AllowGroupChats bool `json:"allow_group_chats,omitempty"`
AllowChannelChats bool `json:"allow_channel_chats,omitempty"`
// UserID Required. Unique identifier of the target user that can use the prepared message
UserID int64 `json:"user_id"`
// Result Required. A JSON-serialized object describing the message to be sent
Result InlineQueryResult `json:"result"`
// AllowUserChats Optional. Pass True if the message can be sent to private chats with users
AllowUserChats bool `json:"allow_user_chats,omitempty"`
// AllowBotChats Optional. Pass True if the message can be sent to private chats with bots
AllowBotChats bool `json:"allow_bot_chats,omitempty"`
// AllowGroupChats Optional. Pass True if the message can be sent to group and supergroup chats
AllowGroupChats bool `json:"allow_group_chats,omitempty"`
// AllowChannelChats Optional. Pass True if the message can be sent to channel chats
AllowChannelChats bool `json:"allow_channel_chats,omitempty"`
}
// SavePreparedInlineMessage stores a prepared message for Mini App users.
@@ -90,7 +108,10 @@ func (api *API) SavePreparedInlineMessageWithContext(ctx context.Context, params
// Since: Bot API 8.0
// See https://core.telegram.org/bots/api#savepreparedkeyboardbutton
type SavePreparedKeyboardButton struct {
UserID int64 `json:"user_id"`
// UserID Required. Unique identifier of the target user that can use the button
UserID int64 `json:"user_id"`
// Button Required. A JSON-serialized object describing the button to be saved. The button must be of the
// type request_users, request_chat, or request_managed_bot.
Button KeyboardButton `json:"button"`
}
+23 -5
View File
@@ -9,9 +9,21 @@ type InlineQueryResult map[string]any
// Since: Bot API 6.3
// See https://core.telegram.org/bots/api#inlinequeryresultsbutton
type InlineQueryResultsButton struct {
Text string `json:"text"`
WebApp *WebAppInfo `json:"web_app,omitempty"`
StartParameter string `json:"start_parameter,omitempty"`
// Text Label text on the button
Text string `json:"text"`
// WebApp Optional. Description of the Web App that will be launched when the user presses the button. The
// Web App will be able to switch back to the inline mode using the method switchInlineQuery inside the Web
// App.
WebApp *WebAppInfo `json:"web_app,omitempty"`
// StartParameter Optional. Deep-linking parameter for the /start message sent to the bot when a user
// presses the button. 1-64 characters, only A-Z, a-z, 0-9, _ and - are allowed. Example: An inline bot that
// sends YouTube videos can ask the user to connect the bot to their YouTube account to adapt search results
// accordingly. To do this, it displays a 'Connect your YouTube account' button above the results, or even
// before showing any. The user presses the button, switches to a private chat with the bot and, in doing
// so, passes a start parameter that instructs the bot to return an OAuth link. Once done, the bot can offer
// a switch_inline button so that the user can easily return to the chat where they wanted to use the bot's
// inline capabilities.
StartParameter string `json:"start_parameter,omitempty"`
}
// InputRichMessageContent represents the content of a rich message to be
@@ -28,6 +40,8 @@ type InputRichMessageContent struct {
// Since: Bot API 8.0
// See https://core.telegram.org/bots/api#sentwebappmessage
type SentWebAppMessage struct {
// InlineMessageID Optional. Identifier of the sent inline message. Available only if there is an inline
// keyboard attached to the message.
InlineMessageID string `json:"inline_message_id,omitempty"`
}
@@ -35,13 +49,17 @@ type SentWebAppMessage struct {
// Since: Bot API 8.0
// See https://core.telegram.org/bots/api#preparedinlinemessage
type PreparedInlineMessage struct {
ID string `json:"id"`
ExpirationDate int `json:"expiration_date"`
// ID Unique identifier of the prepared message
ID string `json:"id"`
// ExpirationDate Expiration date of the prepared message, in Unix time. Expired prepared messages can no
// longer be used.
ExpirationDate int `json:"expiration_date"`
}
// PreparedKeyboardButton describes a prepared keyboard button.
// Since: Bot API 8.0
// See https://core.telegram.org/bots/api#preparedkeyboardbutton
type PreparedKeyboardButton struct {
// ID Unique identifier of the keyboard button
ID string `json:"id"`
}
+694 -237
View File
File diff suppressed because it is too large Load Diff
+739 -252
View File
File diff suppressed because it is too large Load Diff
+79 -9
View File
@@ -4,6 +4,7 @@ import (
"context"
"fmt"
"io"
"math"
"net/http"
"git.scuroneko.dev/scuroneko/laniakea/utils"
@@ -12,9 +13,24 @@ import (
// UpdateParams holds parameters for the getUpdates method.
// See https://core.telegram.org/bots/api#getupdates
type UpdateParams struct {
Offset *int `json:"offset,omitempty"`
Limit *int `json:"limit,omitempty"`
Timeout *int `json:"timeout,omitempty"`
// Offset Optional. Identifier of the first update to be returned. Must be greater by one than the highest
// among the identifiers of previously received updates. By default, updates starting with the earliest
// unconfirmed update are returned. An update is considered confirmed as soon as getUpdates is called with
// an offset higher than its update_id. The negative offset can be specified to retrieve updates starting
// from -offset update from the end of the updates queue. All previous updates will be forgotten.
Offset *int `json:"offset,omitempty"`
// Limit Optional. Limits the number of updates to be retrieved. Values between 1-100 are accepted. Defaults
// to 100.
Limit *int `json:"limit,omitempty"`
// Timeout Optional. Timeout in seconds for long polling. Defaults to 0, i.e. usual short polling. Should be
// positive, short polling should be used for testing purposes only.
Timeout *int `json:"timeout,omitempty"`
// AllowedUpdates Optional. A JSON-serialized list of the update types you want your bot to receive. For
// example, specify ["message", "edited_channel_post", "callback_query"] to only receive updates of these
// types. See Update for a complete list of available update types. Specify an empty list to receive all
// update types except chat_member, message_reaction, and message_reaction_count (default). If not
// specified, the previous setting will be used. Please note that this parameter doesn't affect updates
// created before the call to getUpdates, so unwanted updates may be received for a short period of time.
AllowedUpdates []UpdateType `json:"allowed_updates,omitempty"`
}
@@ -36,6 +52,7 @@ func (api *API) GetMeWithContext(ctx context.Context) (User, error) {
// GetManagedBotToken holds parameters for the getManagedBotToken method.
// See https://core.telegram.org/bots/api#getmanagedbottoken
type GetManagedBotToken struct {
// UserID Required. User identifier of the managed bot whose token will be returned
UserID int64 `json:"user_id"`
}
@@ -57,6 +74,7 @@ func (api *API) GetManagedBotTokenWithContext(ctx context.Context, params GetMan
// ReplaceManagedBotToken holds parameters for the replaceManagedBotToken method.
// See https://core.telegram.org/bots/api#replacemanagedbottoken
type ReplaceManagedBotToken struct {
// UserID Required. User identifier of the managed bot whose token will be replaced
UserID int64 `json:"user_id"`
}
@@ -126,12 +144,29 @@ func (api *API) GetUpdatesWithContext(ctx context.Context, params UpdateParams)
// To upload a self-signed certificate, use Uploader.SetWebhook.
// See https://core.telegram.org/bots/api#setwebhook
type SetWebhook struct {
URL string `json:"url"`
IPAddress string `json:"ip_address,omitempty"`
MaxConnections int8 `json:"max_connections,omitempty"`
AllowedUpdates []UpdateType `json:"allowed_updates,omitempty"`
DropPendingUpdates bool `json:"drop_pending_updates,omitempty"`
SecretToken string `json:"secret_token,omitempty"`
// URL Required. HTTPS URL to send updates to. Use an empty string to remove webhook integration.
URL string `json:"url"`
// IPAddress Optional. The fixed IP address which will be used to send webhook requests instead of the IP
// address resolved through DNS
IPAddress string `json:"ip_address,omitempty"`
// MaxConnections Optional. The maximum allowed number of simultaneous HTTPS connections to the webhook for
// update delivery, 1-100. Defaults to 40. Use lower values to limit the load on your bot's server, and
// higher values to increase your bot's throughput.
MaxConnections int8 `json:"max_connections,omitempty"`
// AllowedUpdates Optional. A JSON-serialized list of the update types you want your bot to receive. For
// example, specify ["message", "edited_channel_post", "callback_query"] to only receive updates of these
// types. See Update for a complete list of available update types. Specify an empty list to receive all
// update types except chat_member, message_reaction, and message_reaction_count (default). If not
// specified, the previous setting will be used. Please note that this parameter doesn't affect updates
// created before the call to the setWebhook, so unwanted updates may be received for a short period of
// time.
AllowedUpdates []UpdateType `json:"allowed_updates,omitempty"`
// DropPendingUpdates Optional. Pass True to drop all pending updates
DropPendingUpdates bool `json:"drop_pending_updates,omitempty"`
// SecretToken Optional. A secret token to be sent in a header “X-Telegram-Bot-Api-Secret-Token” in
// every webhook request, 1-256 characters. Only characters A-Z, a-z, 0-9, _ and - are allowed. The header
// is useful to ensure that the request comes from a webhook set by you.
SecretToken string `json:"secret_token,omitempty"`
}
// SetWebhook sets a webhook URL for incoming updates.
@@ -155,6 +190,7 @@ func (api *API) SetWebhookWithContext(ctx context.Context, params SetWebhook) (b
// DeleteWebhook holds parameters for the deleteWebhook method.
// See https://core.telegram.org/bots/api#deletewebhook
type DeleteWebhook struct {
// DropPendingUpdates Optional. Pass True to drop all pending updates
DropPendingUpdates bool `json:"drop_pending_updates,omitempty"`
}
@@ -192,6 +228,7 @@ func (api *API) GetWebhookInfoWithContext(ctx context.Context) (WebhookInfo, err
// GetFile holds parameters for the getFile method.
// See https://core.telegram.org/bots/api#getfile
type GetFile struct {
// FileID Required. File identifier to get information about
FileID string `json:"file_id"`
}
@@ -213,6 +250,8 @@ func (api *API) GetFileWithContext(ctx context.Context, params GetFile) (File, e
// GetFileByLink downloads a file from Telegram's file server using the provided file link.
// The link is usually obtained from File.FilePath.
// For large files, prefer OpenFileByLink or OpenFileByLinkWithContext to stream the response body.
// This unbounded helper is retained for v1 compatibility and is subject to change in v2;
// prefer GetFileByLinkLimit for untrusted or potentially large files.
// See https://core.telegram.org/bots/api#file
func (api *API) GetFileByLink(link string) ([]byte, error) {
return api.getFileByLink(context.Background(), link)
@@ -226,6 +265,37 @@ func (api *API) GetFileByLinkWithContext(ctx context.Context, link string) ([]by
return api.getFileByLink(ctx, link)
}
// GetFileByLinkLimit downloads at most maxBytes from Telegram's file server.
// It returns ErrFileTooLarge when the response exceeds the limit.
func (api *API) GetFileByLinkLimit(link string, maxBytes int64) ([]byte, error) {
return api.GetFileByLinkLimitWithContext(context.Background(), link, maxBytes)
}
// GetFileByLinkLimitWithContext is the context-aware variant of GetFileByLinkLimit.
func (api *API) GetFileByLinkLimitWithContext(ctx context.Context, link string, maxBytes int64) ([]byte, error) {
if maxBytes < 0 {
return nil, fmt.Errorf("maximum file size must not be negative: %d", maxBytes)
}
body, err := api.openFileByLink(ctx, link)
if err != nil {
return nil, err
}
defer func() { _ = body.Close() }()
readLimit := maxBytes
if readLimit < math.MaxInt64 {
readLimit++
}
data, err := io.ReadAll(io.LimitReader(body, readLimit))
if err != nil {
return nil, err
}
if int64(len(data)) > maxBytes {
return nil, ErrFileTooLarge
}
return data, nil
}
// OpenFileByLink opens a streaming response body for a file hosted on Telegram's file server.
// The caller must close the returned ReadCloser.
// See https://core.telegram.org/bots/api#file
+20
View File
@@ -2,6 +2,7 @@ package tgapi
import (
"encoding/json"
"errors"
"io"
"net/http"
"strings"
@@ -109,6 +110,25 @@ func TestGetFileByLinkReturnsHTTPStatusError(t *testing.T) {
}
}
func TestGetFileByLinkLimitRejectsOversizedResponse(t *testing.T) {
api := NewAPI(
NewAPIOpts("token").
SetAPIURL("https://example.test").
SetHTTPClient(&http.Client{Transport: roundTripFunc(func(_ *http.Request) (*http.Response, error) {
return &http.Response{
StatusCode: http.StatusOK,
Body: io.NopCloser(strings.NewReader("12345")),
}, nil
})}),
)
defer func() { _ = api.Close() }()
_, err := api.GetFileByLinkLimit("files/report.txt", 4)
if !errors.Is(err, ErrFileTooLarge) {
t.Fatalf("expected ErrFileTooLarge, got %v", err)
}
}
func TestGetUpdatesOmitsAllowedUpdatesWhenEmpty(t *testing.T) {
var gotBody map[string]any
+3 -1
View File
@@ -6,7 +6,9 @@ import "context"
// Since: Bot API 4.0
// See https://core.telegram.org/bots/api#setpassportdataerrors
type SetPassportDataErrors struct {
UserID int64 `json:"user_id"`
// UserID Required. User identifier
UserID int64 `json:"user_id"`
// Errors Required. A JSON-serialized Array describing the errors
Errors []PassportElementError `json:"errors"`
}
+71 -21
View File
@@ -3,17 +3,25 @@ package tgapi
// PassportData contains information about Telegram Passport data shared with the bot.
// Since: Bot API 4.0
type PassportData struct {
Data []EncryptedPassportElement `json:"data"`
Credentials EncryptedCredentials `json:"credentials"`
// Data Array with information about documents and other Telegram Passport elements that was shared with the
// bot
Data []EncryptedPassportElement `json:"data"`
// Credentials Encrypted credentials required to decrypt the data
Credentials EncryptedCredentials `json:"credentials"`
}
// PassportFile represents a file uploaded to Telegram Passport.
// Since: Bot API 4.0
type PassportFile struct {
FileID string `json:"file_id"`
// FileID Identifier for this file, which can be used to download or reuse the file
FileID string `json:"file_id"`
// FileUniqueID Unique identifier for this file, which is supposed to be the same over time and for
// different bots. Can't be used to download or reuse the file.
FileUniqueID string `json:"file_unique_id"`
FileSize int64 `json:"file_size"`
FileDate int64 `json:"file_date"`
// FileSize File size in bytes
FileSize int64 `json:"file_size"`
// FileDate Unix time when the file was uploaded
FileDate int64 `json:"file_date"`
}
// PassportElementType represents the type of a Telegram Passport element.
@@ -51,23 +59,57 @@ const (
// EncryptedPassportElement contains information about documents or other Telegram Passport elements.
// Since: Bot API 4.0
type EncryptedPassportElement struct {
Type PassportElementType `json:"type"`
Data string `json:"data,omitempty"`
PhoneNumber string `json:"phone_number,omitempty"`
Email string `json:"email,omitempty"`
Files []PassportFile `json:"files,omitempty"`
FrontSide *PassportFile `json:"front_side,omitempty"`
ReverseSide *PassportFile `json:"reverse_side,omitempty"`
Selfie *PassportFile `json:"selfie,omitempty"`
Translation *PassportFile `json:"translation,omitempty"`
Hash string `json:"hash,omitempty"`
// Type Element type. One of “personal_details”, “passport”, “driver_license”,
// “identity_card”, “internal_passport”, “address”, “utility_bill”, “bank_statement”,
// “rental_agreement”, “passport_registration”, “temporary_registration”, “phone_number”,
// “email”.
Type PassportElementType `json:"type"`
// Data Optional. Base64-encoded encrypted Telegram Passport element data provided by the user; available
// only for “personal_details”, “passport”, “driver_license”, “identity_card”,
// “internal_passport” and “address” types. Can be decrypted and verified using the accompanying
// EncryptedCredentials.
Data string `json:"data,omitempty"`
// PhoneNumber Optional. User's verified phone number; available only for “phone_number” type
PhoneNumber string `json:"phone_number,omitempty"`
// Email Optional. User's verified email address; available only for “email” type
Email string `json:"email,omitempty"`
// Files Optional. Array of encrypted files with documents provided by the user; available only for
// “utility_bill”, “bank_statement”, “rental_agreement”, “passport_registration” and
// “temporary_registration” types. Files can be decrypted and verified using the accompanying
// EncryptedCredentials.
Files []PassportFile `json:"files,omitempty"`
// FrontSide Optional. Encrypted file with the front side of the document, provided by the user; available
// only for “passport”, “driver_license”, “identity_card” and “internal_passport”. The file
// can be decrypted and verified using the accompanying EncryptedCredentials.
FrontSide *PassportFile `json:"front_side,omitempty"`
// ReverseSide Optional. Encrypted file with the reverse side of the document, provided by the user;
// available only for “driver_license” and “identity_card”. The file can be decrypted and verified
// using the accompanying EncryptedCredentials.
ReverseSide *PassportFile `json:"reverse_side,omitempty"`
// Selfie Optional. Encrypted file with the selfie of the user holding a document, provided by the user;
// available if requested for “passport”, “driver_license”, “identity_card” and
// “internal_passport”. The file can be decrypted and verified using the accompanying
// EncryptedCredentials.
Selfie *PassportFile `json:"selfie,omitempty"`
// Translation Optional. Array of encrypted files with translated versions of documents provided by the
// user; available if requested for “passport”, “driver_license”, “identity_card”,
// “internal_passport”, “utility_bill”, “bank_statement”, “rental_agreement”,
// “passport_registration” and “temporary_registration” types. Files can be decrypted and verified
// using the accompanying EncryptedCredentials.
Translation *PassportFile `json:"translation,omitempty"`
// Hash Base64-encoded element hash for using in PassportElementErrorUnspecified
Hash string `json:"hash,omitempty"`
}
// EncryptedCredentials contains data required for decrypting and authenticating EncryptedPassportElement.
// Since: Bot API 4.0
type EncryptedCredentials struct {
Data string `json:"data"`
Hash string `json:"hash"`
// Data Base64-encoded encrypted JSON-serialized data with unique user's payload, data hashes and secrets
// required for EncryptedPassportElement decryption and authentication
Data string `json:"data"`
// Hash Base64-encoded data hash for data authentication
Hash string `json:"hash"`
// Secret Base64-encoded secret, encrypted with the bot's public RSA key, required for data decryption
Secret string `json:"secret"`
}
@@ -75,16 +117,24 @@ type EncryptedCredentials struct {
// Since: Bot API 4.0
// See https://core.telegram.org/bots/api#passportelementerror
type PassportElementError struct {
Source string `json:"source"`
Type PassportElementType `json:"type"`
// Source identifies the source of the passport validation error.
Source string `json:"source"`
// Type identifies the Telegram Passport element type with the error.
Type PassportElementType `json:"type"`
// FieldName Name of the data field which has the error
FieldName string `json:"field_name,omitempty"`
DataHash string `json:"data_hash,omitempty"`
// DataHash Base64-encoded data hash
DataHash string `json:"data_hash,omitempty"`
FileHash string `json:"file_hash,omitempty"`
// FileHash is the base64-encoded hash of the file that contains the error.
FileHash string `json:"file_hash,omitempty"`
// FileHashes List of base64-encoded file hashes
FileHashes []string `json:"file_hashes,omitempty"`
// ElementHash Base64-encoded element hash
ElementHash string `json:"element_hash,omitempty"`
// Message Error message
Message string `json:"message"`
}
+181 -56
View File
@@ -6,40 +6,104 @@ import "context"
// Since: Bot API 3.0
// See https://core.telegram.org/bots/api#sendinvoice
type SendInvoice struct {
ChatID int64 `json:"chat_id"`
MessageThreadID int `json:"message_thread_id,omitempty"`
DirectMessagesTopicID int `json:"direct_messages_topic_id,omitempty"`
// ChatID Required. Unique identifier for the target chat or username of the target bot, supergroup or
// channel in the format @username
ChatID int64 `json:"chat_id"`
// MessageThreadID Optional. Unique identifier for the target message thread (topic) of a forum; for forum
// supergroups and private chats of bots with forum topic mode enabled only
MessageThreadID int `json:"message_thread_id,omitempty"`
// DirectMessagesTopicID Optional. Identifier of the direct messages topic to which the message will be
// sent; required if the message is sent to a direct messages chat
DirectMessagesTopicID int `json:"direct_messages_topic_id,omitempty"`
Title string `json:"title"`
Description string `json:"description"`
Payload string `json:"payload"`
ProviderToken string `json:"provider_token,omitempty"`
Currency string `json:"currency"`
Prices []LabeledPrice `json:"prices"`
// Title Required. Product name, 1-32 characters
Title string `json:"title"`
// Description Required. Product description, 1-255 characters
Description string `json:"description"`
// Payload Required. Bot-defined invoice payload, 1-128 bytes. This will not be displayed to the user, use
// it for your internal processes.
Payload string `json:"payload"`
// ProviderToken Optional. Payment provider token, obtained via @BotFather. Pass an empty string for
// payments in Telegram Stars.
ProviderToken string `json:"provider_token,omitempty"`
// Currency Required. Three-letter ISO 4217 currency code, see more on currencies. Pass “XTR” for
// payments in Telegram Stars.
Currency string `json:"currency"`
// Prices Required. Price breakdown, a JSON-serialized list of components (e.g. product price, tax,
// discount, delivery cost, delivery tax, bonus, etc.). Must contain exactly one item for payments in
// Telegram Stars.
Prices []LabeledPrice `json:"prices"`
MaxTipAmount int `json:"max_tip_amount,omitempty"`
SuggestedTipAmounts []int `json:"suggested_tip_amounts,omitempty"`
StartParameter string `json:"start_parameter,omitempty"`
ProviderData string `json:"provider_data,omitempty"`
PhotoURL string `json:"photo_url,omitempty"`
PhotoSize int `json:"photo_size,omitempty"`
PhotoWidth int `json:"photo_width,omitempty"`
PhotoHeight int `json:"photo_height,omitempty"`
NeedName bool `json:"need_name,omitempty"`
NeedPhoneNumber bool `json:"need_phone_number,omitempty"`
NeedEmail bool `json:"need_email,omitempty"`
NeedShippingAddress bool `json:"need_shipping_address,omitempty"`
SendPhoneToProvider bool `json:"send_phone_number_to_provider,omitempty"`
SendEmailToProvider bool `json:"send_email_to_provider,omitempty"`
IsFlexible bool `json:"is_flexible,omitempty"`
DisableNotification bool `json:"disable_notification,omitempty"`
ProtectContent bool `json:"protect_content,omitempty"`
AllowPaidBroadcast bool `json:"allow_paid_broadcast,omitempty"`
MessageEffectID string `json:"message_effect_id,omitempty"`
// MaxTipAmount Optional. The maximum accepted amount for tips in the smallest units of the currency
// (integer, not float/double). For example, for a maximum tip of US$ 1.45 pass max_tip_amount = 145. See
// the exp parameter in currencies.json, it shows the number of digits past the decimal point for each
// currency (2 for the majority of currencies). Defaults to 0. Not supported for payments in Telegram Stars.
MaxTipAmount int `json:"max_tip_amount,omitempty"`
// SuggestedTipAmounts Optional. A JSON-serialized Array of suggested amounts of tips in the smallest units
// of the currency (integer, not float/double). At most 4 suggested tip amounts can be specified. The
// suggested tip amounts must be positive, passed in a strictly increased order and must not exceed
// max_tip_amount.
SuggestedTipAmounts []int `json:"suggested_tip_amounts,omitempty"`
// StartParameter Optional. Unique deep-linking parameter. If left empty, forwarded copies of the sent
// message will have a Pay button, allowing multiple users to pay directly from the forwarded message, using
// the same invoice. If non-empty, forwarded copies of the sent message will have a URL button with a deep
// link to the bot (instead of a Pay button), with the value used as the start parameter.
StartParameter string `json:"start_parameter,omitempty"`
// ProviderData Optional. JSON-serialized data about the invoice, which will be shared with the payment
// provider. A detailed description of required fields should be provided by the payment provider.
ProviderData string `json:"provider_data,omitempty"`
// PhotoURL Optional. URL of the product photo for the invoice. Can be a photo of the goods or a marketing
// image for a service. People like it better when they see what they are paying for.
PhotoURL string `json:"photo_url,omitempty"`
// PhotoSize Optional. Photo size in bytes
PhotoSize int `json:"photo_size,omitempty"`
// PhotoWidth Optional. Photo width
PhotoWidth int `json:"photo_width,omitempty"`
// PhotoHeight Optional. Photo height
PhotoHeight int `json:"photo_height,omitempty"`
// NeedName Optional. Pass True if you require the user's full name to complete the order. Ignored for
// payments in Telegram Stars.
NeedName bool `json:"need_name,omitempty"`
// NeedPhoneNumber Optional. Pass True if you require the user's phone number to complete the order. Ignored
// for payments in Telegram Stars.
NeedPhoneNumber bool `json:"need_phone_number,omitempty"`
// NeedEmail Optional. Pass True if you require the user's email address to complete the order. Ignored for
// payments in Telegram Stars.
NeedEmail bool `json:"need_email,omitempty"`
// NeedShippingAddress Optional. Pass True if you require the user's shipping address to complete the order.
// Ignored for payments in Telegram Stars.
NeedShippingAddress bool `json:"need_shipping_address,omitempty"`
// SendPhoneToProvider Optional. Pass True if the user's phone number should be sent to the provider.
// Ignored for payments in Telegram Stars.
SendPhoneToProvider bool `json:"send_phone_number_to_provider,omitempty"`
// SendEmailToProvider Optional. Pass True if the user's email address should be sent to the provider.
// Ignored for payments in Telegram Stars.
SendEmailToProvider bool `json:"send_email_to_provider,omitempty"`
// IsFlexible Optional. Pass True if the final price depends on the shipping method. Ignored for payments in
// Telegram Stars.
IsFlexible bool `json:"is_flexible,omitempty"`
// DisableNotification Optional. Sends the message silently. Users will receive a notification with no
// sound.
DisableNotification bool `json:"disable_notification,omitempty"`
// ProtectContent Optional. Protects the contents of the sent message from forwarding and saving
ProtectContent bool `json:"protect_content,omitempty"`
// AllowPaidBroadcast Optional. Pass True to allow up to 1000 messages per second, ignoring broadcasting
// limits for a fee of 0.1 Telegram Stars per message. The relevant Stars will be withdrawn from the bot's
// balance.
AllowPaidBroadcast bool `json:"allow_paid_broadcast,omitempty"`
// MessageEffectID Optional. Unique identifier of the message effect to be added to the message; for private
// chats only
MessageEffectID string `json:"message_effect_id,omitempty"`
// SuggestedPostParameters Optional. A JSON-serialized object containing the parameters of the suggested
// post to send; for direct messages chats only. If the message is sent as a reply to another suggested
// post, then that suggested post is automatically declined.
SuggestedPostParameters *SuggestedPostParameters `json:"suggested_post_parameters,omitempty"`
ReplyParameters *ReplyParameters `json:"reply_parameters,omitempty"`
ReplyMarkup *InlineKeyboardMarkup `json:"reply_markup,omitempty"`
// ReplyParameters Optional. Description of the message to reply to
ReplyParameters *ReplyParameters `json:"reply_parameters,omitempty"`
// ReplyMarkup Optional. A JSON-serialized object for an inline keyboard. If empty, one 'Pay total price'
// button will be shown. If not empty, the first button must be a Pay button.
ReplyMarkup *InlineKeyboardMarkup `json:"reply_markup,omitempty"`
}
// SendInvoice sends an invoice.
@@ -63,30 +127,77 @@ func (api *API) SendInvoiceWithContext(ctx context.Context, params SendInvoice)
// Since: Bot API 6.1
// See https://core.telegram.org/bots/api#createinvoicelink
type CreateInvoiceLink struct {
// BusinessConnectionID Optional. Unique identifier of the business connection on behalf of which the link
// will be created. For payments in Telegram Stars only.
BusinessConnectionID string `json:"business_connection_id,omitempty"`
Title string `json:"title"`
Description string `json:"description"`
Payload string `json:"payload"`
ProviderToken string `json:"provider_token,omitempty"`
Currency string `json:"currency"`
Prices []LabeledPrice `json:"prices"`
// Title Required. Product name, 1-32 characters
Title string `json:"title"`
// Description Required. Product description, 1-255 characters
Description string `json:"description"`
// Payload Required. Bot-defined invoice payload, 1-128 bytes. This will not be displayed to the user, use
// it for your internal processes.
Payload string `json:"payload"`
// ProviderToken Optional. Payment provider token, obtained via @BotFather. Pass an empty string for
// payments in Telegram Stars.
ProviderToken string `json:"provider_token,omitempty"`
// Currency Required. Three-letter ISO 4217 currency code, see more on currencies. Pass “XTR” for
// payments in Telegram Stars.
Currency string `json:"currency"`
// Prices Required. Price breakdown, a JSON-serialized list of components (e.g. product price, tax,
// discount, delivery cost, delivery tax, bonus, etc.). Must contain exactly one item for payments in
// Telegram Stars.
Prices []LabeledPrice `json:"prices"`
SubscriptionPeriod int `json:"subscription_period,omitempty"`
MaxTipAmount int `json:"max_tip_amount,omitempty"`
SuggestedTipAmounts []int `json:"suggested_tip_amounts,omitempty"`
ProviderData string `json:"provider_data,omitempty"`
PhotoURL string `json:"photo_url,omitempty"`
PhotoSize int `json:"photo_size,omitempty"`
PhotoWidth int `json:"photo_width,omitempty"`
PhotoHeight int `json:"photo_height,omitempty"`
NeedName bool `json:"need_name,omitempty"`
NeedPhoneNumber bool `json:"need_phone_number,omitempty"`
NeedEmail bool `json:"need_email,omitempty"`
NeedShippingAddress bool `json:"need_shipping_address,omitempty"`
SendPhoneToProvider bool `json:"send_phone_number_to_provider,omitempty"`
SendEmailToProvider bool `json:"send_email_to_provider,omitempty"`
IsFlexible bool `json:"is_flexible,omitempty"`
// SubscriptionPeriod Optional. The number of seconds the subscription will be active for before the next
// payment. The currency must be set to “XTR” (Telegram Stars) if the parameter is used. Currently, it
// must always be 2592000 (30 days) if specified. Any number of subscriptions can be active for a given bot
// at the same time, including multiple concurrent subscriptions from the same user. Subscription price must
// no exceed 10000 Telegram Stars.
SubscriptionPeriod int `json:"subscription_period,omitempty"`
// MaxTipAmount Optional. The maximum accepted amount for tips in the smallest units of the currency
// (integer, not float/double). For example, for a maximum tip of US$ 1.45 pass max_tip_amount = 145. See
// the exp parameter in currencies.json, it shows the number of digits past the decimal point for each
// currency (2 for the majority of currencies). Defaults to 0. Not supported for payments in Telegram Stars.
MaxTipAmount int `json:"max_tip_amount,omitempty"`
// SuggestedTipAmounts Optional. A JSON-serialized Array of suggested amounts of tips in the smallest units
// of the currency (integer, not float/double). At most 4 suggested tip amounts can be specified. The
// suggested tip amounts must be positive, passed in a strictly increased order and must not exceed
// max_tip_amount.
SuggestedTipAmounts []int `json:"suggested_tip_amounts,omitempty"`
// ProviderData Optional. JSON-serialized data about the invoice, which will be shared with the payment
// provider. A detailed description of required fields should be provided by the payment provider.
ProviderData string `json:"provider_data,omitempty"`
// PhotoURL Optional. URL of the product photo for the invoice. Can be a photo of the goods or a marketing
// image for a service.
PhotoURL string `json:"photo_url,omitempty"`
// PhotoSize Optional. Photo size in bytes
PhotoSize int `json:"photo_size,omitempty"`
// PhotoWidth Optional. Photo width
PhotoWidth int `json:"photo_width,omitempty"`
// PhotoHeight Optional. Photo height
PhotoHeight int `json:"photo_height,omitempty"`
// NeedName Optional. Pass True if you require the user's full name to complete the order. Ignored for
// payments in Telegram Stars.
NeedName bool `json:"need_name,omitempty"`
// NeedPhoneNumber Optional. Pass True if you require the user's phone number to complete the order. Ignored
// for payments in Telegram Stars.
NeedPhoneNumber bool `json:"need_phone_number,omitempty"`
// NeedEmail Optional. Pass True if you require the user's email address to complete the order. Ignored for
// payments in Telegram Stars.
NeedEmail bool `json:"need_email,omitempty"`
// NeedShippingAddress Optional. Pass True if you require the user's shipping address to complete the order.
// Ignored for payments in Telegram Stars.
NeedShippingAddress bool `json:"need_shipping_address,omitempty"`
// SendPhoneToProvider Optional. Pass True if the user's phone number should be sent to the provider.
// Ignored for payments in Telegram Stars.
SendPhoneToProvider bool `json:"send_phone_number_to_provider,omitempty"`
// SendEmailToProvider Optional. Pass True if the user's email address should be sent to the provider.
// Ignored for payments in Telegram Stars.
SendEmailToProvider bool `json:"send_email_to_provider,omitempty"`
// IsFlexible Optional. Pass True if the final price depends on the shipping method. Ignored for payments in
// Telegram Stars.
IsFlexible bool `json:"is_flexible,omitempty"`
}
// CreateInvoiceLink creates an invoice link.
@@ -110,10 +221,17 @@ func (api *API) CreateInvoiceLinkWithContext(ctx context.Context, params CreateI
// Since: Bot API 3.0
// See https://core.telegram.org/bots/api#answershippingquery
type AnswerShippingQuery struct {
ShippingQueryID string `json:"shipping_query_id"`
OK bool `json:"ok"`
// ShippingQueryID Required. Unique identifier for the query to be answered
ShippingQueryID string `json:"shipping_query_id"`
// OK Required. Pass True if delivery to the specified address is possible and False if there are any
// problems (for example, if delivery to the specified address is not possible)
OK bool `json:"ok"`
// ShippingOptions Optional. Required if ok is True. A JSON-serialized Array of available shipping options.
ShippingOptions []ShippingOption `json:"shipping_options,omitempty"`
ErrorMessage string `json:"error_message,omitempty"`
// ErrorMessage Optional. Required if ok is False. Error message in human readable form that explains why it
// is impossible to complete the order (e.g. “Sorry, delivery to your desired address is unavailable”).
// Telegram will display this message to the user.
ErrorMessage string `json:"error_message,omitempty"`
}
// AnswerShippingQuery answers a shipping query.
@@ -138,9 +256,16 @@ func (api *API) AnswerShippingQueryWithContext(ctx context.Context, params Answe
// Since: Bot API 3.0
// See https://core.telegram.org/bots/api#answerprecheckoutquery
type AnswerPreCheckoutQuery struct {
// PreCheckoutQueryID Required. Unique identifier for the query to be answered
PreCheckoutQueryID string `json:"pre_checkout_query_id"`
OK bool `json:"ok"`
ErrorMessage string `json:"error_message,omitempty"`
// OK Required. Specify True if everything is alright (goods are available, etc.) and the bot is ready to
// proceed with the order. Use False if there are any problems.
OK bool `json:"ok"`
// ErrorMessage Optional. Required if ok is False. Error message in human readable form that explains the
// reason for failure to proceed with the checkout (e.g. "Sorry, somebody just bought the last of our
// amazing black T-shirts while you were busy filling out your payment details. Please choose a different
// color or garment!"). Telegram will display this message to the user.
ErrorMessage string `json:"error_message,omitempty"`
}
// AnswerPreCheckoutQuery answers a pre-checkout query.
+96 -36
View File
@@ -4,27 +4,42 @@ package tgapi
// Since: Bot API 3.0
// See https://core.telegram.org/bots/api#labeledprice
type LabeledPrice struct {
Label string `json:"label"`
Amount int `json:"amount"`
// Label Portion label
Label string `json:"label"`
// Amount Price of the product in the smallest units of the currency (integer, not float/double). For
// example, for a price of US$ 1.45 pass amount = 145. See the exp parameter in currencies.json, it shows
// the number of digits past the decimal point for each currency (2 for the majority of currencies).
Amount int `json:"amount"`
}
// Invoice contains basic information about an invoice.
// Since: Bot API 3.0
type Invoice struct {
Title string `json:"title"`
Description string `json:"description"`
// Title Product name
Title string `json:"title"`
// Description Product description
Description string `json:"description"`
// StartParameter Unique bot deep-linking parameter that can be used to generate this invoice
StartParameter string `json:"start_parameter"`
Currency string `json:"currency"`
TotalAmount int `json:"total_amount"`
// Currency Three-letter ISO 4217 currency code, or “XTR” for payments in Telegram Stars
Currency string `json:"currency"`
// TotalAmount Total price in the smallest units of the currency (integer, not float/double). For example,
// for a price of US$ 1.45 pass amount = 145. See the exp parameter in currencies.json, it shows the number
// of digits past the decimal point for each currency (2 for the majority of currencies).
TotalAmount int `json:"total_amount"`
}
// ShippingQuery represents an incoming shipping query.
// Since: Bot API 3.0
// See https://core.telegram.org/bots/api#shippingquery
type ShippingQuery struct {
ID string `json:"id"`
From User `json:"from"`
InvoicePayload string `json:"invoice_payload"`
// ID Unique query identifier
ID string `json:"id"`
// From User who sent the query
From User `json:"from"`
// InvoicePayload Bot-specified invoice payload
InvoicePayload string `json:"invoice_payload"`
// ShippingAddress User specified shipping address
ShippingAddress ShippingAddress `json:"shipping_address"`
}
@@ -32,21 +47,31 @@ type ShippingQuery struct {
// Since: Bot API 3.0
// See https://core.telegram.org/bots/api#shippingaddress
type ShippingAddress struct {
// CountryCode Two-letter ISO 3166-1 alpha-2 country code
CountryCode string `json:"country_code"`
State string `json:"state"`
City string `json:"city"`
// State State, if applicable
State string `json:"state"`
// City City
City string `json:"city"`
// StreetLine1 First line for the address
StreetLine1 string `json:"street_line1"`
// StreetLine2 Second line for the address
StreetLine2 string `json:"street_line2"`
PostCode string `json:"post_code"`
// PostCode Address post code
PostCode string `json:"post_code"`
}
// OrderInfo represents information about an order.
// Since: Bot API 3.0
// See https://core.telegram.org/bots/api#orderinfo
type OrderInfo struct {
Name string `json:"name"`
PhoneNumber string `json:"phone_number"`
Email string `json:"email"`
// Name Optional. User name
Name string `json:"name"`
// PhoneNumber Optional. User's phone number
PhoneNumber string `json:"phone_number"`
// Email Optional. User email
Email string `json:"email"`
// ShippingAddress Optional. User shipping address
ShippingAddress ShippingAddress `json:"shipping_address"`
}
@@ -54,20 +79,31 @@ type OrderInfo struct {
// Since: Bot API 3.0
// See https://core.telegram.org/bots/api#precheckoutquery
type PreCheckoutQuery struct {
ID string `json:"id"`
From User `json:"from"`
Currency string `json:"currency"`
TotalAmount int `json:"total_amount"`
InvoicePayload string `json:"invoice_payload"`
ShippingOptionID string `json:"shipping_option_id"`
OrderInfo *OrderInfo `json:"order_info,omitempty"`
// ID Unique query identifier
ID string `json:"id"`
// From User who sent the query
From User `json:"from"`
// Currency Three-letter ISO 4217 currency code, or “XTR” for payments in Telegram Stars
Currency string `json:"currency"`
// TotalAmount Total price in the smallest units of the currency (integer, not float/double). For example,
// for a price of US$ 1.45 pass amount = 145. See the exp parameter in currencies.json, it shows the number
// of digits past the decimal point for each currency (2 for the majority of currencies).
TotalAmount int `json:"total_amount"`
// InvoicePayload Bot-specified invoice payload
InvoicePayload string `json:"invoice_payload"`
// ShippingOptionID Optional. Identifier of the shipping option chosen by the user
ShippingOptionID string `json:"shipping_option_id"`
// OrderInfo Optional. Order information provided by the user
OrderInfo *OrderInfo `json:"order_info,omitempty"`
}
// PaidMediaPurchased represents a purchased paid media.
// Since: Bot API 7.10
// See https://core.telegram.org/bots/api#paidmediapurchased
type PaidMediaPurchased struct {
From User `json:"from"`
// From User who purchased the media
From User `json:"from"`
// PaidMediaPayload Bot-specified paid media payload
PaidMediaPayload string `json:"paid_media_payload"`
}
@@ -75,35 +111,59 @@ type PaidMediaPurchased struct {
// Since: Bot API 3.0
// See https://core.telegram.org/bots/api#shippingoption
type ShippingOption struct {
ID string `json:"id"`
Title string `json:"title"`
// ID Shipping option identifier
ID string `json:"id"`
// Title Option title
Title string `json:"title"`
// Prices List of price portions
Prices []LabeledPrice `json:"prices"`
}
// SuccessfulPayment contains basic information about a successful payment.
// Since: Bot API 3.0
type SuccessfulPayment struct {
Currency string `json:"currency"`
TotalAmount int `json:"total_amount"`
// Currency Three-letter ISO 4217 currency code, or “XTR” for payments in Telegram Stars
Currency string `json:"currency"`
// TotalAmount Total price in the smallest units of the currency (integer, not float/double). For example,
// for a price of US$ 1.45 pass amount = 145. See the exp parameter in currencies.json, it shows the number
// of digits past the decimal point for each currency (2 for the majority of currencies).
TotalAmount int `json:"total_amount"`
// InvoicePayload Bot-specified invoice payload
InvoicePayload string `json:"invoice_payload"`
SubscriptionExpirationDate int `json:"subscription_expiration_date,omitempty"` // Since: Bot API 8.0
IsRecurring bool `json:"is_recurring,omitempty"` // Since: Bot API 8.0
IsFirstRecurring bool `json:"is_first_recurring,omitempty"` // Since: Bot API 8.0
ShippingOptionID string `json:"shipping_option_id,omitempty"`
OrderInfo *OrderInfo `json:"order_info,omitempty"`
// SubscriptionExpirationDate Optional. Expiration date of the subscription, in Unix time; for recurring
// payments only
SubscriptionExpirationDate int `json:"subscription_expiration_date,omitempty"` // Since: Bot API 8.0
// IsRecurring Optional. True, if the payment is a recurring payment for a subscription
IsRecurring bool `json:"is_recurring,omitempty"` // Since: Bot API 8.0
// IsFirstRecurring Optional. True, if the payment is the first payment for a subscription
IsFirstRecurring bool `json:"is_first_recurring,omitempty"` // Since: Bot API 8.0
// ShippingOptionID Optional. Identifier of the shipping option chosen by the user
ShippingOptionID string `json:"shipping_option_id,omitempty"`
// OrderInfo Optional. Order information provided by the user
OrderInfo *OrderInfo `json:"order_info,omitempty"`
// TelegramPaymentChargeID Telegram payment identifier
TelegramPaymentChargeID string `json:"telegram_payment_charge_id"`
ProviderPaymentChargeID string `json:"proviced_payment_charge_id"`
// ProviderPaymentChargeID Provider payment identifier
ProviderPaymentChargeID string `json:"provider_payment_charge_id"`
}
// RefundedPayment contains basic information about a refunded payment.
// Since: Bot API 7.7
type RefundedPayment struct {
Currency string `json:"currency"`
TotalAmount int `json:"total_amount"`
// Currency Three-letter ISO 4217 currency code, or “XTR” for payments in Telegram Stars. Currently,
// always “XTR”.
Currency string `json:"currency"`
// TotalAmount Total refunded price in the smallest units of the currency (integer, not float/double). For
// example, for a price of US$ 1.45, total_amount = 145. See the exp parameter in currencies.json, it shows
// the number of digits past the decimal point for each currency (2 for the majority of currencies).
TotalAmount int `json:"total_amount"`
// InvoicePayload Bot-specified invoice payload
InvoicePayload string `json:"invoice_payload"`
// TelegramPaymentChargeID Telegram payment identifier
TelegramPaymentChargeID string `json:"telegram_payment_charge_id"`
ProviderPaymentChargeID string `json:"proviced_payment_charge_id,omitempty"`
// ProviderPaymentChargeID Optional. Provider payment identifier
ProviderPaymentChargeID string `json:"provider_payment_charge_id,omitempty"`
}
+11 -6
View File
@@ -2,6 +2,7 @@ package tgapi
import (
"context"
"fmt"
"sync"
)
@@ -126,10 +127,14 @@ func (p *workerPool) worker() {
}
func (p *workerPool) executeEnvelope(envelope requestEnvelope) {
value, err := envelope.doFunc(envelope.ctx)
envelope.resultCh <- requestResult{
value: value,
err: err,
}
close(envelope.resultCh)
result := requestResult{}
defer func() {
if recovered := recover(); recovered != nil {
result.value = nil
result.err = fmt.Errorf("%w: %v", ErrPoolWorkerPanic, recovered)
}
envelope.resultCh <- result
close(envelope.resultCh)
}()
result.value, result.err = envelope.doFunc(envelope.ctx)
}
+28
View File
@@ -18,6 +18,34 @@ func TestWorkerPoolSubmitAfterStop(t *testing.T) {
}
}
func TestWorkerPoolRecoversTaskPanicAndContinues(t *testing.T) {
pool := newWorkerPool(1, 2)
pool.start()
defer pool.stop()
panicked, err := pool.submit(context.Background(), func(context.Context) (any, error) {
panic("boom")
})
if err != nil {
t.Fatalf("submit panic task returned error: %v", err)
}
result := <-panicked
if !errors.Is(result.err, ErrPoolWorkerPanic) {
t.Fatalf("expected ErrPoolWorkerPanic, got %v", result.err)
}
continued, err := pool.submit(context.Background(), func(context.Context) (any, error) {
return "ok", nil
})
if err != nil {
t.Fatalf("submit follow-up returned error: %v", err)
}
result = <-continued
if result.err != nil || result.value != "ok" {
t.Fatalf("worker did not continue: %#v", result)
}
}
func TestWorkerPoolQueueFull(t *testing.T) {
pool := newWorkerPool(1, 1)
pool.start()
+11 -5
View File
@@ -66,8 +66,10 @@ type RichBlockListItem struct {
HasCheckbox bool
// IsChecked reports whether the list-item checkbox is checked.
IsChecked bool
Value int // for ordered lists: numeric value of the marker
Type RichBlockListItemType // for ordered lists: "a", "A", "i", "I" or "1"
// Value is the numeric marker value for an ordered list item.
Value int // for ordered lists: numeric value of the marker
// Type selects the ordered-list marker style: a, A, i, I, or 1.
Type RichBlockListItemType // for ordered lists: "a", "A", "i", "I" or "1"
}
// MarshalJSON implements json.Marshaler.
@@ -119,8 +121,10 @@ type RichBlockTableCell struct {
ColSpan int
// RowSpan is the number of table rows spanned by the cell.
RowSpan int
Align string // "left", "center" or "right"
VAlign string // "top", "middle" or "bottom"
// Align is the horizontal alignment: left, center, or right.
Align string // "left", "center" or "right"
// VAlign is the vertical alignment: top, middle, or bottom.
VAlign string // "top", "middle" or "bottom"
}
// MarshalJSON implements json.Marshaler.
@@ -192,6 +196,7 @@ var richBlockWrapTags = map[string]bool{
type RichBlockSectionHeading struct {
// Text contains the formatted or plain text content.
Text RichText
// Size is the heading level from 1 through 6, where 1 is largest.
Size int // 1-6, 1 is the largest
}
@@ -405,7 +410,8 @@ func (b RichBlockTable) MarshalJSON() ([]byte, error) {
type RichBlockMap struct {
// Location contains the map location.
Location Location
Zoom int // 13-20
// Zoom is the map zoom level in the range 13 through 20.
Zoom int // 13-20
// Width is the requested media or map width in pixels.
Width int
// Height is the requested media or map height in pixels.
+94 -6
View File
@@ -3,16 +3,31 @@ package tgapi
import (
"bytes"
"encoding/json"
"errors"
"fmt"
"io"
)
const (
maximumRichJSONDepth = 64
maximumRichJSONNodes = 10_000
)
// UnmarshalRichText parses a RichText tree from JSON: a string, an array, or
// a typed object. Unknown object types that carry a text field are preserved
// as RichTextWrap so their nested text remains usable; unmodeled fields are
// discarded.
// discarded. The fallback representation is subject to change in v2 so unknown
// fields can be preserved losslessly.
//
// Since: Bot API 10.1
func UnmarshalRichText(data []byte) (RichText, error) {
if err := validateRichJSON(data); err != nil {
return nil, err
}
return unmarshalRichText(data)
}
func unmarshalRichText(data []byte) (RichText, error) {
if bytes.Equal(bytes.TrimSpace(data), []byte("null")) {
return nil, fmt.Errorf("richtext: null is not a rich text value")
}
@@ -26,7 +41,7 @@ func UnmarshalRichText(data []byte) (RichText, error) {
if err := json.Unmarshal(data, &raw); err == nil {
arr := make(RichTextArray, len(raw))
for i, it := range raw {
rt, err := UnmarshalRichText(it)
rt, err := unmarshalRichText(it)
if err != nil {
return nil, err
}
@@ -47,7 +62,7 @@ func UnmarshalRichText(data []byte) (RichText, error) {
var inner RichText
if len(head.Text) > 0 {
var err error
if inner, err = UnmarshalRichText(head.Text); err != nil {
if inner, err = unmarshalRichText(head.Text); err != nil {
return nil, fmt.Errorf("richtext %q: bad text: %w", head.Type, err)
}
}
@@ -202,10 +217,18 @@ func UnmarshalRichText(data []byte) (RichText, error) {
// UnmarshalRichBlock parses a single RichBlock from JSON, dispatching on the
// type tag. Unknown types that carry a text field are decoded as RichBlockWrap
// so their nested text remains usable; unmodeled fields are discarded.
// so their nested text remains usable; unmodeled fields are discarded. The
// fallback representation is subject to change in v2 for lossless round trips.
//
// Since: Bot API 10.1
func UnmarshalRichBlock(data []byte) (RichBlock, error) {
if err := validateRichJSON(data); err != nil {
return nil, err
}
return unmarshalRichBlock(data)
}
func unmarshalRichBlock(data []byte) (RichBlock, error) {
var head struct {
Type string `json:"type"`
Text json.RawMessage `json:"text"`
@@ -454,8 +477,19 @@ func UnmarshalRichBlock(data []byte) (RichBlock, error) {
// UnmarshalRichMessage parses a root RichMessage from JSON.
//
// For v1 compatibility, missing and null blocks are accepted as an empty
// message. This permissive behavior is subject to change in v2; use
// UnmarshalRichMessageStrict when validating untrusted input.
//
// Since: Bot API 10.1
func UnmarshalRichMessage(data []byte) (RichMessage, error) {
if err := validateRichJSON(data); err != nil {
return RichMessage{}, err
}
return unmarshalRichMessage(data)
}
func unmarshalRichMessage(data []byte) (RichMessage, error) {
var raw struct {
Blocks json.RawMessage `json:"blocks"`
IsRTL bool `json:"is_rtl"`
@@ -470,6 +504,28 @@ func UnmarshalRichMessage(data []byte) (RichMessage, error) {
return RichMessage{blocks, raw.IsRTL}, nil
}
// UnmarshalRichMessageStrict parses a RichMessage and requires a non-null blocks array.
//
// Since: Bot API 10.1
func UnmarshalRichMessageStrict(data []byte) (RichMessage, error) {
if err := validateRichJSON(data); err != nil {
return RichMessage{}, err
}
var root map[string]json.RawMessage
if err := json.Unmarshal(data, &root); err != nil {
return RichMessage{}, fmt.Errorf("richmessage: %w", err)
}
blocks, ok := root["blocks"]
if !ok || bytes.Equal(bytes.TrimSpace(blocks), []byte("null")) {
return RichMessage{}, errors.New("richmessage: blocks must be a non-null array")
}
var rawBlocks []json.RawMessage
if err := json.Unmarshal(blocks, &rawBlocks); err != nil {
return RichMessage{}, errors.New("richmessage: blocks must be an array")
}
return unmarshalRichMessage(data)
}
// UnmarshalJSON implements json.Unmarshaler.
//
// Since: Bot API 10.1
@@ -491,7 +547,7 @@ func parseOptRichText(raw json.RawMessage) (RichText, error) {
if len(raw) == 0 || string(raw) == "null" {
return nil, nil
}
return UnmarshalRichText(raw)
return unmarshalRichText(raw)
}
func unmarshalRichBlocks(raw json.RawMessage) ([]RichBlock, error) {
@@ -504,7 +560,7 @@ func unmarshalRichBlocks(raw json.RawMessage) ([]RichBlock, error) {
}
blocks := make([]RichBlock, len(raws))
for i, r := range raws {
b, err := UnmarshalRichBlock(r)
b, err := unmarshalRichBlock(r)
if err != nil {
return nil, err
}
@@ -512,3 +568,35 @@ func unmarshalRichBlocks(raw json.RawMessage) ([]RichBlock, error) {
}
return blocks, nil
}
func validateRichJSON(data []byte) error {
decoder := json.NewDecoder(bytes.NewReader(data))
depth := 0
nodes := 0
for {
token, err := decoder.Token()
if errors.Is(err, io.EOF) {
return nil
}
if err != nil {
return err
}
nodes++
if nodes > maximumRichJSONNodes {
return fmt.Errorf("%w: maximum %d", ErrRichJSONNodes, maximumRichJSONNodes)
}
delim, ok := token.(json.Delim)
if !ok {
continue
}
switch delim {
case '{', '[':
depth++
if depth > maximumRichJSONDepth {
return fmt.Errorf("%w: maximum %d", ErrRichJSONDepth, maximumRichJSONDepth)
}
case '}', ']':
depth--
}
}
}
+26
View File
@@ -2,6 +2,7 @@ package tgapi
import (
"encoding/json"
"errors"
"strings"
"testing"
)
@@ -266,3 +267,28 @@ func TestUnmarshalRichBlockRejectsMalformedFields(t *testing.T) {
})
}
}
func TestUnmarshalRichMessageStrict(t *testing.T) {
for _, raw := range []string{`null`, `{}`, `{"blocks":null}`, `{"blocks":{}}`} {
t.Run(raw, func(t *testing.T) {
if _, err := UnmarshalRichMessageStrict([]byte(raw)); err == nil {
t.Fatal("expected strict decoder error")
}
})
}
if _, err := UnmarshalRichMessageStrict([]byte(`{"blocks":[]}`)); err != nil {
t.Fatalf("strict decoder rejected an empty blocks array: %v", err)
}
}
func TestRichJSONStructuralLimits(t *testing.T) {
deep := strings.Repeat("[", maximumRichJSONDepth+1) + `"x"` + strings.Repeat("]", maximumRichJSONDepth+1)
if _, err := UnmarshalRichText([]byte(deep)); !errors.Is(err, ErrRichJSONDepth) {
t.Fatalf("expected ErrRichJSONDepth, got %v", err)
}
wide := "[" + strings.Repeat("0,", maximumRichJSONNodes) + "0]"
if _, err := UnmarshalRichText([]byte(wide)); !errors.Is(err, ErrRichJSONNodes) {
t.Fatalf("expected ErrRichJSONNodes, got %v", err)
}
}
+14 -4
View File
@@ -6,8 +6,11 @@ import "context"
// Since: Bot API 7.5
// See https://core.telegram.org/bots/api#getstartransactions
type GetStarTransactions struct {
// Offset Optional. Number of transactions to skip in the response
Offset int `json:"offset,omitempty"`
Limit int `json:"limit,omitempty"`
// Limit Optional. The maximum number of transactions to be retrieved. Values between 1-100 are accepted.
// Defaults to 100.
Limit int `json:"limit,omitempty"`
}
// GetMyStarBalance returns the bot's Telegram Star balance.
@@ -48,7 +51,9 @@ func (api *API) GetStarTransactionsWithContext(ctx context.Context, params GetSt
// Since: Bot API 7.4
// See https://core.telegram.org/bots/api#refundstarpayment
type RefundStarPayment struct {
UserID int64 `json:"user_id"`
// UserID Required. Identifier of the user whose payment will be refunded
UserID int64 `json:"user_id"`
// TelegramPaymentChargeID Required. Telegram payment identifier
TelegramPaymentChargeID string `json:"telegram_payment_charge_id"`
}
@@ -74,9 +79,14 @@ func (api *API) RefundStarPaymentWithContext(ctx context.Context, params RefundS
// Since: Bot API 8.0
// See https://core.telegram.org/bots/api#edituserstarsubscription
type EditUserStarSubscription struct {
UserID int64 `json:"user_id"`
// UserID Required. Identifier of the user whose subscription will be edited
UserID int64 `json:"user_id"`
// TelegramPaymentChargeID Required. Telegram payment identifier for the subscription
TelegramPaymentChargeID string `json:"telegram_payment_charge_id"`
IsCanceled bool `json:"is_canceled"`
// IsCanceled Required. Pass True to cancel extension of the user subscription; the subscription must be
// active up to the end of the current subscription period. Pass False to allow the user to re-enable a
// subscription that was previously canceled by the bot.
IsCanceled bool `json:"is_canceled"`
}
// EditUserStarSubscription cancels or re-enables a user star subscription extension.
+18 -6
View File
@@ -4,17 +4,29 @@ package tgapi
// Since: Bot API 7.5
// See https://core.telegram.org/bots/api#startransaction
type StarTransaction struct {
ID string `json:"id"`
Amount int `json:"amount"`
NanostarAmount int `json:"nanostar_amount,omitempty"`
Date int `json:"date"`
Source map[string]any `json:"source,omitempty"`
Receiver map[string]any `json:"receiver,omitempty"`
// ID Unique identifier of the transaction. Coincides with the identifier of the original transaction for
// refund transactions. Coincides with SuccessfulPayment.telegram_payment_charge_id for successful incoming
// payments from users.
ID string `json:"id"`
// Amount Integer amount of Telegram Stars transferred by the transaction
Amount int `json:"amount"`
// NanostarAmount Optional. The number of 1/1000000000 shares of Telegram Stars transferred by the
// transaction; from 0 to 999999999
NanostarAmount int `json:"nanostar_amount,omitempty"`
// Date Date the transaction was created in Unix time
Date int `json:"date"`
// Source Optional. Source of an incoming transaction (e.g., a user purchasing goods or services, Fragment
// refunding a failed withdrawal). Only for incoming transactions.
Source map[string]any `json:"source,omitempty"`
// Receiver Optional. Receiver of an outgoing transaction (e.g., a user for a purchase refund, Fragment for
// a withdrawal). Only for outgoing transactions.
Receiver map[string]any `json:"receiver,omitempty"`
}
// StarTransactions contains a list of Telegram Star transactions.
// Since: Bot API 7.5
// See https://core.telegram.org/bots/api#startransactions
type StarTransactions struct {
// Transactions The list of transactions
Transactions []StarTransaction `json:"transactions"`
}
+118 -36
View File
@@ -6,25 +6,52 @@ import "context"
// Since: Bot API 1.3
// See https://core.telegram.org/bots/api#sendsticker
type SendSticker struct {
BusinessConnectionID string `json:"business_connection_id,omitempty"`
ChatID int64 `json:"chat_id"`
MessageThreadID int `json:"message_thread_id,omitempty"`
DirectMessagesTopicID int `json:"direct_messages_topic_id,omitempty"`
// BusinessConnectionID Optional. Unique identifier of the business connection on behalf of which the
// message will be sent
BusinessConnectionID string `json:"business_connection_id,omitempty"`
// ChatID Required. Unique identifier for the target chat or username of the target bot, supergroup or
// channel in the format @username
ChatID int64 `json:"chat_id"`
// MessageThreadID Optional. Unique identifier for the target message thread (topic) of a forum; for forum
// supergroups and private chats of bots with forum topic mode enabled only
MessageThreadID int `json:"message_thread_id,omitempty"`
// DirectMessagesTopicID Optional. Identifier of the direct messages topic to which the message will be
// sent; required if the message is sent to a direct messages chat
DirectMessagesTopicID int `json:"direct_messages_topic_id,omitempty"`
// ReceiverUserID identifies the user who can see the ephemeral message.
ReceiverUserID int64 `json:"receiver_user_id,omitempty"` // Since: Bot API 10.2
// CallbackQueryID identifies the callback query that triggered an ephemeral response.
CallbackQueryID string `json:"callback_query_id,omitempty"` // Since: Bot API 10.2
Sticker string `json:"sticker"`
Emoji string `json:"emoji,omitempty"`
DisableNotification bool `json:"disable_notification,omitempty"`
ProtectContent bool `json:"protect_content,omitempty"`
AllowPaidBroadcast bool `json:"allow_paid_broadcast,omitempty"`
MessageEffectID string `json:"message_effect_id,omitempty"`
// Sticker Required. Sticker to send. Pass a file_id as String to send a file that exists on the Telegram
// servers (recommended), pass an HTTP URL as a String for Telegram to get a .WEBP sticker from the
// Internet, or upload a new .WEBP, .TGS, or .WEBM sticker using multipart/form-data. More information on
// Sending Files ». Video and animated stickers can't be sent via an HTTP URL.
Sticker string `json:"sticker"`
// Emoji Optional. Emoji associated with the sticker; only for just uploaded stickers
Emoji string `json:"emoji,omitempty"`
// DisableNotification Optional. Sends the message silently. Users will receive a notification with no
// sound.
DisableNotification bool `json:"disable_notification,omitempty"`
// ProtectContent Optional. Protects the contents of the sent message from forwarding and saving
ProtectContent bool `json:"protect_content,omitempty"`
// AllowPaidBroadcast Optional. Pass True to allow up to 1000 messages per second, ignoring broadcasting
// limits for a fee of 0.1 Telegram Stars per message. The relevant Stars will be withdrawn from the bot's
// balance.
AllowPaidBroadcast bool `json:"allow_paid_broadcast,omitempty"`
// MessageEffectID Optional. Unique identifier of the message effect to be added to the message; for private
// chats only
MessageEffectID string `json:"message_effect_id,omitempty"`
// SuggestedPostParameters Optional. A JSON-serialized object containing the parameters of the suggested
// post to send; for direct messages chats only. If the message is sent as a reply to another suggested
// post, then that suggested post is automatically declined.
SuggestedPostParameters *SuggestedPostParameters `json:"suggested_post_parameters,omitempty"`
ReplyParameters *ReplyParameters `json:"reply_parameters,omitempty"`
ReplyMarkup *ReplyMarkup `json:"reply_markup,omitempty"`
// ReplyParameters Optional. Description of the message to reply to
ReplyParameters *ReplyParameters `json:"reply_parameters,omitempty"`
// ReplyMarkup Optional. Additional interface options. A JSON-serialized object for an inline keyboard,
// custom reply keyboard, instructions to remove a reply keyboard or to force a reply from the user.
ReplyMarkup *ReplyMarkup `json:"reply_markup,omitempty"`
}
// SendSticker sends a static .WEBP, animated .TGS, or video .WEBM sticker.
@@ -48,6 +75,7 @@ func (api *API) SendStickerWithContext(ctx context.Context, params SendSticker)
// Since: Bot API 3.2
// See https://core.telegram.org/bots/api#getstickerset
type GetStickerSet struct {
// Name Required. Name of the sticker set
Name string `json:"name"`
}
@@ -72,6 +100,8 @@ func (api *API) GetStickerSetWithContext(ctx context.Context, params GetStickerS
// Since: Bot API 6.2
// See https://core.telegram.org/bots/api#getcustomemojistickers
type GetCustomEmojiStickers struct {
// CustomEmojiIDs Required. A JSON-serialized list of custom emoji identifiers. At most 200 custom emoji
// identifiers can be specified.
CustomEmojiIDs []string `json:"custom_emoji_ids"`
}
@@ -96,7 +126,9 @@ func (api *API) GetCustomEmojiStickersWithContext(ctx context.Context, params Ge
// Since: Bot API 3.2
// See https://core.telegram.org/bots/api#uploadstickerfile
type UploadStickerFile struct {
UserID int64 `json:"user_id"`
// UserID Required. User identifier of sticker file owner
UserID int64 `json:"user_id"`
// StickerFormat Required. Format of the sticker, must be one of “static”, “animated”, “video”
StickerFormat InputStickerFormat `json:"sticker_format"`
}
@@ -130,13 +162,24 @@ func (api *API) UploadStickerFileWithContext(ctx context.Context, params UploadS
// Since: Bot API 3.2
// See https://core.telegram.org/bots/api#createnewstickerset
type CreateNewStickerSet struct {
UserID int64 `json:"user_id"`
Name string `json:"name"`
Title string `json:"title"`
// UserID Required. User identifier of created sticker set owner
UserID int64 `json:"user_id"`
// Name Required. Short name of sticker set, to be used in t.me/addstickers/ URLs (e.g., animals). Can
// contain only English letters, digits and underscores. Must begin with a letter, can't contain consecutive
// underscores and must end in "_by_<bot_username>". <bot_username> is case insensitive. 1-64 characters.
Name string `json:"name"`
// Title Required. Sticker set title, 1-64 characters
Title string `json:"title"`
Stickers []InputSticker `json:"stickers"`
StickerType StickerType `json:"sticker_type,omitempty"`
NeedsRepainting bool `json:"needs_repainting,omitempty"`
// Stickers Required. A JSON-serialized list of 1-50 initial stickers to be added to the sticker set
Stickers []InputSticker `json:"stickers"`
// StickerType Optional. Type of stickers in the set, pass “regular”, “mask”, or “custom_emoji”.
// By default, a regular sticker set is created.
StickerType StickerType `json:"sticker_type,omitempty"`
// NeedsRepainting Optional. Pass True if stickers in the sticker set must be repainted to the color of text
// when used in messages, the accent color if used as emoji status, white on chat photos, or another
// appropriate color based on context; for custom emoji sticker sets only
NeedsRepainting bool `json:"needs_repainting,omitempty"`
}
// CreateNewStickerSet creates a new sticker set owned by a user.
@@ -161,8 +204,12 @@ func (api *API) CreateNewStickerSetWithContext(ctx context.Context, params Creat
// Since: Bot API 3.2
// See https://core.telegram.org/bots/api#addstickertoset
type AddStickerToSet struct {
UserID int64 `json:"user_id"`
Name string `json:"name"`
// UserID Required. User identifier of sticker set owner
UserID int64 `json:"user_id"`
// Name Required. Sticker set name
Name string `json:"name"`
// Sticker Required. A JSON-serialized object with information about the added sticker. If exactly the same
// sticker had already been added to the set, then the set isn't changed.
Sticker InputSticker `json:"sticker"`
}
@@ -188,8 +235,10 @@ func (api *API) AddStickerToSetWithContext(ctx context.Context, params AddSticke
// Since: Bot API 3.2
// See https://core.telegram.org/bots/api#setstickerpositioninset
type SetStickerPositionInSet struct {
Sticker string `json:"sticker"`
Position int `json:"position"`
// Sticker Required. File identifier of the sticker
Sticker string `json:"sticker"`
// Position Required. New sticker position in the set, zero-based
Position int `json:"position"`
}
// SetStickerPositionInSet moves a sticker in a set to a specific position.
@@ -214,6 +263,7 @@ func (api *API) SetStickerPositionInSetWithContext(ctx context.Context, params S
// Since: Bot API 3.2
// See https://core.telegram.org/bots/api#deletestickerfromset
type DeleteStickerFromSet struct {
// Sticker Required. File identifier of the sticker
Sticker string `json:"sticker"`
}
@@ -239,10 +289,15 @@ func (api *API) DeleteStickerFromSetWithContext(ctx context.Context, params Dele
// Since: Bot API 7.2
// See https://core.telegram.org/bots/api#replacestickerinset
type ReplaceStickerInSet struct {
UserID int64 `json:"user_id"`
Name string `json:"name"`
OldSticker string `json:"old_sticker"`
Sticker InputSticker `json:"sticker"`
// UserID Required. User identifier of the sticker set owner
UserID int64 `json:"user_id"`
// Name Required. Sticker set name
Name string `json:"name"`
// OldSticker Required. File identifier of the replaced sticker
OldSticker string `json:"old_sticker"`
// Sticker Required. A JSON-serialized object with information about the added sticker. If exactly the same
// sticker had already been added to the set, then the set remains unchanged.
Sticker InputSticker `json:"sticker"`
}
// ReplaceStickerInSet replaces an existing sticker in a set with a new one.
@@ -267,7 +322,9 @@ func (api *API) ReplaceStickerInSetWithContext(ctx context.Context, params Repla
// Since: Bot API 6.6
// See https://core.telegram.org/bots/api#setstickeremojilist
type SetStickerEmojiList struct {
Sticker string `json:"sticker"`
// Sticker Required. File identifier of the sticker
Sticker string `json:"sticker"`
// EmojiList Required. A JSON-serialized list of 1-20 emoji associated with the sticker
EmojiList []string `json:"emoji_list"`
}
@@ -293,7 +350,10 @@ func (api *API) SetStickerEmojiListWithContext(ctx context.Context, params SetSt
// Since: Bot API 6.6
// See https://core.telegram.org/bots/api#setstickerkeywords
type SetStickerKeywords struct {
Sticker string `json:"sticker"`
// Sticker Required. File identifier of the sticker
Sticker string `json:"sticker"`
// Keywords Optional. A JSON-serialized list of 0-20 search keywords for the sticker with total length of up
// to 64 characters
Keywords []string `json:"keywords"`
}
@@ -319,7 +379,10 @@ func (api *API) SetStickerKeywordsWithContext(ctx context.Context, params SetSti
// Since: Bot API 6.6
// See https://core.telegram.org/bots/api#setstickermaskposition
type SetStickerMaskPosition struct {
Sticker string `json:"sticker"`
// Sticker Required. File identifier of the sticker
Sticker string `json:"sticker"`
// MaskPosition Optional. A JSON-serialized object with the position where the mask should be placed on
// faces. Omit the parameter to remove the mask position.
MaskPosition *MaskPosition `json:"mask_position,omitempty"`
}
@@ -345,7 +408,9 @@ func (api *API) SetStickerMaskPositionWithContext(ctx context.Context, params Se
// Since: Bot API 6.6
// See https://core.telegram.org/bots/api#setstickersettitle
type SetStickerSetTitle struct {
Name string `json:"name"`
// Name Required. Sticker set name
Name string `json:"name"`
// Title Required. Sticker set title, 1-64 characters
Title string `json:"title"`
}
@@ -371,10 +436,23 @@ func (api *API) SetStickerSetTitleWithContext(ctx context.Context, params SetSti
// Since: Bot API 6.6
// See https://core.telegram.org/bots/api#setstickersetthumbnail
type SetStickerSetThumbnail struct {
Name string `json:"name"`
UserID int64 `json:"user_id"`
Thumbnail string `json:"thumbnail"`
Format InputStickerFormat `json:"format"`
// Name Required. Sticker set name
Name string `json:"name"`
// UserID Required. User identifier of the sticker set owner
UserID int64 `json:"user_id"`
// Thumbnail Optional. A .WEBP or .PNG image with the thumbnail, must be up to 128 kilobytes in size and
// have a width and height of exactly 100px, or a .TGS animation with a thumbnail up to 32 kilobytes in size
// (see https://core.telegram.org/stickers#animation-requirements for animated sticker technical
// requirements), or a .WEBM video with the thumbnail up to 32 kilobytes in size; see
// https://core.telegram.org/stickers#video-requirements for video sticker technical requirements. Pass a
// file_id as a String to send a file that already exists on the Telegram servers, pass an HTTP URL as a
// String for Telegram to get a file from the Internet, or upload a new one using multipart/form-data. More
// information on Sending Files ». Animated and video sticker set thumbnails can't be uploaded via HTTP
// URL. If omitted, then the thumbnail is dropped and the first sticker is used as the thumbnail.
Thumbnail string `json:"thumbnail"`
// Format Required. Format of the thumbnail, must be one of “static” for a .WEBP or .PNG image,
// “animated” for a .TGS animation, or “video” for a .WEBM video
Format InputStickerFormat `json:"format"`
}
// SetStickerSetThumbnail sets the thumbnail of a sticker set.
@@ -399,7 +477,10 @@ func (api *API) SetStickerSetThumbnailWithContext(ctx context.Context, params Se
// Since: Bot API 6.6
// See https://core.telegram.org/bots/api#setcustomemojistickersetthumbnail
type SetCustomEmojiStickerSetThumbnail struct {
Name string `json:"name"`
// Name Required. Sticker set name
Name string `json:"name"`
// CustomEmojiID Optional. Custom emoji identifier of a sticker from the sticker set; pass an empty string
// to drop the thumbnail and use the first sticker as the thumbnail
CustomEmojiID string `json:"custom_emoji_id,omitempty"`
}
@@ -425,6 +506,7 @@ func (api *API) SetCustomEmojiStickerSetThumbnailWithContext(ctx context.Context
// Since: Bot API 6.6
// See https://core.telegram.org/bots/api#deletestickerset
type DeleteStickerSet struct {
// Name Required. Sticker set name
Name string `json:"name"`
}
+64 -26
View File
@@ -18,10 +18,17 @@ const (
// Since: Bot API 3.2
// See https://core.telegram.org/bots/api#maskposition
type MaskPosition struct {
Point MaskPositionPoint `json:"point"`
XShift float32 `json:"x_shift"`
YShift float32 `json:"y_shift"`
Scale float32 `json:"scale"`
// Point The part of the face relative to which the mask should be placed. One of “forehead”,
// “eyes”, “mouth”, or “chin”.
Point MaskPositionPoint `json:"point"`
// XShift Shift by X-axis measured in widths of the mask scaled to the face size, from left to right. For
// example, choosing -1.0 will place mask just to the left of the default mask position.
XShift float32 `json:"x_shift"`
// YShift Shift by Y-axis measured in heights of the mask scaled to the face size, from top to bottom. For
// example, 1.0 will place the mask just below the default mask position.
YShift float32 `json:"y_shift"`
// Scale Mask scaling coefficient. For example, 2.0 means double size.
Scale float32 `json:"scale"`
}
// StickerType represents the type of a sticker.
@@ -40,32 +47,53 @@ const (
// Since: Bot API 1.0
// See https://core.telegram.org/bots/api#sticker
type Sticker struct {
FileID string `json:"file_id"`
// FileID Identifier for this file, which can be used to download or reuse the file
FileID string `json:"file_id"`
// FileUniqueID Unique identifier for this file, which is supposed to be the same over time and for
// different bots. Can't be used to download or reuse the file.
FileUniqueID string `json:"file_unique_id"`
Width int `json:"width"`
Height int `json:"height"`
// Width Sticker width
Width int `json:"width"`
// Height Sticker height
Height int `json:"height"`
Type StickerType `json:"type"` // Since: Bot API 6.2
IsAnimated bool `json:"is_animated"` // Since: Bot API 4.4
IsVideo bool `json:"is_video"` // Since: Bot API 5.7
Thumbnail *PhotoSize `json:"thumbnail,omitempty"` // Since: Bot API 6.6
Emoji *string `json:"emoji,omitempty"`
SetName *string `json:"set_name,omitempty"` // Since: Bot API 3.2
MaskPosition *MaskPosition `json:"mask_position,omitempty"` // Since: Bot API 3.2
CustomEmojiID *string `json:"custom_emoji_id,omitempty"` // Since: Bot API 6.2
NeedRepainting *bool `json:"need_repainting,omitempty"` // Since: Bot API 6.6
FileSize *int64 `json:"file_size,omitempty"`
// Type Type of the sticker, currently one of “regular”, “mask”, “custom_emoji”. The type of the
// sticker is independent from its format, which is determined by the fields is_animated and is_video.
Type StickerType `json:"type"` // Since: Bot API 6.2
// IsAnimated True, if the sticker is animated
IsAnimated bool `json:"is_animated"` // Since: Bot API 4.4
// IsVideo True, if the sticker is a video sticker
IsVideo bool `json:"is_video"` // Since: Bot API 5.7
// Thumbnail Optional. Sticker thumbnail in the .WEBP or .JPG format
Thumbnail *PhotoSize `json:"thumbnail,omitempty"` // Since: Bot API 6.6
// Emoji Optional. Emoji associated with the sticker
Emoji *string `json:"emoji,omitempty"`
// SetName Optional. Name of the sticker set to which the sticker belongs
SetName *string `json:"set_name,omitempty"` // Since: Bot API 3.2
// MaskPosition Optional. For mask stickers, the position where the mask should be placed
MaskPosition *MaskPosition `json:"mask_position,omitempty"` // Since: Bot API 3.2
// CustomEmojiID Optional. For custom emoji stickers, unique identifier of the custom emoji
CustomEmojiID *string `json:"custom_emoji_id,omitempty"` // Since: Bot API 6.2
// NeedRepainting reports whether Telegram must recolor the custom emoji sticker.
NeedRepainting *bool `json:"need_repainting,omitempty"` // Since: Bot API 6.6
// FileSize Optional. File size in bytes
FileSize *int64 `json:"file_size,omitempty"`
}
// StickerSet represents a sticker set.
// Since: Bot API 3.2
// See https://core.telegram.org/bots/api#stickerset
type StickerSet struct {
Name string `json:"name"`
Title string `json:"title"`
// Name Sticker set name
Name string `json:"name"`
// Title Sticker set title
Title string `json:"title"`
// StickerType Type of stickers in the set, currently one of “regular”, “mask”, “custom_emoji”
StickerType StickerType `json:"sticker_type"`
Stickers []Sticker `json:"stickers"`
Thumbnail *PhotoSize `json:"thumbnail,omitempty"`
// Stickers List of all set stickers
Stickers []Sticker `json:"stickers"`
// Thumbnail Optional. Sticker set thumbnail in the .WEBP, .TGS, or .WEBM format
Thumbnail *PhotoSize `json:"thumbnail,omitempty"`
}
// InputStickerFormat represents the format of an input sticker.
@@ -84,9 +112,19 @@ const (
// Since: Bot API 6.6
// See https://core.telegram.org/bots/api#inputsticker
type InputSticker struct {
Sticker string `json:"sticker"`
Format InputStickerFormat `json:"format"`
EmojiList []string `json:"emoji_list"`
MaskPosition *MaskPosition `json:"mask_position,omitempty"`
Keywords []string `json:"keywords,omitempty"`
// Sticker The added sticker. Pass a file_id as a String to send a file that already exists on the Telegram
// servers, pass an HTTP URL as a String for Telegram to get a file from the Internet, or pass
// “attach://<file_attach_name>” to upload a new file using multipart/form-data under <file_attach_name>
// name. Animated and video stickers can't be uploaded via HTTP URL. More information on Sending Files »
Sticker string `json:"sticker"`
// Format Format of the added sticker, must be one of “static” for a .WEBP or .PNG image, “animated”
// for a .TGS animation, “video” for a .WEBM video
Format InputStickerFormat `json:"format"`
// EmojiList List of 1-20 emoji associated with the sticker
EmojiList []string `json:"emoji_list"`
// MaskPosition Optional. Position where the mask should be placed on faces. For “mask” stickers only.
MaskPosition *MaskPosition `json:"mask_position,omitempty"`
// Keywords Optional. List of 0-20 search keywords for the sticker with total length of up to 64 characters.
// For “regular” and “custom_emoji” stickers only.
Keywords []string `json:"keywords,omitempty"`
}
+526 -198
View File
@@ -74,37 +74,91 @@ const (
// Since: Bot API 1.0
// See https://core.telegram.org/bots/api#update
type Update struct {
// Type is the locally derived update type and is not part of Telegram JSON.
Type UpdateType `json:"-"`
UpdateID int `json:"update_id"`
Message *Message `json:"message,omitempty"`
EditedMessage *Message `json:"edited_message,omitempty"`
ChannelPost *Message `json:"channel_post,omitempty"` // Since: Bot API 2.3
// UpdateID The update's unique identifier. Update identifiers start from a certain positive number and
// increase sequentially. This identifier becomes especially handy if you're using webhooks, since it allows
// you to ignore repeated updates or to restore the correct update sequence, should they get out of order.
// If there are no new updates for at least a week, then identifier of the next update will be chosen
// randomly instead of sequentially.
UpdateID int `json:"update_id"`
// Message Optional. New incoming message of any kind - text, photo, sticker, etc.
Message *Message `json:"message,omitempty"`
// EditedMessage Optional. New version of a message that is known to the bot and was edited. This update may
// at times be triggered by changes to message fields that are either unavailable or not actively used by
// your bot.
EditedMessage *Message `json:"edited_message,omitempty"`
// ChannelPost Optional. New incoming channel post of any kind - text, photo, sticker, etc.
ChannelPost *Message `json:"channel_post,omitempty"` // Since: Bot API 2.3
// EditedChannelPost Optional. New version of a channel post that is known to the bot and was edited. This
// update may at times be triggered by changes to message fields that are either unavailable or not actively
// used by your bot.
EditedChannelPost *Message `json:"edited_channel_post,omitempty"` // Since: Bot API 2.3
BusinessConnection *BusinessConnection `json:"business_connection,omitempty"` // Since: Bot API 7.2
BusinessMessage *Message `json:"business_message,omitempty"` // Since: Bot API 7.2
EditedBusinessMessage *Message `json:"edited_business_message,omitempty"` // Since: Bot API 7.2
DeletedBusinessMessages *BusinessMessagesDeleted `json:"deleted_business_messages,omitempty"` // Since: Bot API 7.2
GuestMessage *Message `json:"guest_message,omitempty"` // Since: Bot API 10.0
MessageReaction *MessageReactionUpdated `json:"message_reaction,omitempty"` // Since: Bot API 7.0
MessageReactionCount *MessageReactionCountUpdated `json:"message_reaction_count,omitempty"` // Since: Bot API 7.0
// BusinessConnection Optional. The bot was connected to or disconnected from a business account, or a user
// edited an existing connection with the bot
BusinessConnection *BusinessConnection `json:"business_connection,omitempty"` // Since: Bot API 7.2
// BusinessMessage Optional. New message from a connected business account
BusinessMessage *Message `json:"business_message,omitempty"` // Since: Bot API 7.2
// EditedBusinessMessage Optional. New version of a message from a connected business account
EditedBusinessMessage *Message `json:"edited_business_message,omitempty"` // Since: Bot API 7.2
// DeletedBusinessMessages Optional. Messages were deleted from a connected business account
DeletedBusinessMessages *BusinessMessagesDeleted `json:"deleted_business_messages,omitempty"` // Since: Bot API 7.2
// GuestMessage Optional. New guest message. The bot can use the field Message.guest_query_id and the method
// answerGuestQuery to send a message in response.
GuestMessage *Message `json:"guest_message,omitempty"` // Since: Bot API 10.0
// MessageReaction Optional. A reaction to a message was changed by a user. The bot must be an administrator
// in the chat and must explicitly specify "message_reaction" in the list of allowed_updates to receive
// these updates. The update isn't received for reactions set by bots.
MessageReaction *MessageReactionUpdated `json:"message_reaction,omitempty"` // Since: Bot API 7.0
// MessageReactionCount Optional. Reactions to a message with anonymous reactions were changed. The bot must
// be an administrator in the chat and must explicitly specify "message_reaction_count" in the list of
// allowed_updates to receive these updates. The updates are grouped and can be sent with delay up to a few
// minutes.
MessageReactionCount *MessageReactionCountUpdated `json:"message_reaction_count,omitempty"` // Since: Bot API 7.0
InlineQuery *InlineQuery `json:"inline_query,omitempty"` // Since: Bot API 1.7
// InlineQuery Optional. New incoming inline query
InlineQuery *InlineQuery `json:"inline_query,omitempty"` // Since: Bot API 1.7
// ChosenInlineResult Optional. The result of an inline query that was chosen by a user and sent to their
// chat partner. Please see our documentation on the feedback collecting for details on how to enable these
// updates for your bot.
ChosenInlineResult *ChosenInlineResult `json:"chosen_inline_result,omitempty"` // Since: Bot API 1.8
CallbackQuery *CallbackQuery `json:"callback_query,omitempty"` // Since: Bot API 2.0
ShippingQuery *ShippingQuery `json:"shipping_query,omitempty"` // Since: Bot API 3.0
PreCheckoutQuery *PreCheckoutQuery `json:"pre_checkout_query,omitempty"` // Since: Bot API 3.0
// CallbackQuery Optional. New incoming callback query
CallbackQuery *CallbackQuery `json:"callback_query,omitempty"` // Since: Bot API 2.0
// ShippingQuery Optional. New incoming shipping query. Only for invoices with flexible price.
ShippingQuery *ShippingQuery `json:"shipping_query,omitempty"` // Since: Bot API 3.0
// PreCheckoutQuery Optional. New incoming pre-checkout query. Contains full information about checkout.
PreCheckoutQuery *PreCheckoutQuery `json:"pre_checkout_query,omitempty"` // Since: Bot API 3.0
// PurchasedPaidMedia Optional. A user purchased paid media with a non-empty payload sent by the bot in a
// non-channel chat
PurchasedPaidMedia *PaidMediaPurchased `json:"purchased_paid_media,omitempty"` // Since: Bot API 7.10
Poll *Poll `json:"poll,omitempty"` // Since: Bot API 4.2
PollAnswer *PollAnswer `json:"poll_answer,omitempty"` // Since: Bot API 4.6
MyChatMember *ChatMemberUpdated `json:"my_chat_member,omitempty"` // Since: Bot API 5.1
ChatMember *ChatMemberUpdated `json:"chat_member,omitempty"` // Since: Bot API 5.1
ChatJoinRequest *ChatJoinRequest `json:"chat_join_request,omitempty"` // Since: Bot API 5.4
ChatBoost *ChatBoostUpdated `json:"chat_boost,omitempty"` // Since: Bot API 7.0
RemovedChatBoost *ChatBoostRemoved `json:"removed_chat_boost,omitempty"` // Since: Bot API 7.0
// Poll Optional. New poll state. Bots receive only updates about manually stopped polls and polls, which
// are sent by the bot.
Poll *Poll `json:"poll,omitempty"` // Since: Bot API 4.2
// PollAnswer Optional. A user changed their answer in a non-anonymous poll. Bots receive new votes only in
// polls that were sent by the bot itself.
PollAnswer *PollAnswer `json:"poll_answer,omitempty"` // Since: Bot API 4.6
// MyChatMember Optional. The bot's chat member status was updated in a chat. For private chats, this update
// is received only when the bot is blocked or unblocked by the user.
MyChatMember *ChatMemberUpdated `json:"my_chat_member,omitempty"` // Since: Bot API 5.1
// ChatMember Optional. A chat member's status was updated in a chat. The bot must be an administrator in
// the chat and must explicitly specify "chat_member" in the list of allowed_updates to receive these
// updates.
ChatMember *ChatMemberUpdated `json:"chat_member,omitempty"` // Since: Bot API 5.1
// ChatJoinRequest Optional. A request to join the chat has been sent. The bot must have the
// can_invite_users administrator right in the chat to receive these updates.
ChatJoinRequest *ChatJoinRequest `json:"chat_join_request,omitempty"` // Since: Bot API 5.4
// ChatBoost Optional. A chat boost was added or changed. The bot must be an administrator in the chat to
// receive these updates.
ChatBoost *ChatBoostUpdated `json:"chat_boost,omitempty"` // Since: Bot API 7.0
// RemovedChatBoost Optional. A boost was removed from a chat. The bot must be an administrator in the chat
// to receive these updates.
RemovedChatBoost *ChatBoostRemoved `json:"removed_chat_boost,omitempty"` // Since: Bot API 7.0
// ManagedBot Optional. A new bot was created to be managed by the bot, or token or owner of a managed bot
// was changed
ManagedBot *ManagedBotUpdated `json:"managed_bot,omitempty"` // Since: Bot API 9.6
// Subscription contains a bot subscription update.
Subscription *BotSubscriptionUpdated `json:"subscription,omitempty"` // Since: Bot API 10.2
@@ -188,34 +242,60 @@ func (u *Update) UnmarshalJSON(data []byte) error {
// Since: Bot API 2.2
// See https://core.telegram.org/bots/api#webhookinfo
type WebhookInfo struct {
URL string `json:"url"`
HasCustomCertificate bool `json:"has_custom_certificate"`
PendingUpdateCount int `json:"pending_update_count"`
IPAddress string `json:"ip_address,omitempty"`
LastErrorDate int `json:"last_error_date,omitempty"`
LastErrorMessage string `json:"last_error_message,omitempty"`
LastSynchronizationErrorDate int `json:"last_synchronization_error_date,omitempty"`
MaxConnections int `json:"max_connections,omitempty"`
AllowedUpdates []string `json:"allowed_updates,omitempty"`
// URL Webhook URL, may be empty if webhook is not set up
URL string `json:"url"`
// HasCustomCertificate True, if a custom certificate was provided for webhook certificate checks
HasCustomCertificate bool `json:"has_custom_certificate"`
// PendingUpdateCount Number of updates awaiting delivery
PendingUpdateCount int `json:"pending_update_count"`
// IPAddress Optional. Currently used webhook IP address
IPAddress string `json:"ip_address,omitempty"`
// LastErrorDate Optional. Unix time for the most recent error that happened when trying to deliver an
// update via webhook
LastErrorDate int `json:"last_error_date,omitempty"`
// LastErrorMessage Optional. Error message in human-readable format for the most recent error that happened
// when trying to deliver an update via webhook
LastErrorMessage string `json:"last_error_message,omitempty"`
// LastSynchronizationErrorDate Optional. Unix time of the most recent error that happened when trying to
// synchronize available updates with Telegram datacenters
LastSynchronizationErrorDate int `json:"last_synchronization_error_date,omitempty"`
// MaxConnections Optional. The maximum allowed number of simultaneous HTTPS connections to the webhook for
// update delivery
MaxConnections int `json:"max_connections,omitempty"`
// AllowedUpdates Optional. A list of update types the bot is subscribed to. Defaults to all update types
// except chat_member, message_reaction, and message_reaction_count.
AllowedUpdates []string `json:"allowed_updates,omitempty"`
}
// ProximityAlertTriggered represents the content of a service message sent when a user triggers a proximity alert.
// Since: Bot API 5.0
type ProximityAlertTriggered struct {
// Traveler User that triggered the alert
Traveler User `json:"traveler"`
Watcher User `json:"watcher"`
Distance int `json:"distance"`
// Watcher User that set the alert
Watcher User `json:"watcher"`
// Distance The distance between the users
Distance int `json:"distance"`
}
// InlineQuery represents an incoming inline query.
// Since: Bot API 1.7
// See https://core.telegram.org/bots/api#inlinequery
type InlineQuery struct {
ID string `json:"id"`
From User `json:"from"`
Query string `json:"query"`
Offset string `json:"offset"`
// ID Unique identifier for this query
ID string `json:"id"`
// From Sender
From User `json:"from"`
// Query Text of the query (up to 256 characters)
Query string `json:"query"`
// Offset Offset of the results to be returned, can be controlled by the bot
Offset string `json:"offset"`
// ChatType Optional. Type of the chat from which the inline query was sent. Can be either “sender” for
// a private chat with the inline query sender, “private”, “group”, “supergroup”, or
// “channel”. The chat type should be always known for requests sent from official clients and most
// third-party clients, unless the request was sent from a secret chat.
ChatType *ChatType `json:"chat_type,omitempty"`
// Location Optional. Sender location, only for bots that request user location
Location *Location `json:"location,omitempty"`
}
@@ -223,46 +303,80 @@ type InlineQuery struct {
// Since: Bot API 1.8
// See https://core.telegram.org/bots/api#choseninlineresult
type ChosenInlineResult struct {
ResultID string `json:"result_id"`
From User `json:"from"`
Location *Location `json:"location,omitempty"`
InlineMessageID string `json:"inline_message_id"`
Query string `json:"query"`
// ResultID The unique identifier for the result that was chosen
ResultID string `json:"result_id"`
// From The user that chose the result
From User `json:"from"`
// Location Optional. Sender location, only for bots that require user location
Location *Location `json:"location,omitempty"`
// InlineMessageID Optional. Identifier of the sent inline message. Available only if there is an inline
// keyboard attached to the message. Will be also received in callback queries and can be used to edit the
// message.
InlineMessageID string `json:"inline_message_id"`
// Query The query that was used to obtain the result
Query string `json:"query"`
}
// File represents a file ready to be downloaded.
// Since: Bot API 1.0
// See https://core.telegram.org/bots/api#file
type File struct {
FileID string `json:"file_id"`
// FileID Identifier for this file, which can be used to download or reuse the file
FileID string `json:"file_id"`
// FileUniqueID Unique identifier for this file, which is supposed to be the same over time and for
// different bots. Can't be used to download or reuse the file.
FileUniqueID string `json:"file_unique_id"`
FileSize int64 `json:"file_size,omitempty"`
FilePath string `json:"file_path,omitempty"`
// FileSize Optional. File size in bytes. It can be bigger than 2^31 and some programming languages may have
// difficulty/silent defects in interpreting it. But it has at most 52 significant bits, so a signed 64-bit
// integer or double-precision float type are safe for storing this value.
FileSize int64 `json:"file_size,omitempty"`
// FilePath Optional. File path. Use https://api.telegram.org/file/bot<token>/<file_path> to get the file.
FilePath string `json:"file_path,omitempty"`
}
// ChatMemberUpdated represents changes in the status of a chat member.
// Since: Bot API 5.1
// See https://core.telegram.org/bots/api#chatmemberupdated
type ChatMemberUpdated struct {
Chat Chat `json:"chat"`
From User `json:"from"`
Date int64 `json:"date"`
OldChatMember ChatMember `json:"old_chat_member"`
NewChatMember ChatMember `json:"new_chat_member"`
InviteLink *ChatInviteLink `json:"invite_link,omitempty"`
ViaJoinRequest *bool `json:"via_join_request,omitempty"`
ViaChatFolderInviteLink *bool `json:"via_chat_folder_invite_link,omitempty"`
// Chat Chat the user belongs to
Chat Chat `json:"chat"`
// From Performer of the action, which resulted in the change
From User `json:"from"`
// Date Date the change was done in Unix time
Date int64 `json:"date"`
// OldChatMember Previous information about the chat member
OldChatMember ChatMember `json:"old_chat_member"`
// NewChatMember New information about the chat member
NewChatMember ChatMember `json:"new_chat_member"`
// InviteLink Optional. Chat invite link, which was used by the user to join the chat; for joining by invite
// link events only
InviteLink *ChatInviteLink `json:"invite_link,omitempty"`
// ViaJoinRequest Optional. True, if the user joined the chat after sending a direct join request without
// using an invite link and being approved by an administrator
ViaJoinRequest *bool `json:"via_join_request,omitempty"`
// ViaChatFolderInviteLink Optional. True, if the user joined the chat via a chat folder invite link
ViaChatFolderInviteLink *bool `json:"via_chat_folder_invite_link,omitempty"`
}
// ChatJoinRequest represents a join request sent to a chat.
// Since: Bot API 5.4
// See https://core.telegram.org/bots/api#chatjoinrequest
type ChatJoinRequest struct {
Chat Chat `json:"chat"`
From User `json:"from"`
UserChatID int64 `json:"user_chat_id"`
Date int64 `json:"date"`
Bio *string `json:"bio,omitempty"`
// Chat Chat to which the request was sent
Chat Chat `json:"chat"`
// From User that sent the join request
From User `json:"from"`
// UserChatID Identifier of a private chat with the user who sent the join request. This number may have
// more than 32 significant bits and some programming languages may have difficulty/silent defects in
// interpreting it. But it has at most 52 significant bits, so a 64-bit integer or double-precision float
// type are safe for storing this identifier. The bot can use this identifier for 5 minutes to send messages
// until the join request is processed, assuming no other administrator contacted the user.
UserChatID int64 `json:"user_chat_id"`
// Date Date the request was sent in Unix time
Date int64 `json:"date"`
// Bio Optional. Bio of the user
Bio *string `json:"bio,omitempty"`
// InviteLink Optional. Chat invite link that was used by the user to send the join request
InviteLink *ChatInviteLink `json:"invite_link,omitempty"`
// QueryID identifies the join request query; present only for bots
@@ -275,188 +389,309 @@ type ChatJoinRequest struct {
// Since: Bot API 1.0
// See https://core.telegram.org/bots/api#location
type Location struct {
Latitude float64 `json:"latitude"`
Longitude float64 `json:"longitude"`
HorizontalAccuracy float64 `json:"horizontal_accuracy"`
LivePeriod int `json:"live_period"`
Heading int `json:"heading"`
ProximityAlertRadius int `json:"proximity_alert_radius"`
// Latitude Latitude as defined by the sender
Latitude float64 `json:"latitude"`
// Longitude Longitude as defined by the sender
Longitude float64 `json:"longitude"`
// HorizontalAccuracy Optional. The radius of uncertainty for the location, measured in meters; 0-1500
HorizontalAccuracy float64 `json:"horizontal_accuracy"`
// LivePeriod Optional. Time relative to the message sending date, during which the location can be updated;
// in seconds. For active live locations only.
LivePeriod int `json:"live_period"`
// Heading Optional. The direction in which user is moving, in degrees; 1-360. For active live locations
// only.
Heading int `json:"heading"`
// ProximityAlertRadius Optional. The maximum distance for proximity alerts about approaching another chat
// member, in meters. For sent live locations only.
ProximityAlertRadius int `json:"proximity_alert_radius"`
}
// LocationAddress represents a human-readable address of a location.
// Since: Bot API 8.0
type LocationAddress struct {
CountryCode string `json:"country_code"`
State *string `json:"state,omitempty"`
City *string `json:"city,omitempty"`
Street *string `json:"street,omitempty"`
// CountryCode The two-letter ISO 3166-1 alpha-2 country code of the country where the location is located
CountryCode string `json:"country_code"`
// State Optional. State of the location
State *string `json:"state,omitempty"`
// City Optional. City of the location
City *string `json:"city,omitempty"`
// Street Optional. Street address of the location
Street *string `json:"street,omitempty"`
}
// Venue represents a venue.
// Since: Bot API 2.0
// See https://core.telegram.org/bots/api#venue
type Venue struct {
Location Location `json:"location"`
Title string `json:"title"`
Address string `json:"address"`
FoursquareID string `json:"foursquare_id,omitempty"`
FoursquareType string `json:"foursquare_type,omitempty"`
GooglePlaceID string `json:"google_place_id,omitempty"`
GooglePlaceType string `json:"google_place_type,omitempty"`
// Location Venue location. Can't be a live location.
Location Location `json:"location"`
// Title Name of the venue
Title string `json:"title"`
// Address Address of the venue
Address string `json:"address"`
// FoursquareID Optional. Foursquare identifier of the venue
FoursquareID string `json:"foursquare_id,omitempty"`
// FoursquareType Optional. Foursquare type of the venue. (For example, “arts_entertainment/default”,
// “arts_entertainment/aquarium” or “food/icecream”.)
FoursquareType string `json:"foursquare_type,omitempty"`
// GooglePlaceID Optional. Google Places identifier of the venue
GooglePlaceID string `json:"google_place_id,omitempty"`
// GooglePlaceType Optional. Google Places type of the venue. (See supported types.)
GooglePlaceType string `json:"google_place_type,omitempty"`
}
// WebAppInfo contains information about a Web App.
// Since: Bot API 6.0
// See https://core.telegram.org/bots/api#webappinfo
type WebAppInfo struct {
// URL An HTTPS URL of a Web App to be opened with additional data as specified in Initializing Web Apps
URL string `json:"url"`
}
// WebAppData represents data sent from a Web App to the bot.
// Since: Bot API 6.0
type WebAppData struct {
Data string `json:"data"`
// Data The data. Be aware that a bad client can send arbitrary data in this field.
Data string `json:"data"`
// ButtonText Text of the web_app keyboard button from which the Web App was opened. Be aware that a bad
// client can send arbitrary data in this field.
ButtonText string `json:"button_text"`
}
// StarAmount represents an amount of Telegram Stars.
// Since: Bot API 7.5
type StarAmount struct {
Amount int `json:"amount"`
// Amount Integer amount of Telegram Stars, rounded to 0; can be negative
Amount int `json:"amount"`
// NanostarAmount Optional. The number of 1/1000000000 shares of Telegram Stars; from -999999999 to
// 999999999; can be negative if and only if amount is non-positive
NanostarAmount int `json:"nanostar_amount"`
}
// AcceptedGiftTypes represents the types of gifts accepted by a user or chat.
// Since: Bot API 9.0
type AcceptedGiftTypes struct {
UnlimitedGifts bool `json:"unlimited_gifts"`
LimitedGifts bool `json:"limited_gifts"`
UniqueGifts bool `json:"unique_gifts"`
// UnlimitedGifts True, if unlimited regular gifts are accepted
UnlimitedGifts bool `json:"unlimited_gifts"`
// LimitedGifts True, if limited regular gifts are accepted
LimitedGifts bool `json:"limited_gifts"`
// UniqueGifts True, if unique gifts or gifts that can be upgraded to unique for free are accepted
UniqueGifts bool `json:"unique_gifts"`
// PremiumSubscription True, if a Telegram Premium subscription is accepted
PremiumSubscription bool `json:"premium_subscription"`
GiftsFromChannels bool `json:"gifts_from_channels"`
// GiftsFromChannels True, if transfers of unique gifts from channels are accepted
GiftsFromChannels bool `json:"gifts_from_channels"`
}
// GiftBackground represents the background of a gift.
// Since: Bot API 9.0
type GiftBackground struct {
// CenterColor Center color of the background in RGB format
CenterColor int `json:"center_color"`
EdgeColor int `json:"edge_color"`
TextColor int `json:"text_color"`
// EdgeColor Edge color of the background in RGB format
EdgeColor int `json:"edge_color"`
// TextColor Text color of the background in RGB format
TextColor int `json:"text_color"`
}
// Gift represents a gift that can be sent.
// Since: Bot API 9.0
type Gift struct {
ID string `json:"id"`
Sticker Sticker `json:"sticker"`
StarCount int `json:"star_count"`
UpdateStarCount *int `json:"update_star_count,omitempty"`
IsPremium *bool `json:"is_premium,omitempty"`
HasColors *bool `json:"has_colors,omitempty"`
TotalCount *int `json:"total_count,omitempty"`
RemainingCount *int `json:"remaining_count,omitempty"`
PersonalTotalCount *int `json:"personal_total_count,omitempty"`
PersonalRemainingCount *int `json:"personal_remaining_count,omitempty"`
Background *GiftBackground `json:"background,omitempty"`
UniqueGiftVariantColor *int `json:"unique_gift_variant_color,omitempty"`
PublisherChat *Chat `json:"publisher_chat,omitempty"`
// ID Unique identifier of the gift
ID string `json:"id"`
// Sticker The sticker that represents the gift
Sticker Sticker `json:"sticker"`
// StarCount The number of Telegram Stars that must be paid to send the sticker
StarCount int `json:"star_count"`
// UpdateStarCount is the number of Stars required to upgrade the gift.
UpdateStarCount *int `json:"update_star_count,omitempty"`
// IsPremium Optional. True, if the gift can only be purchased by Telegram Premium subscribers
IsPremium *bool `json:"is_premium,omitempty"`
// HasColors Optional. True, if the gift can be used (after being upgraded) to customize a user's appearance
HasColors *bool `json:"has_colors,omitempty"`
// TotalCount Optional. The total number of gifts of this type that can be sent by all users; for limited
// gifts only
TotalCount *int `json:"total_count,omitempty"`
// RemainingCount Optional. The number of remaining gifts of this type that can be sent by all users; for
// limited gifts only
RemainingCount *int `json:"remaining_count,omitempty"`
// PersonalTotalCount Optional. The total number of gifts of this type that can be sent by the bot; for
// limited gifts only
PersonalTotalCount *int `json:"personal_total_count,omitempty"`
// PersonalRemainingCount Optional. The number of remaining gifts of this type that can be sent by the bot;
// for limited gifts only
PersonalRemainingCount *int `json:"personal_remaining_count,omitempty"`
// Background Optional. Background of the gift
Background *GiftBackground `json:"background,omitempty"`
// UniqueGiftVariantColor identifies the color used by unique variants of the gift.
UniqueGiftVariantColor *int `json:"unique_gift_variant_color,omitempty"`
// PublisherChat Optional. Information about the chat that published the gift
PublisherChat *Chat `json:"publisher_chat,omitempty"`
}
// Gifts represents a list of gifts.
// Since: Bot API 9.0
type Gifts struct {
// Gifts The list of gifts
Gifts []Gift `json:"gifts"`
}
// UniqueGiftModel describes the model component of a unique gift.
// Since: Bot API 9.0
type UniqueGiftModel struct {
Name string `json:"name"`
Sticker Sticker `json:"sticker"`
RarityPerMille int `json:"rarity_per_mille"`
Rarity string `json:"rarity,omitempty"`
// Name Name of the model
Name string `json:"name"`
// Sticker The sticker that represents the unique gift
Sticker Sticker `json:"sticker"`
// RarityPerMille The number of unique gifts that receive this model for every 1000 gift upgrades. Always 0
// for crafted gifts.
RarityPerMille int `json:"rarity_per_mille"`
// Rarity Optional. Rarity of the model if it is a crafted model. Currently, can be “uncommon”,
// “rare”, “epic”, or “legendary”.
Rarity string `json:"rarity,omitempty"`
}
// UniqueGiftSymbol describes the symbol component of a unique gift.
// Since: Bot API 9.0
type UniqueGiftSymbol struct {
Name string `json:"name"`
Sticker Sticker `json:"sticker"`
RarityPerMille int `json:"rarity_per_mille"`
// Name Name of the symbol
Name string `json:"name"`
// Sticker The sticker that represents the unique gift
Sticker Sticker `json:"sticker"`
// RarityPerMille The number of unique gifts that receive this model for every 1000 gifts upgraded
RarityPerMille int `json:"rarity_per_mille"`
}
// UniqueGiftBackdropColors describes the colors of a unique gift backdrop.
// Since: Bot API 9.0
type UniqueGiftBackdropColors struct {
// CenterColor The color in the center of the backdrop in RGB format
CenterColor int `json:"center_color"`
EdgeColor int `json:"edge_color"`
// EdgeColor The color on the edges of the backdrop in RGB format
EdgeColor int `json:"edge_color"`
// SymbolColor The color to be applied to the symbol in RGB format
SymbolColor int `json:"symbol_color"`
TextColor int `json:"text_color"`
// TextColor The color for the text on the backdrop in RGB format
TextColor int `json:"text_color"`
}
// UniqueGiftBackdrop describes the backdrop of a unique gift.
// Since: Bot API 9.0
type UniqueGiftBackdrop struct {
Name string `json:"name"`
Colors UniqueGiftBackdropColors `json:"colors"`
RarityPerMille int `json:"rarity_per_mille"`
// Name Name of the backdrop
Name string `json:"name"`
// Colors Colors of the backdrop
Colors UniqueGiftBackdropColors `json:"colors"`
// RarityPerMille The number of unique gifts that receive this backdrop for every 1000 gifts upgraded
RarityPerMille int `json:"rarity_per_mille"`
}
// UniqueGiftColors represents color information for a unique gift.
// Since: Bot API 9.3
type UniqueGiftColors struct {
ModelCustomEmojiID string `json:"model_custom_emoji_id"`
SymbolCustomEmojiID string `json:"symbol_custom_emoji_id"`
LightThemeMainColor int `json:"light_theme_main_color"`
LightThemeOtherColors []int `json:"light_theme_other_colors"`
DarkThemeMainColor int `json:"dark_theme_main_color"`
DarkThemeOtherColors []int `json:"dark_theme_other_colors"`
// ModelCustomEmojiID Custom emoji identifier of the unique gift's model
ModelCustomEmojiID string `json:"model_custom_emoji_id"`
// SymbolCustomEmojiID Custom emoji identifier of the unique gift's symbol
SymbolCustomEmojiID string `json:"symbol_custom_emoji_id"`
// LightThemeMainColor Main color used in light themes; RGB format
LightThemeMainColor int `json:"light_theme_main_color"`
// LightThemeOtherColors List of 1-3 additional colors used in light themes; RGB format
LightThemeOtherColors []int `json:"light_theme_other_colors"`
// DarkThemeMainColor Main color used in dark themes; RGB format
DarkThemeMainColor int `json:"dark_theme_main_color"`
// DarkThemeOtherColors List of 1-3 additional colors used in dark themes; RGB format
DarkThemeOtherColors []int `json:"dark_theme_other_colors"`
}
// UniqueGift represents a unique gift.
// Since: Bot API 9.0
type UniqueGift struct {
GiftID string `json:"gift_id"`
BaseName string `json:"base_name"`
Name string `json:"name"`
Number int `json:"number"`
Model UniqueGiftModel `json:"model"`
Symbol UniqueGiftSymbol `json:"symbol"`
// GiftID Identifier of the regular gift from which the gift was upgraded
GiftID string `json:"gift_id"`
// BaseName Human-readable name of the regular gift from which this unique gift was upgraded
BaseName string `json:"base_name"`
// Name Unique name of the gift. This name can be used in https://t.me/nft/... links and story areas.
Name string `json:"name"`
// Number Unique number of the upgraded gift among gifts upgraded from the same regular gift
Number int `json:"number"`
// Model Model of the gift
Model UniqueGiftModel `json:"model"`
// Symbol Symbol of the gift
Symbol UniqueGiftSymbol `json:"symbol"`
// Backdrop Backdrop of the gift
Backdrop UniqueGiftBackdrop `json:"backdrop"`
IsPremium bool `json:"is_premium,omitempty"`
IsBurned bool `json:"is_burned,omitempty"`
IsFromBlockchain bool `json:"is_from_blockchain,omitempty"`
Colors *UniqueGiftColors `json:"colors,omitempty"`
PublisherChat *Chat `json:"publisher_chat,omitempty"`
// IsPremium Optional. True, if the original regular gift was exclusively purchaseable by Telegram Premium
// subscribers
IsPremium bool `json:"is_premium,omitempty"`
// IsBurned Optional. True, if the gift was used to craft another gift and isn't available anymore
IsBurned bool `json:"is_burned,omitempty"`
// IsFromBlockchain Optional. True, if the gift is assigned from the TON blockchain and can't be resold or
// transferred in Telegram
IsFromBlockchain bool `json:"is_from_blockchain,omitempty"`
// Colors Optional. The color scheme that can be used by the gift's owner for the chat's name, replies to
// messages and link previews; for business account gifts and gifts that are currently on sale only
Colors *UniqueGiftColors `json:"colors,omitempty"`
// PublisherChat Optional. Information about the chat that published the gift
PublisherChat *Chat `json:"publisher_chat,omitempty"`
}
// GiftInfo contains information about a received gift.
// Since: Bot API 9.0
type GiftInfo struct {
// Gift Information about the gift
Gift Gift `json:"gift"`
OwnedGiftID string `json:"owned_gift_id,omitempty"`
ConvertStarCount int `json:"convert_star_count,omitempty"`
PrepaidUpgradeStarCount int `json:"prepaid_upgrade_star_count,omitempty"`
IsUpgradeSeparate bool `json:"is_upgrade_separate,omitempty"`
CanBeUpgraded bool `json:"can_be_upgraded,omitempty"`
Text string `json:"text,omitempty"`
Entities []MessageEntity `json:"entities,omitempty"`
IsPrivate bool `json:"is_private,omitempty"`
UniqueGiftNumber int `json:"unique_gift_number,omitempty"`
// OwnedGiftID Optional. Unique identifier of the received gift for the bot; only present for gifts received
// on behalf of business accounts
OwnedGiftID string `json:"owned_gift_id,omitempty"`
// ConvertStarCount Optional. Number of Telegram Stars that can be claimed by the receiver by converting the
// gift; omitted if conversion to Telegram Stars is impossible
ConvertStarCount int `json:"convert_star_count,omitempty"`
// PrepaidUpgradeStarCount Optional. Number of Telegram Stars that were prepaid for the ability to upgrade
// the gift
PrepaidUpgradeStarCount int `json:"prepaid_upgrade_star_count,omitempty"`
// IsUpgradeSeparate Optional. True, if the gift's upgrade was purchased after the gift was sent
IsUpgradeSeparate bool `json:"is_upgrade_separate,omitempty"`
// CanBeUpgraded Optional. True, if the gift can be upgraded to a unique gift
CanBeUpgraded bool `json:"can_be_upgraded,omitempty"`
// Text Optional. Text of the message that was added to the gift
Text string `json:"text,omitempty"`
// Entities Optional. Special entities that appear in the text
Entities []MessageEntity `json:"entities,omitempty"`
// IsPrivate Optional. True, if the sender and gift text are shown only to the gift receiver; otherwise,
// everyone will be able to see them
IsPrivate bool `json:"is_private,omitempty"`
// UniqueGiftNumber Optional. Unique number reserved for this gift when upgraded. See the number field in
// UniqueGift.
UniqueGiftNumber int `json:"unique_gift_number,omitempty"`
}
// UniqueGiftInfo contains information about a received unique gift.
// Since: Bot API 9.0
type UniqueGiftInfo struct {
Gift UniqueGift `json:"gift"`
Origin string `json:"origin"`
LastResaleCurrency string `json:"last_resale_currency,omitempty"`
LastResaleAmount int `json:"last_resale_amount,omitempty"`
OwnedGiftID string `json:"owned_gift_id,omitempty"`
TransferStarCount int `json:"transfer_star_count,omitempty"`
NextTransferDate int `json:"next_transfer_date,omitempty"`
// Gift Information about the gift
Gift UniqueGift `json:"gift"`
// Origin Origin of the gift. Currently, either “upgrade” for gifts upgraded from regular gifts,
// “transfer” for gifts transferred from other users or channels, “resale” for gifts bought from
// other users, “gifted_upgrade” for upgrades purchased after the gift was sent, or “offer” for
// gifts bought or sold through gift purchase offers.
Origin string `json:"origin"`
// LastResaleCurrency Optional. For gifts bought from other users, the currency in which the payment for the
// gift was done. Currently, one of “XTR” for Telegram Stars or “TON” for TON grams.
LastResaleCurrency string `json:"last_resale_currency,omitempty"`
// LastResaleAmount Optional. For gifts bought from other users, the price paid for the gift in either
// Telegram Stars or nanograms
LastResaleAmount int `json:"last_resale_amount,omitempty"`
// OwnedGiftID Optional. Unique identifier of the received gift for the bot; only present for gifts received
// on behalf of business accounts
OwnedGiftID string `json:"owned_gift_id,omitempty"`
// TransferStarCount Optional. Number of Telegram Stars that must be paid to transfer the gift; omitted if
// the bot cannot transfer the gift
TransferStarCount int `json:"transfer_star_count,omitempty"`
// NextTransferDate Optional. Point in time (Unix timestamp) when the gift can be transferred. If it is in
// the past, then the gift can be transferred now.
NextTransferDate int `json:"next_transfer_date,omitempty"`
}
// OwnedGiftType represents the type of an owned gift.
@@ -473,92 +708,167 @@ const (
// OwnedGift represents a gift owned by a user or chat.
// Since: Bot API 9.0
type OwnedGift struct {
Type OwnedGiftType `json:"type"`
OwnedGiftID string `json:"ownen_gift_id,omitempty"`
SendDate int `json:"send_date,omitempty"`
IsSaved bool `json:"is_saved,omitempty"`
// Type identifies the regular or unique owned-gift variant.
Type OwnedGiftType `json:"type"`
// OwnedGiftID uniquely identifies a business account's owned gift when available.
OwnedGiftID string `json:"owned_gift_id,omitempty"`
// SendDate Date the gift was sent in Unix time
SendDate int `json:"send_date,omitempty"`
// IsSaved Optional. True, if the gift is displayed on the account's profile page; for gifts received on
// behalf of business accounts only
IsSaved bool `json:"is_saved,omitempty"`
// Gift contains the regular gift for the regular variant.
// Fields specific to "regular" type
Gift Gift `json:"gift"`
SenderUser *User `json:"sender_user,omitempty"`
Text string `json:"text,omitempty"`
Entities []MessageEntity `json:"entities,omitempty"`
IsPrivate bool `json:"is_private,omitempty"`
CanBeUpgraded bool `json:"can_be_upgraded,omitempty"`
WasRefunded bool `json:"was_refunded,omitempty"`
ConvertStarCount int `json:"convert_star_count,omitempty"`
PrepaidUpgradeStarCount int `json:"prepaid_upgrade_star_count,omitempty"`
IsUpgradeSeparate bool `json:"is_upgrade_separate,omitempty"`
UniqueGiftNumber int `json:"unique_gift_number,omitempty"`
Gift Gift `json:"gift"`
// SenderUser Optional. Sender of the gift if it is a known user
SenderUser *User `json:"sender_user,omitempty"`
// Text Optional. Text of the message that was added to the gift
Text string `json:"text,omitempty"`
// Entities Optional. Special entities that appear in the text
Entities []MessageEntity `json:"entities,omitempty"`
// IsPrivate Optional. True, if the sender and gift text are shown only to the gift receiver; otherwise,
// everyone will be able to see them
IsPrivate bool `json:"is_private,omitempty"`
// CanBeUpgraded Optional. True, if the gift can be upgraded to a unique gift; for gifts received on behalf
// of business accounts only
CanBeUpgraded bool `json:"can_be_upgraded,omitempty"`
// WasRefunded Optional. True, if the gift was refunded and isn't available anymore
WasRefunded bool `json:"was_refunded,omitempty"`
// ConvertStarCount Optional. Number of Telegram Stars that can be claimed by the receiver instead of the
// gift; omitted if the gift cannot be converted to Telegram Stars; for gifts received on behalf of business
// accounts only
ConvertStarCount int `json:"convert_star_count,omitempty"`
// PrepaidUpgradeStarCount Optional. Number of Telegram Stars that were paid for the ability to upgrade the
// gift
PrepaidUpgradeStarCount int `json:"prepaid_upgrade_star_count,omitempty"`
// IsUpgradeSeparate Optional. True, if the gift's upgrade was purchased after the gift was sent; for gifts
// received on behalf of business accounts only
IsUpgradeSeparate bool `json:"is_upgrade_separate,omitempty"`
// UniqueGiftNumber Optional. Unique number reserved for this gift when upgraded. See the number field in
// UniqueGift.
UniqueGiftNumber int `json:"unique_gift_number,omitempty"`
// CanBeTransferred Optional. True, if the gift can be transferred to another owner; for gifts received on
// behalf of business accounts only
// Fields specific to "unique" type
CanBeTransferred bool `json:"can_be_transferred,omitempty"`
TransferStarCount int `json:"transfer_star_count,omitempty"`
NextTransferDate int `json:"next_transfer_date,omitempty"`
CanBeTransferred bool `json:"can_be_transferred,omitempty"`
// TransferStarCount Optional. Number of Telegram Stars that must be paid to transfer the gift; omitted if
// the bot cannot transfer the gift
TransferStarCount int `json:"transfer_star_count,omitempty"`
// NextTransferDate Optional. Point in time (Unix timestamp) when the gift can be transferred. If it is in
// the past, then the gift can be transferred now.
NextTransferDate int `json:"next_transfer_date,omitempty"`
}
// OwnedGifts represents a list of owned gifts with pagination.
// Since: Bot API 9.0
type OwnedGifts struct {
TotalCount int `json:"total_count"`
Gifts []OwnedGift `json:"gifts"`
NextOffset string `json:"next_offset"`
// TotalCount The total number of gifts owned by the user or the chat
TotalCount int `json:"total_count"`
// Gifts The list of gifts
Gifts []OwnedGift `json:"gifts"`
// NextOffset Optional. Offset for the next request. If empty, then there are no more results.
NextOffset string `json:"next_offset"`
}
// GiveawayCreated represents a service message about a giveaway being created.
// Since: Bot API 7.0
type GiveawayCreated struct {
// PrizeStarCount Optional. The number of Telegram Stars to be split between giveaway winners; for Telegram
// Star giveaways only
PrizeStarCount int `json:"prize_star_count,omitempty"`
}
// Giveaway represents a message about a scheduled giveaway.
// Since: Bot API 7.0
type Giveaway struct {
Chats []Chat `json:"chats"`
WinnersSelectionDate int `json:"winners_selection_date"`
WinnerCount int `json:"winner_count"`
// Chats The list of chats which the user must join to participate in the giveaway
Chats []Chat `json:"chats"`
// WinnersSelectionDate Point in time (Unix timestamp) when winners of the giveaway will be selected
WinnersSelectionDate int `json:"winners_selection_date"`
// WinnerCount The number of users which are supposed to be selected as winners of the giveaway
WinnerCount int `json:"winner_count"`
OnlyNewMembers bool `json:"only_new_members,omitempty"`
HasPublicWinners bool `json:"has_public_winners,omitempty"`
PrizeDescription string `json:"prize_description,omitempty"`
CountryCodes []string `json:"country_codes,omitempty"`
PrizeStarCount int `json:"prize_star_count,omitempty"`
PremiumSubscriptionMonthCount int `json:"premium_subscription_month_count,omitempty"`
// OnlyNewMembers Optional. True, if only users who join the chats after the giveaway started should be
// eligible to win
OnlyNewMembers bool `json:"only_new_members,omitempty"`
// HasPublicWinners Optional. True, if the list of giveaway winners will be visible to everyone
HasPublicWinners bool `json:"has_public_winners,omitempty"`
// PrizeDescription Optional. Description of additional giveaway prize
PrizeDescription string `json:"prize_description,omitempty"`
// CountryCodes Optional. A list of two-letter ISO 3166-1 alpha-2 country codes indicating the countries
// from which eligible users for the giveaway must come. If empty, then all users can participate in the
// giveaway. Users with a phone number that was bought on Fragment can always participate in giveaways.
CountryCodes []string `json:"country_codes,omitempty"`
// PrizeStarCount Optional. The number of Telegram Stars to be split between giveaway winners; for Telegram
// Star giveaways only
PrizeStarCount int `json:"prize_star_count,omitempty"`
// PremiumSubscriptionMonthCount Optional. The number of months the Telegram Premium subscription won from
// the giveaway will be active for; for Telegram Premium giveaways only
PremiumSubscriptionMonthCount int `json:"premium_subscription_month_count,omitempty"`
}
// GiveawayWinners represents a message about the completion of a giveaway with public winners.
// Since: Bot API 7.0
type GiveawayWinners struct {
Chat Chat `json:"chat"`
GiveawayMessageID int `json:"giveaway_message_id"`
WinnersSelectionDate int `json:"winners_selection_date"`
WinnerCount int `json:"winner_count"`
Winners []User `json:"winners"`
// Chat The chat that created the giveaway
Chat Chat `json:"chat"`
// GiveawayMessageID Identifier of the message with the giveaway in the chat
GiveawayMessageID int `json:"giveaway_message_id"`
// WinnersSelectionDate Point in time (Unix timestamp) when winners of the giveaway were selected
WinnersSelectionDate int `json:"winners_selection_date"`
// WinnerCount Total number of winners in the giveaway
WinnerCount int `json:"winner_count"`
// Winners List of up to 100 winners of the giveaway
Winners []User `json:"winners"`
AdditionalChatCount int `json:"additional_chat_count,omitempty"`
PrizeStarCount int `json:"prize_star_count,omitempty"`
PremiumSubscriptionMonthCount int `json:"premium_subscription_month_count,omitempty"`
UnclaimedPrizeCount int `json:"unclaimed_prize_count,omitempty"`
OnlyNewMembers bool `json:"only_new_members,omitempty"`
WasRefunded bool `json:"was_refunded,omitempty"`
PrizeDescription string `json:"prize_description,omitempty"`
// AdditionalChatCount Optional. The number of other chats the user had to join in order to be eligible for
// the giveaway
AdditionalChatCount int `json:"additional_chat_count,omitempty"`
// PrizeStarCount Optional. The number of Telegram Stars that were split between giveaway winners; for
// Telegram Star giveaways only
PrizeStarCount int `json:"prize_star_count,omitempty"`
// PremiumSubscriptionMonthCount Optional. The number of months the Telegram Premium subscription won from
// the giveaway will be active for; for Telegram Premium giveaways only
PremiumSubscriptionMonthCount int `json:"premium_subscription_month_count,omitempty"`
// UnclaimedPrizeCount Optional. Number of undistributed prizes
UnclaimedPrizeCount int `json:"unclaimed_prize_count,omitempty"`
// OnlyNewMembers Optional. True, if only users who had joined the chats after the giveaway started were
// eligible to win
OnlyNewMembers bool `json:"only_new_members,omitempty"`
// WasRefunded Optional. True, if the giveaway was canceled because the payment for it was refunded
WasRefunded bool `json:"was_refunded,omitempty"`
// PrizeDescription Optional. Description of additional giveaway prize
PrizeDescription string `json:"prize_description,omitempty"`
}
// GiveawayCompleted represents a service message about the completion of a giveaway without public winners.
// Since: Bot API 7.0
type GiveawayCompleted struct {
WinnerCount int `json:"winner_count"`
UnclaimedPrizeCount int `json:"unclaimed_prize_count,omitempty"`
GiveawayMessage *Message `json:"giveaway_message,omitempty"`
IsStarGiveaway bool `json:"is_star_giveaway,omitempty"`
// WinnerCount Number of winners in the giveaway
WinnerCount int `json:"winner_count"`
// UnclaimedPrizeCount Optional. Number of undistributed prizes
UnclaimedPrizeCount int `json:"unclaimed_prize_count,omitempty"`
// GiveawayMessage Optional. Message with the giveaway that was completed, if it wasn't deleted
GiveawayMessage *Message `json:"giveaway_message,omitempty"`
// IsStarGiveaway Optional. True, if the giveaway is a Telegram Star giveaway. Otherwise, currently, the
// giveaway is a Telegram Premium giveaway.
IsStarGiveaway bool `json:"is_star_giveaway,omitempty"`
}
// WriteAccessAllowed represents a service message about a user allowing a bot to write messages.
// Since: Bot API 6.4
type WriteAccessAllowed struct {
FromRequest bool `json:"from_request,omitempty"`
WebAppName string `json:"web_app_name,omitempty"`
FromAttachmentMenu bool `json:"from_attachment_menu,omitempty"`
// FromRequest Optional. True, if the access was granted after the user accepted an explicit request from a
// Web App sent by the method requestWriteAccess
FromRequest bool `json:"from_request,omitempty"`
// WebAppName Optional. Name of the Web App, if the access was granted when the Web App was launched from a
// link
WebAppName string `json:"web_app_name,omitempty"`
// FromAttachmentMenu Optional. True, if the access was granted when the bot was added to the attachment or
// side menu
FromAttachmentMenu bool `json:"from_attachment_menu,omitempty"`
}
// BackgroundFillType represents the type of a background fill.
@@ -577,14 +887,21 @@ const (
// BackgroundFill describes the way a background is filled.
// Since: Bot API 7.5
type BackgroundFill struct {
// Type identifies the concrete fill variant.
Type BackgroundFillType `json:"type"`
// Color The color of the background fill in the RGB24 format
Color int `json:"color,omitempty"`
TopColor int `json:"top_color,omitempty"`
BottomColor int `json:"bottom_color,omitempty"`
// TopColor Top color of the gradient in the RGB24 format
TopColor int `json:"top_color,omitempty"`
// BottomColor Bottom color of the gradient in the RGB24 format
BottomColor int `json:"bottom_color,omitempty"`
// RotationAngle Clockwise rotation angle of the background fill in degrees; 0-359
RotationAngle int `json:"rotation_angle,omitempty"`
// Colors A list of the 3 or 4 base colors that are used to generate the freeform gradient in the RGB24
// format
Colors []int `json:"colors,omitempty"`
}
@@ -606,18 +923,29 @@ const (
// BackgroundType describes the type of a background.
// Since: Bot API 7.5
type BackgroundType struct {
// Type identifies the concrete background variant.
Type BackgroundTypeType `json:"type"`
Fill *BackgroundFill `json:"fill,omitempty"`
DarkThemeDimming int `json:"dark_theme_dimming,omitempty"`
// Fill contains the background fill for fill and pattern variants.
Fill *BackgroundFill `json:"fill,omitempty"`
// DarkThemeDimming Dimming of the background in dark themes, as a percentage; 0-100
DarkThemeDimming int `json:"dark_theme_dimming,omitempty"`
Document *Document `json:"document,omitempty"`
IsBlurred bool `json:"is_blurred,omitempty"`
IsMoving bool `json:"is_moving,omitempty"`
// Document contains the wallpaper or pattern document for document-backed variants.
Document *Document `json:"document,omitempty"`
// IsBlurred Optional. True, if the wallpaper is downscaled to fit in a 450x450 square and then box-blurred
// with radius 12
IsBlurred bool `json:"is_blurred,omitempty"`
// IsMoving Optional. True, if the background moves slightly when the device is tilted
IsMoving bool `json:"is_moving,omitempty"`
Intensity int `json:"intensity,omitempty"`
// Intensity Intensity of the pattern when it is shown above the filled background; 0-100
Intensity int `json:"intensity,omitempty"`
// IsInverted Optional. True, if the background fill must be applied only to the pattern itself. All other
// pixels are black in this case. For dark themes only.
IsInverted bool `json:"is_inverted,omitempty"`
// ThemeName Name of the chat theme, which is usually an emoji
ThemeName string `json:"theme_name,omitempty"`
}
+35 -27
View File
@@ -4,6 +4,7 @@ import (
"bytes"
"context"
"fmt"
"io"
"mime/multipart"
"net/http"
"path/filepath"
@@ -133,6 +134,7 @@ func (r UploaderRequest[R, P]) doRequest(ctx context.Context, up *Uploader) (R,
}
url := fmt.Sprintf("%s/bot%s%s/%s", up.api.apiURL, up.api.token, methodPrefix, r.method)
retries := 0
for {
if up.api.Limiter != nil {
if err := up.api.Limiter.Check(ctx, up.api.dropOverflowLimit, r.chatID); err != nil {
@@ -140,23 +142,21 @@ func (r UploaderRequest[R, P]) doRequest(ctx context.Context, up *Uploader) (R,
}
}
buf, contentType, err := prepareMultipart(r.files, r.params)
requestBody, contentType := prepareMultipartStream(r.files, r.params)
req, err := http.NewRequestWithContext(ctx, "POST", url, requestBody)
if err != nil {
return zero, err
}
req, err := http.NewRequestWithContext(ctx, "POST", url, buf)
if err != nil {
return zero, err
_ = requestBody.Close()
return zero, fmt.Errorf("failed to create upload request: %w", err)
}
req.Header.Set("Content-Type", contentType)
req.Header.Set("Accept", "application/json")
req.Header.Set("User-Agent", fmt.Sprintf("Laniakea/%s", utils.VersionString))
req.ContentLength = int64(buf.Len())
up.logger.Debugln("UPLOADER REQ", url)
resp, err := up.api.client.Do(req)
_ = requestBody.Close()
if err != nil {
return zero, err
return zero, fmt.Errorf("HTTP upload request failed: %w", err)
}
body, err := readBody(resp.Body)
@@ -172,6 +172,11 @@ func (r UploaderRequest[R, P]) doRequest(ctx context.Context, up *Uploader) (R,
}
if !response.Ok {
responseErr := &ResponseError{
Code: response.ErrorCode,
Description: response.Description,
Parameters: response.Parameters,
}
if response.ErrorCode == 429 && response.Parameters != nil && response.Parameters.RetryAfter != nil {
after := *response.Parameters.RetryAfter
up.logger.Warnf("Rate limited, retry after %d seconds (chat: %d)", after, r.chatID)
@@ -182,19 +187,19 @@ func (r UploaderRequest[R, P]) doRequest(ctx context.Context, up *Uploader) (R,
up.api.Limiter.SetGlobalLock(after)
}
}
if retries >= up.api.maxRetries {
return zero, fmt.Errorf("%w after %d retries: %w", ErrRetryLimit, retries, responseErr)
}
retries++
select {
case <-ctx.Done():
return zero, ctx.Err()
case <-time.After(time.Duration(after) * time.Second):
case <-time.After(retryDelay(after)):
continue
}
}
return zero, &ResponseError{
Code: response.ErrorCode,
Description: response.Description,
Parameters: response.Parameters,
}
return zero, responseErr
}
return response.Result, nil
}
@@ -232,36 +237,39 @@ func (r UploaderRequest[R, P]) Do(up *Uploader) (R, error) {
return r.DoWithContext(context.Background(), up)
}
func prepareMultipart[P any](files []UploaderFile, params P) (*bytes.Buffer, string, error) {
buf := bytes.NewBuffer(nil)
w := multipart.NewWriter(buf)
func prepareMultipartStream[P any](files []UploaderFile, params P) (io.ReadCloser, string) {
reader, writer := io.Pipe()
multipartWriter := multipart.NewWriter(writer)
contentType := multipartWriter.FormDataContentType()
go func() {
err := writeMultipart(multipartWriter, files, params)
_ = writer.CloseWithError(err)
}()
return reader, contentType
}
func writeMultipart[P any](w *multipart.Writer, files []UploaderFile, params P) error {
for _, file := range files {
fw, err := w.CreateFormFile(string(file.field), file.filename)
if err != nil {
_ = w.Close()
return nil, "", err
return err
}
_, err = fw.Write(file.data)
_, err = io.Copy(fw, bytes.NewReader(file.data))
if err != nil {
_ = w.Close()
return nil, "", err
return err
}
}
err := utils.Encode(w, params)
if err != nil {
_ = w.Close()
return nil, "", err
return err
}
err = w.Close()
if err != nil {
return nil, "", err
}
return buf, w.FormDataContentType(), nil
return w.Close()
}
func uploaderTypeByExt(filename string) UploaderFileType {
+40 -5
View File
@@ -278,19 +278,17 @@ func TestPrepareMultipartRichMessageUsesAttachName(t *testing.T) {
}},
}
buf, contentType, err := prepareMultipart(
body, contentType := prepareMultipartStream(
[]UploaderFile{NewUploaderFile("animation.mp4", []byte("animation")).SetAttachName("animation")},
params,
)
if err != nil {
t.Fatalf("prepareMultipart returned error: %v", err)
}
defer func() { _ = body.Close() }()
_, contentTypeParams, err := mime.ParseMediaType(contentType)
if err != nil {
t.Fatalf("ParseMediaType returned error: %v", err)
}
reader := multipart.NewReader(buf, contentTypeParams["boundary"])
reader := multipart.NewReader(body, contentTypeParams["boundary"])
parts := make(map[string]string)
var fileData []byte
@@ -324,6 +322,43 @@ func TestPrepareMultipartRichMessageUsesAttachName(t *testing.T) {
}
}
func TestUploaderStopsAfterConfiguredRetryLimit(t *testing.T) {
calls := 0
client := &http.Client{Transport: roundTripFunc(func(req *http.Request) (*http.Response, error) {
_, _ = io.Copy(io.Discard, req.Body)
calls++
return &http.Response{
StatusCode: http.StatusOK,
Body: io.NopCloser(strings.NewReader(
`{"ok":false,"error_code":429,"description":"retry","parameters":{"retry_after":0}}`,
)),
}, nil
})}
api := NewAPI(NewAPIOpts("token").
SetAPIURL("https://example.test").
SetHTTPClient(client).
SetMaxRetries(1))
defer func() { _ = api.Close() }()
uploader := NewUploader(api)
defer func() { _ = uploader.Close() }()
_, err := uploader.SendPhoto(
UploadPhoto{ChatID: 42},
NewUploaderFile("photo.jpg", []byte("img")),
)
if !errors.Is(err, ErrRetryLimit) {
t.Fatalf("expected ErrRetryLimit, got %v", err)
}
var responseErr *ResponseError
if !errors.As(err, &responseErr) || responseErr.Code != http.StatusTooManyRequests {
t.Fatalf("expected wrapped 429 ResponseError, got %v", err)
}
if calls != 2 {
t.Fatalf("request count = %d, want 2", calls)
}
}
func readMultipartRequest(req *http.Request) (map[string]string, string, []byte, error) {
_, params, err := mime.ParseMediaType(req.Header.Get("Content-Type"))
if err != nil {
+379 -120
View File
@@ -45,29 +45,59 @@ func (u *Uploader) SendRichMessageDraftWithContext(ctx context.Context, params S
// Since: Bot API 1.0
// See https://core.telegram.org/bots/api#sendphoto
type UploadPhoto struct {
BusinessConnectionID string `json:"business_connection_id,omitempty"`
ChatID int64 `json:"chat_id"`
MessageThreadID int `json:"message_thread_id,omitempty"`
DirectMessagesTopicID int `json:"direct_messages_topic_id,omitempty"`
// BusinessConnectionID Optional. Unique identifier of the business connection on behalf of which the
// message will be sent
BusinessConnectionID string `json:"business_connection_id,omitempty"`
// ChatID Required. Unique identifier for the target chat or username of the target bot, supergroup or
// channel in the format @username
ChatID int64 `json:"chat_id"`
// MessageThreadID Optional. Unique identifier for the target message thread (topic) of a forum; for forum
// supergroups and private chats of bots with forum topic mode enabled only
MessageThreadID int `json:"message_thread_id,omitempty"`
// DirectMessagesTopicID Optional. Identifier of the direct messages topic to which the message will be
// sent; required if the message is sent to a direct messages chat
DirectMessagesTopicID int `json:"direct_messages_topic_id,omitempty"`
// ReceiverUserID identifies the user who can see the ephemeral message.
ReceiverUserID int64 `json:"receiver_user_id,omitempty"` // Since: Bot API 10.2
// CallbackQueryID identifies the callback query that triggered an ephemeral response.
CallbackQueryID string `json:"callback_query_id,omitempty"` // Since: Bot API 10.2
Caption string `json:"caption,omitempty"`
ParseMode ParseMode `json:"parse_mode,omitempty"`
// Caption Optional. Photo caption (may also be used when resending photos by file_id), 0-1024 characters
// after entities parsing
Caption string `json:"caption,omitempty"`
// ParseMode Optional. Mode for parsing entities in the photo caption. See formatting options for more
// details.
ParseMode ParseMode `json:"parse_mode,omitempty"`
// CaptionEntities Optional. A JSON-serialized list of special entities that appear in the caption, which
// can be specified instead of parse_mode
CaptionEntities []MessageEntity `json:"caption_entities,omitempty"`
ShowCaptionAboveMedia bool `json:"show_caption_above_media,omitempty"`
HasSpoiler bool `json:"has_spoiler,omitempty"`
DisableNotification bool `json:"disable_notification,omitempty"`
ProtectContent bool `json:"protect_content,omitempty"`
AllowPaidBroadcast bool `json:"allow_paid_broadcast,omitempty"`
MessageEffectID string `json:"message_effect_id,omitempty"`
// ShowCaptionAboveMedia Optional. Pass True if the caption must be shown above the message media
ShowCaptionAboveMedia bool `json:"show_caption_above_media,omitempty"`
// HasSpoiler Optional. Pass True if the photo needs to be covered with a spoiler animation
HasSpoiler bool `json:"has_spoiler,omitempty"`
// DisableNotification Optional. Sends the message silently. Users will receive a notification with no
// sound.
DisableNotification bool `json:"disable_notification,omitempty"`
// ProtectContent Optional. Protects the contents of the sent message from forwarding and saving
ProtectContent bool `json:"protect_content,omitempty"`
// AllowPaidBroadcast Optional. Pass True to allow up to 1000 messages per second, ignoring broadcasting
// limits for a fee of 0.1 Telegram Stars per message. The relevant Stars will be withdrawn from the bot's
// balance.
AllowPaidBroadcast bool `json:"allow_paid_broadcast,omitempty"`
// MessageEffectID Optional. Unique identifier of the message effect to be added to the message; for private
// chats only
MessageEffectID string `json:"message_effect_id,omitempty"`
// SuggestedPostParameters Optional. A JSON-serialized object containing the parameters of the suggested
// post to send; for direct messages chats only. If the message is sent as a reply to another suggested
// post, then that suggested post is automatically declined.
SuggestedPostParameters *SuggestedPostParameters `json:"suggested_post_parameters,omitempty"`
ReplyParameters *ReplyParameters `json:"reply_parameters,omitempty"`
ReplyMarkup *ReplyMarkup `json:"reply_markup,omitempty"`
// ReplyParameters Optional. Description of the message to reply to
ReplyParameters *ReplyParameters `json:"reply_parameters,omitempty"`
// ReplyMarkup Optional. Additional interface options. A JSON-serialized object for an inline keyboard,
// custom reply keyboard, instructions to remove a reply keyboard or to force a reply from the user.
ReplyMarkup *ReplyMarkup `json:"reply_markup,omitempty"`
}
// SendPhoto uploads a photo via multipart and sends it as a message.
@@ -92,31 +122,61 @@ func (u *Uploader) SendPhotoWithContext(ctx context.Context, params UploadPhoto,
// Since: Bot API 1.2
// See https://core.telegram.org/bots/api#sendaudio
type UploadAudio struct {
BusinessConnectionID string `json:"business_connection_id,omitempty"`
ChatID int64 `json:"chat_id"`
MessageThreadID int `json:"message_thread_id,omitempty"`
DirectMessagesTopicID int `json:"direct_messages_topic_id,omitempty"`
// BusinessConnectionID Optional. Unique identifier of the business connection on behalf of which the
// message will be sent
BusinessConnectionID string `json:"business_connection_id,omitempty"`
// ChatID Required. Unique identifier for the target chat or username of the target bot, supergroup or
// channel in the format @username
ChatID int64 `json:"chat_id"`
// MessageThreadID Optional. Unique identifier for the target message thread (topic) of a forum; for forum
// supergroups and private chats of bots with forum topic mode enabled only
MessageThreadID int `json:"message_thread_id,omitempty"`
// DirectMessagesTopicID Optional. Identifier of the direct messages topic to which the message will be
// sent; required if the message is sent to a direct messages chat
DirectMessagesTopicID int `json:"direct_messages_topic_id,omitempty"`
// ReceiverUserID identifies the user who can see the ephemeral message.
ReceiverUserID int64 `json:"receiver_user_id,omitempty"` // Since: Bot API 10.2
// CallbackQueryID identifies the callback query that triggered an ephemeral response.
CallbackQueryID string `json:"callback_query_id,omitempty"` // Since: Bot API 10.2
Caption string `json:"caption,omitempty"`
ParseMode ParseMode `json:"parse_mode,omitempty"`
// Caption Optional. Audio caption, 0-1024 characters after entities parsing
Caption string `json:"caption,omitempty"`
// ParseMode Optional. Mode for parsing entities in the audio caption. See formatting options for more
// details.
ParseMode ParseMode `json:"parse_mode,omitempty"`
// CaptionEntities Optional. A JSON-serialized list of special entities that appear in the caption, which
// can be specified instead of parse_mode
CaptionEntities []MessageEntity `json:"caption_entities,omitempty"`
Duration int `json:"duration,omitempty"`
// Duration Optional. Duration of the audio in seconds
Duration int `json:"duration,omitempty"`
// Performer Optional. Performer
Performer string `json:"performer,omitempty"`
Title string `json:"title,omitempty"`
// Title Optional. Track name
Title string `json:"title,omitempty"`
DisableNotification bool `json:"disable_notification,omitempty"`
ProtectContent bool `json:"protect_content,omitempty"`
AllowPaidBroadcast bool `json:"allow_paid_broadcast,omitempty"`
MessageEffectID string `json:"message_effect_id,omitempty"`
// DisableNotification Optional. Sends the message silently. Users will receive a notification with no
// sound.
DisableNotification bool `json:"disable_notification,omitempty"`
// ProtectContent Optional. Protects the contents of the sent message from forwarding and saving
ProtectContent bool `json:"protect_content,omitempty"`
// AllowPaidBroadcast Optional. Pass True to allow up to 1000 messages per second, ignoring broadcasting
// limits for a fee of 0.1 Telegram Stars per message. The relevant Stars will be withdrawn from the bot's
// balance.
AllowPaidBroadcast bool `json:"allow_paid_broadcast,omitempty"`
// MessageEffectID Optional. Unique identifier of the message effect to be added to the message; for private
// chats only
MessageEffectID string `json:"message_effect_id,omitempty"`
// SuggestedPostParameters Optional. A JSON-serialized object containing the parameters of the suggested
// post to send; for direct messages chats only. If the message is sent as a reply to another suggested
// post, then that suggested post is automatically declined.
SuggestedPostParameters *SuggestedPostParameters `json:"suggested_post_parameters,omitempty"`
ReplyParameters *ReplyParameters `json:"reply_parameters,omitempty"`
ReplyMarkup *ReplyMarkup `json:"reply_markup,omitempty"`
// ReplyParameters Optional. Description of the message to reply to
ReplyParameters *ReplyParameters `json:"reply_parameters,omitempty"`
// ReplyMarkup Optional. Additional interface options. A JSON-serialized object for an inline keyboard,
// custom reply keyboard, instructions to remove a reply keyboard or to force a reply from the user.
ReplyMarkup *ReplyMarkup `json:"reply_markup,omitempty"`
}
// SendAudio uploads an audio file via multipart and sends it as a message.
@@ -141,28 +201,58 @@ func (u *Uploader) SendAudioWithContext(ctx context.Context, params UploadAudio,
// Since: Bot API 1.0
// See https://core.telegram.org/bots/api#senddocument
type UploadDocument struct {
BusinessConnectionID string `json:"business_connection_id,omitempty"`
ChatID int64 `json:"chat_id"`
MessageThreadID int `json:"message_thread_id,omitempty"`
DirectMessagesTopicID int `json:"direct_messages_topic_id,omitempty"`
// BusinessConnectionID Optional. Unique identifier of the business connection on behalf of which the
// message will be sent
BusinessConnectionID string `json:"business_connection_id,omitempty"`
// ChatID Required. Unique identifier for the target chat or username of the target bot, supergroup or
// channel in the format @username
ChatID int64 `json:"chat_id"`
// MessageThreadID Optional. Unique identifier for the target message thread (topic) of a forum; for forum
// supergroups and private chats of bots with forum topic mode enabled only
MessageThreadID int `json:"message_thread_id,omitempty"`
// DirectMessagesTopicID Optional. Identifier of the direct messages topic to which the message will be
// sent; required if the message is sent to a direct messages chat
DirectMessagesTopicID int `json:"direct_messages_topic_id,omitempty"`
// ReceiverUserID identifies the user who can see the ephemeral message.
ReceiverUserID int64 `json:"receiver_user_id,omitempty"` // Since: Bot API 10.2
// CallbackQueryID identifies the callback query that triggered an ephemeral response.
CallbackQueryID string `json:"callback_query_id,omitempty"` // Since: Bot API 10.2
Caption string `json:"caption,omitempty"`
ParseMode ParseMode `json:"parse_mode,omitempty"`
// Caption Optional. Document caption (may also be used when resending documents by file_id), 0-1024
// characters after entities parsing
Caption string `json:"caption,omitempty"`
// ParseMode Optional. Mode for parsing entities in the document caption. See formatting options for more
// details.
ParseMode ParseMode `json:"parse_mode,omitempty"`
// CaptionEntities Optional. A JSON-serialized list of special entities that appear in the caption, which
// can be specified instead of parse_mode
CaptionEntities []MessageEntity `json:"caption_entities,omitempty"`
DisableContentTypeDetection bool `json:"disable_content_type_detection,omitempty"`
DisableNotification bool `json:"disable_notification,omitempty"`
ProtectContent bool `json:"protect_content,omitempty"`
AllowPaidBroadcast bool `json:"allow_paid_broadcast,omitempty"`
MessageEffectID string `json:"message_effect_id,omitempty"`
// DisableContentTypeDetection Optional. Disables automatic server-side content type detection for files
// uploaded using multipart/form-data
DisableContentTypeDetection bool `json:"disable_content_type_detection,omitempty"`
// DisableNotification Optional. Sends the message silently. Users will receive a notification with no
// sound.
DisableNotification bool `json:"disable_notification,omitempty"`
// ProtectContent Optional. Protects the contents of the sent message from forwarding and saving
ProtectContent bool `json:"protect_content,omitempty"`
// AllowPaidBroadcast Optional. Pass True to allow up to 1000 messages per second, ignoring broadcasting
// limits for a fee of 0.1 Telegram Stars per message. The relevant Stars will be withdrawn from the bot's
// balance.
AllowPaidBroadcast bool `json:"allow_paid_broadcast,omitempty"`
// MessageEffectID Optional. Unique identifier of the message effect to be added to the message; for private
// chats only
MessageEffectID string `json:"message_effect_id,omitempty"`
// SuggestedPostParameters Optional. A JSON-serialized object containing the parameters of the suggested
// post to send; for direct messages chats only. If the message is sent as a reply to another suggested
// post, then that suggested post is automatically declined.
SuggestedPostParameters *SuggestedPostParameters `json:"suggested_post_parameters,omitempty"`
ReplyParameters *ReplyParameters `json:"reply_parameters,omitempty"`
ReplyMarkup *ReplyMarkup `json:"reply_markup,omitempty"`
// ReplyParameters Optional. Description of the message to reply to
ReplyParameters *ReplyParameters `json:"reply_parameters,omitempty"`
// ReplyMarkup Optional. Additional interface options. A JSON-serialized object for an inline keyboard,
// custom reply keyboard, instructions to remove a reply keyboard or to force a reply from the user.
ReplyMarkup *ReplyMarkup `json:"reply_markup,omitempty"`
}
// SendDocument uploads a document via multipart and sends it as a message.
@@ -187,35 +277,70 @@ func (u *Uploader) SendDocumentWithContext(ctx context.Context, params UploadDoc
// Since: Bot API 1.0
// See https://core.telegram.org/bots/api#sendvideo
type UploadVideo struct {
BusinessConnectionID string `json:"business_connection_id,omitempty"`
ChatID int64 `json:"chat_id"`
MessageThreadID int `json:"message_thread_id,omitempty"`
DirectMessagesTopicID int `json:"direct_messages_topic_id,omitempty"`
// BusinessConnectionID Optional. Unique identifier of the business connection on behalf of which the
// message will be sent
BusinessConnectionID string `json:"business_connection_id,omitempty"`
// ChatID Required. Unique identifier for the target chat or username of the target bot, supergroup or
// channel in the format @username
ChatID int64 `json:"chat_id"`
// MessageThreadID Optional. Unique identifier for the target message thread (topic) of a forum; for forum
// supergroups and private chats of bots with forum topic mode enabled only
MessageThreadID int `json:"message_thread_id,omitempty"`
// DirectMessagesTopicID Optional. Identifier of the direct messages topic to which the message will be
// sent; required if the message is sent to a direct messages chat
DirectMessagesTopicID int `json:"direct_messages_topic_id,omitempty"`
// ReceiverUserID identifies the user who can see the ephemeral message.
ReceiverUserID int64 `json:"receiver_user_id,omitempty"` // Since: Bot API 10.2
// CallbackQueryID identifies the callback query that triggered an ephemeral response.
CallbackQueryID string `json:"callback_query_id,omitempty"` // Since: Bot API 10.2
// Duration Optional. Duration of sent video in seconds
Duration int `json:"duration,omitempty"`
Width int `json:"width,omitempty"`
Height int `json:"height,omitempty"`
// Width Optional. Video width
Width int `json:"width,omitempty"`
// Height Optional. Video height
Height int `json:"height,omitempty"`
StartTimestamp int64 `json:"start_timestamp,omitempty"`
Caption string `json:"caption,omitempty"`
ParseMode ParseMode `json:"parse_mode,omitempty"`
// StartTimestamp Optional. Start timestamp for the video in the message
StartTimestamp int64 `json:"start_timestamp,omitempty"`
// Caption Optional. Video caption (may also be used when resending videos by file_id), 0-1024 characters
// after entities parsing
Caption string `json:"caption,omitempty"`
// ParseMode Optional. Mode for parsing entities in the video caption. See formatting options for more
// details.
ParseMode ParseMode `json:"parse_mode,omitempty"`
// CaptionEntities Optional. A JSON-serialized list of special entities that appear in the caption, which
// can be specified instead of parse_mode
CaptionEntities []MessageEntity `json:"caption_entities,omitempty"`
ShowCaptionAboveMedia bool `json:"show_caption_above_media,omitempty"`
HasSpoiler bool `json:"has_spoiler,omitempty"`
SupportsStreaming bool `json:"supports_streaming,omitempty"`
DisableNotification bool `json:"disable_notification,omitempty"`
ProtectContent bool `json:"protect_content,omitempty"`
AllowPaidBroadcast bool `json:"allow_paid_broadcast,omitempty"`
MessageEffectID string `json:"message_effect_id,omitempty"`
// ShowCaptionAboveMedia Optional. Pass True if the caption must be shown above the message media
ShowCaptionAboveMedia bool `json:"show_caption_above_media,omitempty"`
// HasSpoiler Optional. Pass True if the video needs to be covered with a spoiler animation
HasSpoiler bool `json:"has_spoiler,omitempty"`
// SupportsStreaming Optional. Pass True if the uploaded video is suitable for streaming
SupportsStreaming bool `json:"supports_streaming,omitempty"`
// DisableNotification Optional. Sends the message silently. Users will receive a notification with no
// sound.
DisableNotification bool `json:"disable_notification,omitempty"`
// ProtectContent Optional. Protects the contents of the sent message from forwarding and saving
ProtectContent bool `json:"protect_content,omitempty"`
// AllowPaidBroadcast Optional. Pass True to allow up to 1000 messages per second, ignoring broadcasting
// limits for a fee of 0.1 Telegram Stars per message. The relevant Stars will be withdrawn from the bot's
// balance.
AllowPaidBroadcast bool `json:"allow_paid_broadcast,omitempty"`
// MessageEffectID Optional. Unique identifier of the message effect to be added to the message; for private
// chats only
MessageEffectID string `json:"message_effect_id,omitempty"`
// SuggestedPostParameters Optional. A JSON-serialized object containing the parameters of the suggested
// post to send; for direct messages chats only. If the message is sent as a reply to another suggested
// post, then that suggested post is automatically declined.
SuggestedPostParameters *SuggestedPostParameters `json:"suggested_post_parameters,omitempty"`
ReplyParameters *ReplyParameters `json:"reply_parameters,omitempty"`
ReplyMarkup *ReplyMarkup `json:"reply_markup,omitempty"`
// ReplyParameters Optional. Description of the message to reply to
ReplyParameters *ReplyParameters `json:"reply_parameters,omitempty"`
// ReplyMarkup Optional. Additional interface options. A JSON-serialized object for an inline keyboard,
// custom reply keyboard, instructions to remove a reply keyboard or to force a reply from the user.
ReplyMarkup *ReplyMarkup `json:"reply_markup,omitempty"`
}
// SendVideo uploads a video via multipart and sends it as a message.
@@ -240,33 +365,66 @@ func (u *Uploader) SendVideoWithContext(ctx context.Context, params UploadVideo,
// Since: Bot API 4.0
// See https://core.telegram.org/bots/api#sendanimation
type UploadAnimation struct {
BusinessConnectionID string `json:"business_connection_id,omitempty"`
ChatID int64 `json:"chat_id"`
MessageThreadID int `json:"message_thread_id,omitempty"`
DirectMessagesTopicID int `json:"direct_messages_topic_id,omitempty"`
// BusinessConnectionID Optional. Unique identifier of the business connection on behalf of which the
// message will be sent
BusinessConnectionID string `json:"business_connection_id,omitempty"`
// ChatID Required. Unique identifier for the target chat or username of the target bot, supergroup or
// channel in the format @username
ChatID int64 `json:"chat_id"`
// MessageThreadID Optional. Unique identifier for the target message thread (topic) of a forum; for forum
// supergroups and private chats of bots with forum topic mode enabled only
MessageThreadID int `json:"message_thread_id,omitempty"`
// DirectMessagesTopicID Optional. Identifier of the direct messages topic to which the message will be
// sent; required if the message is sent to a direct messages chat
DirectMessagesTopicID int `json:"direct_messages_topic_id,omitempty"`
// ReceiverUserID identifies the user who can see the ephemeral message.
ReceiverUserID int64 `json:"receiver_user_id,omitempty"` // Since: Bot API 10.2
// CallbackQueryID identifies the callback query that triggered an ephemeral response.
CallbackQueryID string `json:"callback_query_id,omitempty"` // Since: Bot API 10.2
// Duration Optional. Duration of sent animation in seconds
Duration int `json:"duration,omitempty"`
Width int `json:"width,omitempty"`
Height int `json:"height,omitempty"`
// Width Optional. Animation width
Width int `json:"width,omitempty"`
// Height Optional. Animation height
Height int `json:"height,omitempty"`
Caption string `json:"caption,omitempty"`
ParseMode ParseMode `json:"parse_mode,omitempty"`
// Caption Optional. Animation caption (may also be used when resending animation by file_id), 0-1024
// characters after entities parsing
Caption string `json:"caption,omitempty"`
// ParseMode Optional. Mode for parsing entities in the animation caption. See formatting options for more
// details.
ParseMode ParseMode `json:"parse_mode,omitempty"`
// CaptionEntities Optional. A JSON-serialized list of special entities that appear in the caption, which
// can be specified instead of parse_mode
CaptionEntities []MessageEntity `json:"caption_entities,omitempty"`
ShowCaptionAboveMedia bool `json:"show_caption_above_media,omitempty"`
HasSpoiler bool `json:"has_spoiler,omitempty"`
DisableNotification bool `json:"disable_notification,omitempty"`
ProtectContent bool `json:"protect_content,omitempty"`
AllowPaidBroadcast bool `json:"allow_paid_broadcast,omitempty"`
MessageEffectID string `json:"message_effect_id,omitempty"`
// ShowCaptionAboveMedia Optional. Pass True if the caption must be shown above the message media
ShowCaptionAboveMedia bool `json:"show_caption_above_media,omitempty"`
// HasSpoiler Optional. Pass True if the animation needs to be covered with a spoiler animation
HasSpoiler bool `json:"has_spoiler,omitempty"`
// DisableNotification Optional. Sends the message silently. Users will receive a notification with no
// sound.
DisableNotification bool `json:"disable_notification,omitempty"`
// ProtectContent Optional. Protects the contents of the sent message from forwarding and saving
ProtectContent bool `json:"protect_content,omitempty"`
// AllowPaidBroadcast Optional. Pass True to allow up to 1000 messages per second, ignoring broadcasting
// limits for a fee of 0.1 Telegram Stars per message. The relevant Stars will be withdrawn from the bot's
// balance.
AllowPaidBroadcast bool `json:"allow_paid_broadcast,omitempty"`
// MessageEffectID Optional. Unique identifier of the message effect to be added to the message; for private
// chats only
MessageEffectID string `json:"message_effect_id,omitempty"`
// SuggestedPostParameters Optional. A JSON-serialized object containing the parameters of the suggested
// post to send; for direct messages chats only. If the message is sent as a reply to another suggested
// post, then that suggested post is automatically declined.
SuggestedPostParameters *SuggestedPostParameters `json:"suggested_post_parameters,omitempty"`
ReplyParameters *ReplyParameters `json:"reply_parameters,omitempty"`
ReplyMarkup *ReplyMarkup `json:"reply_markup,omitempty"`
// ReplyParameters Optional. Description of the message to reply to
ReplyParameters *ReplyParameters `json:"reply_parameters,omitempty"`
// ReplyMarkup Optional. Additional interface options. A JSON-serialized object for an inline keyboard,
// custom reply keyboard, instructions to remove a reply keyboard or to force a reply from the user.
ReplyMarkup *ReplyMarkup `json:"reply_markup,omitempty"`
}
// SendAnimation uploads an animation via multipart and sends it as a message.
@@ -291,28 +449,56 @@ func (u *Uploader) SendAnimationWithContext(ctx context.Context, params UploadAn
// Since: Bot API 1.2
// See https://core.telegram.org/bots/api#sendvoice
type UploadVoice struct {
BusinessConnectionID string `json:"business_connection_id,omitempty"`
ChatID int64 `json:"chat_id"`
MessageThreadID int `json:"message_thread_id,omitempty"`
DirectMessagesTopicID int `json:"direct_messages_topic_id,omitempty"`
// BusinessConnectionID Optional. Unique identifier of the business connection on behalf of which the
// message will be sent
BusinessConnectionID string `json:"business_connection_id,omitempty"`
// ChatID Required. Unique identifier for the target chat or username of the target bot, supergroup or
// channel in the format @username
ChatID int64 `json:"chat_id"`
// MessageThreadID Optional. Unique identifier for the target message thread (topic) of a forum; for forum
// supergroups and private chats of bots with forum topic mode enabled only
MessageThreadID int `json:"message_thread_id,omitempty"`
// DirectMessagesTopicID Optional. Identifier of the direct messages topic to which the message will be
// sent; required if the message is sent to a direct messages chat
DirectMessagesTopicID int `json:"direct_messages_topic_id,omitempty"`
// ReceiverUserID identifies the user who can see the ephemeral message.
ReceiverUserID int64 `json:"receiver_user_id,omitempty"` // Since: Bot API 10.2
// CallbackQueryID identifies the callback query that triggered an ephemeral response.
CallbackQueryID string `json:"callback_query_id,omitempty"` // Since: Bot API 10.2
Caption string `json:"caption,omitempty"`
ParseMode ParseMode `json:"parse_mode,omitempty"`
// Caption Optional. Voice message caption, 0-1024 characters after entities parsing
Caption string `json:"caption,omitempty"`
// ParseMode Optional. Mode for parsing entities in the voice message caption. See formatting options for
// more details.
ParseMode ParseMode `json:"parse_mode,omitempty"`
// CaptionEntities Optional. A JSON-serialized list of special entities that appear in the caption, which
// can be specified instead of parse_mode
CaptionEntities []MessageEntity `json:"caption_entities,omitempty"`
Duration int `json:"duration,omitempty"`
// Duration Optional. Duration of the voice message in seconds
Duration int `json:"duration,omitempty"`
DisableNotification bool `json:"disable_notification,omitempty"`
ProtectContent bool `json:"protect_content,omitempty"`
AllowPaidBroadcast bool `json:"allow_paid_broadcast,omitempty"`
MessageEffectID string `json:"message_effect_id,omitempty"`
// DisableNotification Optional. Sends the message silently. Users will receive a notification with no
// sound.
DisableNotification bool `json:"disable_notification,omitempty"`
// ProtectContent Optional. Protects the contents of the sent message from forwarding and saving
ProtectContent bool `json:"protect_content,omitempty"`
// AllowPaidBroadcast Optional. Pass True to allow up to 1000 messages per second, ignoring broadcasting
// limits for a fee of 0.1 Telegram Stars per message. The relevant Stars will be withdrawn from the bot's
// balance.
AllowPaidBroadcast bool `json:"allow_paid_broadcast,omitempty"`
// MessageEffectID Optional. Unique identifier of the message effect to be added to the message; for private
// chats only
MessageEffectID string `json:"message_effect_id,omitempty"`
// SuggestedPostParameters Optional. A JSON-serialized object containing the parameters of the suggested
// post to send; for direct messages chats only. If the message is sent as a reply to another suggested
// post, then that suggested post is automatically declined.
SuggestedPostParameters *SuggestedPostParameters `json:"suggested_post_parameters,omitempty"`
ReplyParameters *ReplyParameters `json:"reply_parameters,omitempty"`
ReplyMarkup *ReplyMarkup `json:"reply_markup,omitempty"`
// ReplyParameters Optional. Description of the message to reply to
ReplyParameters *ReplyParameters `json:"reply_parameters,omitempty"`
// ReplyMarkup Optional. Additional interface options. A JSON-serialized object for an inline keyboard,
// custom reply keyboard, instructions to remove a reply keyboard or to force a reply from the user.
ReplyMarkup *ReplyMarkup `json:"reply_markup,omitempty"`
}
// SendVoice uploads a voice note via multipart and sends it as a message.
@@ -337,26 +523,50 @@ func (u *Uploader) SendVoiceWithContext(ctx context.Context, params UploadVoice,
// Since: Bot API 3.0
// See https://core.telegram.org/bots/api#sendvideonote
type UploadVideoNote struct {
BusinessConnectionID string `json:"business_connection_id,omitempty"`
ChatID int64 `json:"chat_id"`
MessageThreadID int `json:"message_thread_id,omitempty"`
DirectMessagesTopicID int `json:"direct_messages_topic_id,omitempty"`
// BusinessConnectionID Optional. Unique identifier of the business connection on behalf of which the
// message will be sent
BusinessConnectionID string `json:"business_connection_id,omitempty"`
// ChatID Required. Unique identifier for the target chat or username of the target bot, supergroup or
// channel in the format @username
ChatID int64 `json:"chat_id"`
// MessageThreadID Optional. Unique identifier for the target message thread (topic) of a forum; for forum
// supergroups and private chats of bots with forum topic mode enabled only
MessageThreadID int `json:"message_thread_id,omitempty"`
// DirectMessagesTopicID Optional. Identifier of the direct messages topic to which the message will be
// sent; required if the message is sent to a direct messages chat
DirectMessagesTopicID int `json:"direct_messages_topic_id,omitempty"`
// ReceiverUserID identifies the user who can see the ephemeral message.
ReceiverUserID int64 `json:"receiver_user_id,omitempty"` // Since: Bot API 10.2
// CallbackQueryID identifies the callback query that triggered an ephemeral response.
CallbackQueryID string `json:"callback_query_id,omitempty"` // Since: Bot API 10.2
// Duration Optional. Duration of sent video in seconds
Duration int `json:"duration,omitempty"`
Length int `json:"length,omitempty"`
// Length Optional. Video width and height, i.e. diameter of the video message
Length int `json:"length,omitempty"`
DisableNotification bool `json:"disable_notification,omitempty"`
ProtectContent bool `json:"protect_content,omitempty"`
AllowPaidBroadcast bool `json:"allow_paid_broadcast,omitempty"`
MessageEffectID string `json:"message_effect_id,omitempty"`
// DisableNotification Optional. Sends the message silently. Users will receive a notification with no
// sound.
DisableNotification bool `json:"disable_notification,omitempty"`
// ProtectContent Optional. Protects the contents of the sent message from forwarding and saving
ProtectContent bool `json:"protect_content,omitempty"`
// AllowPaidBroadcast Optional. Pass True to allow up to 1000 messages per second, ignoring broadcasting
// limits for a fee of 0.1 Telegram Stars per message. The relevant Stars will be withdrawn from the bot's
// balance.
AllowPaidBroadcast bool `json:"allow_paid_broadcast,omitempty"`
// MessageEffectID Optional. Unique identifier of the message effect to be added to the message; for private
// chats only
MessageEffectID string `json:"message_effect_id,omitempty"`
// SuggestedPostParameters Optional. A JSON-serialized object containing the parameters of the suggested
// post to send; for direct messages chats only. If the message is sent as a reply to another suggested
// post, then that suggested post is automatically declined.
SuggestedPostParameters *SuggestedPostParameters `json:"suggested_post_parameters,omitempty"`
ReplyParameters *ReplyParameters `json:"reply_parameters,omitempty"`
ReplyMarkup *ReplyMarkup `json:"reply_markup,omitempty"`
// ReplyParameters Optional. Description of the message to reply to
ReplyParameters *ReplyParameters `json:"reply_parameters,omitempty"`
// ReplyMarkup Optional. Additional interface options. A JSON-serialized object for an inline keyboard,
// custom reply keyboard, instructions to remove a reply keyboard or to force a reply from the user.
ReplyMarkup *ReplyMarkup `json:"reply_markup,omitempty"`
}
// SendVideoNote uploads a video note via multipart and sends it as a message.
@@ -381,6 +591,8 @@ func (u *Uploader) SendVideoNoteWithContext(ctx context.Context, params UploadVi
// Since: Bot API 3.1
// See https://core.telegram.org/bots/api#setchatphoto
type UploadChatPhoto struct {
// ChatID Required. Unique identifier for the target chat or username of the target channel in the format
// @username
ChatID int64 `json:"chat_id"`
}
@@ -407,12 +619,29 @@ func (u *Uploader) SetChatPhotoWithContext(ctx context.Context, params UploadCha
// Use this type when uploading a self-signed certificate file.
// See https://core.telegram.org/bots/api#setwebhook
type UploadSetWebhook struct {
URL string `json:"url"`
IPAddress string `json:"ip_address,omitempty"`
MaxConnections int8 `json:"max_connections,omitempty"`
AllowedUpdates []UpdateType `json:"allowed_updates,omitempty"`
DropPendingUpdates bool `json:"drop_pending_updates,omitempty"`
SecretToken string `json:"secret_token,omitempty"`
// URL Required. HTTPS URL to send updates to. Use an empty string to remove webhook integration.
URL string `json:"url"`
// IPAddress Optional. The fixed IP address which will be used to send webhook requests instead of the IP
// address resolved through DNS
IPAddress string `json:"ip_address,omitempty"`
// MaxConnections Optional. The maximum allowed number of simultaneous HTTPS connections to the webhook for
// update delivery, 1-100. Defaults to 40. Use lower values to limit the load on your bot's server, and
// higher values to increase your bot's throughput.
MaxConnections int8 `json:"max_connections,omitempty"`
// AllowedUpdates Optional. A JSON-serialized list of the update types you want your bot to receive. For
// example, specify ["message", "edited_channel_post", "callback_query"] to only receive updates of these
// types. See Update for a complete list of available update types. Specify an empty list to receive all
// update types except chat_member, message_reaction, and message_reaction_count (default). If not
// specified, the previous setting will be used. Please note that this parameter doesn't affect updates
// created before the call to the setWebhook, so unwanted updates may be received for a short period of
// time.
AllowedUpdates []UpdateType `json:"allowed_updates,omitempty"`
// DropPendingUpdates Optional. Pass True to drop all pending updates
DropPendingUpdates bool `json:"drop_pending_updates,omitempty"`
// SecretToken Optional. A secret token to be sent in a header “X-Telegram-Bot-Api-Secret-Token” in
// every webhook request, 1-256 characters. Only characters A-Z, a-z, 0-9, _ and - are allowed. The header
// is useful to ensure that the request comes from a webhook set by you.
SecretToken string `json:"secret_token,omitempty"`
}
// SetWebhook uploads a certificate and sets a webhook URL.
@@ -437,29 +666,59 @@ func (u *Uploader) SetWebhookWithContext(ctx context.Context, params UploadSetWe
// Since: Bot API 10.0
// See https://core.telegram.org/bots/api#sendlivephoto
type UploadLivePhoto struct {
BusinessConnectionID string `json:"business_connection_id,omitempty"`
ChatID int64 `json:"chat_id"`
MessageThreadID int `json:"message_thread_id,omitempty"`
DirectMessagesTopicID int `json:"direct_messages_topic_id,omitempty"`
// BusinessConnectionID Optional. Unique identifier of the business connection on behalf of which the
// message will be sent
BusinessConnectionID string `json:"business_connection_id,omitempty"`
// ChatID Required. Unique identifier for the target chat or username of the target channel (in the format
// @channelusername)
ChatID int64 `json:"chat_id"`
// MessageThreadID Optional. Unique identifier for the target message thread (topic) of a forum; for forum
// supergroups and private chats of bots with forum topic mode enabled only
MessageThreadID int `json:"message_thread_id,omitempty"`
// DirectMessagesTopicID Optional. Identifier of the direct messages topic to which the message will be
// sent; required if the message is sent to a direct messages chat
DirectMessagesTopicID int `json:"direct_messages_topic_id,omitempty"`
// ReceiverUserID identifies the user who can see the ephemeral message.
ReceiverUserID int64 `json:"receiver_user_id,omitempty"` // Since: Bot API 10.2
// CallbackQueryID identifies the callback query that triggered an ephemeral response.
CallbackQueryID string `json:"callback_query_id,omitempty"` // Since: Bot API 10.2
Caption string `json:"caption,omitempty"`
ParseMode ParseMode `json:"parse_mode,omitempty"`
CallbackQueryID string `json:"callback_query_id,omitempty"` // Since: Bot API 10.2
// Caption Optional. Video caption (may also be used when resending videos by file_id), 0-1024 characters
// after entities parsing
Caption string `json:"caption,omitempty"`
// ParseMode Optional. Mode for parsing entities in the video caption. See formatting options for more
// details.
ParseMode ParseMode `json:"parse_mode,omitempty"`
// CaptionEntities Optional. A JSON-serialized list of special entities that appear in the caption, which
// can be specified instead of parse_mode
CaptionEntities []MessageEntity `json:"caption_entities,omitempty"`
ShowCaptionAboveMedia bool `json:"show_caption_above_media,omitempty"`
HasSpoiler bool `json:"has_spoiler,omitempty"`
DisableNotification bool `json:"disable_notification,omitempty"`
ProtectContent bool `json:"protect_content,omitempty"`
AllowPaidBroadcast bool `json:"allow_paid_broadcast,omitempty"`
MessageEffectID string `json:"message_effect_id,omitempty"`
// ShowCaptionAboveMedia Optional. Pass True if the caption must be shown above the message media
ShowCaptionAboveMedia bool `json:"show_caption_above_media,omitempty"`
// HasSpoiler Optional. Pass True if the video needs to be covered with a spoiler animation
HasSpoiler bool `json:"has_spoiler,omitempty"`
// DisableNotification Optional. Sends the message silently. Users will receive a notification with no
// sound.
DisableNotification bool `json:"disable_notification,omitempty"`
// ProtectContent Optional. Protects the contents of the sent message from forwarding and saving
ProtectContent bool `json:"protect_content,omitempty"`
// AllowPaidBroadcast Optional. Pass True to allow up to 1000 messages per second, ignoring broadcasting
// limits for a fee of 0.1 Telegram Stars per message. The relevant Stars will be withdrawn from the bot's
// balance.
AllowPaidBroadcast bool `json:"allow_paid_broadcast,omitempty"`
// MessageEffectID Optional. Unique identifier of the message effect to be added to the message; for private
// chats only
MessageEffectID string `json:"message_effect_id,omitempty"`
// SuggestedPostParameters Optional. A JSON-serialized object containing the parameters of the suggested
// post to send; for direct messages chats only. If the message is sent as a reply to another suggested
// post, then that suggested post is automatically declined.
SuggestedPostParameters *SuggestedPostParameters `json:"suggested_post_parameters,omitempty"`
ReplyParameters *ReplyParameters `json:"reply_parameters,omitempty"`
ReplyMarkup *ReplyMarkup `json:"reply_markup,omitempty"`
// ReplyParameters Optional. Description of the message to reply to
ReplyParameters *ReplyParameters `json:"reply_parameters,omitempty"`
// ReplyMarkup Optional. Additional interface options. A JSON-serialized object for an inline keyboard,
// custom reply keyboard, instructions to remove a reply keyboard or to force a reply from the user.
ReplyMarkup *ReplyMarkup `json:"reply_markup,omitempty"`
}
// SendLivePhoto uploads a live-photo video and its static image via multipart.
+49 -18
View File
@@ -6,9 +6,14 @@ import "context"
// Since: Bot API 1.4
// See https://core.telegram.org/bots/api#getuserprofilephotos
type GetUserProfilePhotos struct {
// UserID Required. Unique identifier of the target user
UserID int64 `json:"user_id"`
Offset int `json:"offset,omitempty"`
Limit int `json:"limit,omitempty"`
// Offset Optional. Sequential number of the first photo to be returned. By default, all photos are
// returned.
Offset int `json:"offset,omitempty"`
// Limit Optional. Limits the number of photos to be retrieved. Values between 1-100 are accepted. Defaults
// to 100.
Limit int `json:"limit,omitempty"`
}
// GetUserProfilePhotos returns a list of profile pictures for a user.
@@ -32,9 +37,14 @@ func (api *API) GetUserProfilePhotosWithContext(ctx context.Context, params GetU
// Since: Bot API 9.3
// See https://core.telegram.org/bots/api#getuserprofileaudios
type GetUserProfileAudios struct {
// UserID Required. Unique identifier of the target user
UserID int64 `json:"user_id"`
Offset int `json:"offset,omitempty"`
Limit int `json:"limit,omitempty"`
// Offset Optional. Sequential number of the first audio to be returned. By default, all audios are
// returned.
Offset int `json:"offset,omitempty"`
// Limit Optional. Limits the number of audios to be retrieved. Values between 1-100 are accepted. Defaults
// to 100.
Limit int `json:"limit,omitempty"`
}
// GetUserProfileAudios returns a list of profile audios for a user.
@@ -58,9 +68,13 @@ func (api *API) GetUserProfileAudiosWithContext(ctx context.Context, params GetU
// Since: Bot API 8.0
// See https://core.telegram.org/bots/api#setuseremojistatus
type SetUserEmojiStatus struct {
UserID int64 `json:"user_id"`
EmojiID string `json:"emoji_status_custom_emoji_id,omitempty"`
ExpirationDate int `json:"emoji_status_expiration_date,omitempty"`
// UserID Required. Unique identifier of the target user
UserID int64 `json:"user_id"`
// EmojiID Optional. Custom emoji identifier of the emoji status to set. Pass an empty string to remove the
// status.
EmojiID string `json:"emoji_status_custom_emoji_id,omitempty"`
// ExpirationDate Optional. Expiration date of the emoji status, if any
ExpirationDate int `json:"emoji_status_expiration_date,omitempty"`
}
// SetUserEmojiStatus sets a custom emoji status for a user.
@@ -85,15 +99,29 @@ func (api *API) SetUserEmojiStatusWithContext(ctx context.Context, params SetUse
// Since: Bot API 9.3
// See https://core.telegram.org/bots/api#getusergifts
type GetUserGifts struct {
UserID int64 `json:"user_id"`
ExcludeUnlimited bool `json:"exclude_unlimited,omitempty"`
ExcludeLimitedUpgradable bool `json:"exclude_limited_upgradable,omitempty"`
ExcludeLimitedNonUpgradable bool `json:"exclude_limited_non_upgradable,omitempty"`
ExcludeUnique bool `json:"exclude_unique,omitempty"`
ExcludeFromBlockchain bool `json:"exclude_from_blockchain,omitempty"`
SortByPrice bool `json:"sort_by_price,omitempty"`
Offset string `json:"offset,omitempty"`
Limit int `json:"limit,omitempty"`
// UserID Required. Unique identifier of the user
UserID int64 `json:"user_id"`
// ExcludeUnlimited Optional. Pass True to exclude gifts that can be purchased an unlimited number of times
ExcludeUnlimited bool `json:"exclude_unlimited,omitempty"`
// ExcludeLimitedUpgradable Optional. Pass True to exclude gifts that can be purchased a limited number of
// times and can be upgraded to unique
ExcludeLimitedUpgradable bool `json:"exclude_limited_upgradable,omitempty"`
// ExcludeLimitedNonUpgradable Optional. Pass True to exclude gifts that can be purchased a limited number
// of times and can't be upgraded to unique
ExcludeLimitedNonUpgradable bool `json:"exclude_limited_non_upgradable,omitempty"`
// ExcludeUnique Optional. Pass True to exclude unique gifts
ExcludeUnique bool `json:"exclude_unique,omitempty"`
// ExcludeFromBlockchain Optional. Pass True to exclude gifts that were assigned from the TON blockchain and
// can't be resold or transferred in Telegram
ExcludeFromBlockchain bool `json:"exclude_from_blockchain,omitempty"`
// SortByPrice Optional. Pass True to sort results by gift price instead of send date. Sorting is applied
// before pagination.
SortByPrice bool `json:"sort_by_price,omitempty"`
// Offset Optional. Offset of the first entry to return as received from the previous request; use an empty
// string to get the first chunk of results
Offset string `json:"offset,omitempty"`
// Limit Optional. The maximum number of gifts to be returned; 1-100. Defaults to 100.
Limit int `json:"limit,omitempty"`
}
// GetUserGifts returns gifts owned by a user.
@@ -117,9 +145,12 @@ func (api *API) GetUserGiftsWithContext(ctx context.Context, params GetUserGifts
// Since: Bot API 10.0
// See https://core.telegram.org/bots/api#getuserpersonalchatmessages
type GetUserPersonalChatMessages struct {
// UserID Required. Unique identifier for the target user
UserID int64 `json:"user_id"`
Offset int `json:"offset,omitempty"`
Limit int `json:"limit,omitempty"`
// Offset is the zero-based offset of the first message to return.
Offset int `json:"offset,omitempty"`
// Limit Required. The maximum number of messages to return; 1-20
Limit int `json:"limit,omitempty"`
}
// GetUserPersonalChatMessages returns messages from the personal chat of the user with the bot.
+64 -26
View File
@@ -4,24 +4,49 @@ package tgapi
// Since: Bot API 1.0
// See https://core.telegram.org/bots/api#user
type User struct {
ID int64 `json:"id"`
FirstName string `json:"first_name"`
LastName *string `json:"last_name,omitempty"`
Username *string `json:"username,omitempty"`
// ID Unique identifier for this user or bot. This number may have more than 32 significant bits and some
// programming languages may have difficulty/silent defects in interpreting it. But it has at most 52
// significant bits, so a 64-bit integer or double-precision float type are safe for storing this
// identifier.
ID int64 `json:"id"`
// FirstName User's or bot's first name
FirstName string `json:"first_name"`
// LastName Optional. User's or bot's last name
LastName *string `json:"last_name,omitempty"`
// Username Optional. User's or bot's username
Username *string `json:"username,omitempty"`
IsBot bool `json:"is_bot"` // Since: Bot API 3.3
LanguageCode *string `json:"language_code,omitempty"` // Since: Bot API 3.0
IsPremium *bool `json:"is_premium,omitempty"` // Since: Bot API 6.1
AddedToAttachmentMenu *bool `json:"added_to_attachment_menu,omitempty"` // Since: Bot API 6.1
CanJoinGroups *bool `json:"can_join_groups,omitempty"` // Since: Bot API 4.6
CanReadAllGroupMessages *bool `json:"can_read_all_group_messages,omitempty"` // Since: Bot API 4.6
SupportsInlineQueries *bool `json:"supports_inline_queries,omitempty"` // Since: Bot API 4.6
CanConnectToBusiness *bool `json:"can_connect_to_business,omitempty"` // Since: Bot API 7.2
HasMainWebApp *bool `json:"has_main_web_app,omitempty"` // Since: Bot API 7.8
HasTopicsEnabled *bool `json:"has_topics_enabled,omitempty"` // Since: Bot API 9.3
AllowsUsersToCreateTopics *bool `json:"allows_users_to_create_topics,omitempty"` // Since: Bot API 9.4
CanManageBots *bool `json:"can_manage_bots,omitempty"` // Since: Bot API 9.6
SupportsGuestQueries *bool `json:"supports_guest_queries,omitempty"` // Since: Bot API 10.0
// IsBot True, if this user is a bot
IsBot bool `json:"is_bot"` // Since: Bot API 3.3
// LanguageCode Optional. IETF language tag of the user's language
LanguageCode *string `json:"language_code,omitempty"` // Since: Bot API 3.0
// IsPremium Optional. True, if this user is a Telegram Premium user
IsPremium *bool `json:"is_premium,omitempty"` // Since: Bot API 6.1
// AddedToAttachmentMenu Optional. True, if this user added the bot to the attachment menu
AddedToAttachmentMenu *bool `json:"added_to_attachment_menu,omitempty"` // Since: Bot API 6.1
// CanJoinGroups Optional. True, if the bot can be invited to groups. Returned only in getMe.
CanJoinGroups *bool `json:"can_join_groups,omitempty"` // Since: Bot API 4.6
// CanReadAllGroupMessages Optional. True, if privacy mode is disabled for the bot. Returned only in getMe.
CanReadAllGroupMessages *bool `json:"can_read_all_group_messages,omitempty"` // Since: Bot API 4.6
// SupportsInlineQueries Optional. True, if the bot supports inline queries. Returned only in getMe.
SupportsInlineQueries *bool `json:"supports_inline_queries,omitempty"` // Since: Bot API 4.6
// CanConnectToBusiness Optional. True, if the bot can be connected to a user account to manage it. Returned
// only in getMe.
CanConnectToBusiness *bool `json:"can_connect_to_business,omitempty"` // Since: Bot API 7.2
// HasMainWebApp Optional. True, if the bot has a main Web App. Returned only in getMe.
HasMainWebApp *bool `json:"has_main_web_app,omitempty"` // Since: Bot API 7.8
// HasTopicsEnabled Optional. True, if the bot has forum topic mode enabled in private chats. Returned only
// in getMe.
HasTopicsEnabled *bool `json:"has_topics_enabled,omitempty"` // Since: Bot API 9.3
// AllowsUsersToCreateTopics Optional. True, if the bot allows users to create and delete topics in private
// chats. Returned only in getMe.
AllowsUsersToCreateTopics *bool `json:"allows_users_to_create_topics,omitempty"` // Since: Bot API 9.4
// CanManageBots Optional. True, if other bots can be created to be controlled by the bot. Returned only in
// getMe.
CanManageBots *bool `json:"can_manage_bots,omitempty"` // Since: Bot API 9.6
// SupportsGuestQueries Optional. True, if the bot supports guest queries from chats it is not a member of.
// Returned only in getMe.
SupportsGuestQueries *bool `json:"supports_guest_queries,omitempty"` // Since: Bot API 10.0
// SupportsJoinRequestQueries reports that the bot supports join request
// queries and can be assigned to process them. Returned only in getMe.
@@ -32,33 +57,46 @@ type User struct {
// Since: Bot API 1.4
// See https://core.telegram.org/bots/api#userprofilephotos
type UserProfilePhotos struct {
TotalCount int `json:"total_count"`
Photos [][]PhotoSize `json:"photos"`
// TotalCount Total number of profile pictures the target user has
TotalCount int `json:"total_count"`
// Photos Requested profile pictures (in up to 4 sizes each)
Photos [][]PhotoSize `json:"photos"`
}
// UserProfileAudios represents a user's profile audios.
// Since: Bot API 9.3
// See https://core.telegram.org/bots/api#userprofileaudios
type UserProfileAudios struct {
TotalCount int `json:"total_count"`
Audios []Audio `json:"audios"`
// TotalCount Total number of profile audios for the target user
TotalCount int `json:"total_count"`
// Audios Requested profile audios
Audios []Audio `json:"audios"`
}
// UserRating represents a user's rating with level progression.
// Since: Bot API 9.3
// See https://core.telegram.org/bots/api#userrating
type UserRating struct {
Level int `json:"level"`
Rating int `json:"rating"`
// Level Current level of the user, indicating their reliability when purchasing digital goods and services.
// A higher level suggests a more trustworthy customer; a negative level is likely reason for concern.
Level int `json:"level"`
// Rating Numerical value of the user's rating; the higher the rating, the better
Rating int `json:"rating"`
// CurrentLevelRating The rating value required to get the current level
CurrentLevelRating int `json:"current_level_rating"`
NextLevelRating int `json:"next_level_rating"`
// NextLevelRating Optional. The rating value required to get to the next level; omitted if the maximum
// level was reached
NextLevelRating int `json:"next_level_rating"`
}
// Birthdate represents a user's birthdate.
// Since: Bot API 7.2
// See https://core.telegram.org/bots/api#birthdate
type Birthdate struct {
Day int `json:"day"`
// Day Day of the user's birth; 1-31
Day int `json:"day"`
// Month Month of the user's birth; 1-12
Month int `json:"month"`
Year int `json:"year"`
// Year Optional. Year of the user's birth
Year int `json:"year"`
}
+75
View File
@@ -0,0 +1,75 @@
package tgapi
import (
"encoding/json"
"strings"
"testing"
)
func TestTelegramWireFieldNames(t *testing.T) {
tests := []struct {
name string
value any
keys []string
bad []string
}{
{
name: "successful payment provider charge",
value: SuccessfulPayment{ProviderPaymentChargeID: "provider"},
keys: []string{"provider_payment_charge_id"},
bad: []string{"proviced_payment_charge_id"},
},
{
name: "refunded payment provider charge",
value: RefundedPayment{ProviderPaymentChargeID: "provider"},
keys: []string{"provider_payment_charge_id"},
bad: []string{"proviced_payment_charge_id"},
},
{
name: "owned gift id",
value: OwnedGift{OwnedGiftID: "gift"},
keys: []string{"owned_gift_id"},
bad: []string{"ownen_gift_id"},
},
{
name: "input checklist permissions",
value: InputChecklist{
OtherCanAddTasks: true,
OtherCanMarkTasksAsDone: true,
},
keys: []string{"others_can_add_tasks", "others_can_mark_tasks_as_done"},
bad: []string{"other_can_add_tasks", "other_can_mark_tasks_as_done"},
},
{
name: "available reactions",
value: ChatFullInfo{AvailableReaction: []ReactionType{{Type: "emoji"}}},
keys: []string{"available_reactions"},
bad: []string{"available_reaction"},
},
{
name: "reply quote parse mode",
value: ReplyParameters{QuoteParsingMode: "HTML"},
keys: []string{"quote_parse_mode"},
bad: []string{"quote_parsing_mode"},
},
}
for _, tt := range tests {
t.Run(tt.name, func(t *testing.T) {
data, err := json.Marshal(tt.value)
if err != nil {
t.Fatalf("Marshal returned error: %v", err)
}
for _, key := range tt.keys {
if !strings.Contains(string(data), `"`+key+`"`) {
t.Errorf("expected key %q in %s", key, data)
}
}
for _, key := range tt.bad {
if strings.Contains(string(data), `"`+key+`"`) {
t.Errorf("unexpected misspelled key %q in %s", key, data)
}
}
})
}
}