WIP v0.5.0

This commit is contained in:
2026-02-11 17:27:05 +03:00
parent 7ac293dd38
commit f2d85b848f
32 changed files with 2721 additions and 727 deletions

105
tgapi/api.go Normal file
View File

@@ -0,0 +1,105 @@
package tgapi
import (
"bytes"
"context"
"encoding/json"
"fmt"
"io"
"net/http"
"strings"
"time"
"git.nix13.pw/scuroneko/laniakea/utils"
"git.nix13.pw/scuroneko/slog"
)
type Api struct {
token string
client *http.Client
Logger *slog.Logger
}
func NewAPI(token string) *Api {
l := slog.CreateLogger().Level(utils.GetLoggerLevel()).Prefix("API")
l.AddWriter(l.CreateJsonStdoutWriter())
client := &http.Client{Timeout: time.Second * 10}
return &Api{token, client, l}
}
func (api *Api) CloseApi() error {
return api.Logger.Close()
}
type ApiResponse[R any] struct {
Ok bool `json:"ok"`
Description string `json:"description,omitempty"`
Result R `json:"result,omitempty"`
ErrorCode int `json:"error_code,omitempty"`
}
type TelegramRequest[R, P any] struct {
method string
params P
}
func NewRequest[R, P any](method string, params P) TelegramRequest[R, P] {
return TelegramRequest[R, P]{method: method, params: params}
}
func (r TelegramRequest[R, P]) DoWithContext(ctx context.Context, api *Api) (R, error) {
var zero R
data, err := json.Marshal(r.params)
if err != nil {
return zero, err
}
buf := bytes.NewBuffer(data)
u := fmt.Sprintf("https://api.telegram.org/bot%s/%s", api.token, r.method)
if api.Logger != nil {
api.Logger.Debugln(strings.ReplaceAll(fmt.Sprintf(
"POST %s %s", u, buf.String(),
), api.token, "<TOKEN>"))
}
req, err := http.NewRequestWithContext(ctx, "POST", u, buf)
if err != nil {
return zero, err
}
req.Header.Set("Content-Type", "application/json")
req.Header.Set("Accept", "application/json")
req.Header.Set("User-Agent", fmt.Sprintf("Laniakea/%s", utils.VersionString))
res, err := api.client.Do(req)
if err != nil {
return zero, err
}
defer res.Body.Close()
if res.StatusCode != http.StatusOK {
return zero, fmt.Errorf("unexpected status code: %d", res.StatusCode)
}
reader := io.LimitReader(res.Body, 10<<20)
data, err = io.ReadAll(reader)
if err != nil {
return zero, err
}
if api.Logger != nil {
api.Logger.Debugln(fmt.Sprintf("RES %s %s", r.method, string(data)))
}
var resp ApiResponse[R]
err = json.Unmarshal(data, &resp)
if err != nil {
return zero, err
}
if !resp.Ok {
return zero, fmt.Errorf("[%d] %s", resp.ErrorCode, resp.Description)
}
return resp.Result, nil
}
func (r TelegramRequest[R, P]) Do(api *Api) (R, error) {
ctx := context.Background()
return r.DoWithContext(ctx, api)
}

View File

@@ -0,0 +1,262 @@
package tgapi
type SendPhotoP struct {
BusinessConnectionID string `json:"business_connection_id,omitempty"`
ChatID int `json:"chat_id"`
MessageThreadID int `json:"message_thread_id,omitempty"`
DirectMessagesTopicID int `json:"direct_messages_topic_id,omitempty"`
Photo string `json:"photo"`
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"`
DisableNotifications bool `json:"disable_notifications,omitempty"`
ProtectContent bool `json:"protect_content,omitempty"`
AllowPaidBroadcast bool `json:"allow_paid_broadcast,omitempty"`
MessageEffectID string `json:"message_effect_id,omitempty"`
SuggestedPostParameters *SuggestedPostParameters `json:"suggested_post_parameters,omitempty"`
ReplyParameters *ReplyParameters `json:"reply_parameters,omitempty"`
ReplyMarkup *ReplyMarkup `json:"reply_markup,omitempty"`
}
func (api *Api) SendPhoto(params SendPhotoP) (Message, error) {
req := NewRequest[Message]("sendPhoto", params)
return req.Do(api)
}
type SendAudioP struct {
BusinessConnectionID string `json:"business_connection_id,omitempty"`
ChatID int `json:"chat_id"`
MessageThreadID int `json:"message_thread_id,omitempty"`
DirectMessagesTopicID int `json:"direct_messages_topic_id,omitempty"`
Audio string `json:"audio"`
Caption string `json:"caption,omitempty"`
ParseMode ParseMode `json:"parse_mode,omitempty"`
CaptionEntities []*MessageEntity `json:"caption_entities,omitempty"`
Duration int `json:"duration,omitempty"`
Performer string `json:"performer,omitempty"`
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"`
SuggestedPostParameters *SuggestedPostParameters `json:"suggested_post_parameters,omitempty"`
ReplyParameters *ReplyParameters `json:"reply_parameters,omitempty"`
ReplyMarkup *ReplyMarkup `json:"reply_markup,omitempty"`
}
func (api *Api) SendAudio(params SendAudioP) (Message, error) {
req := NewRequest[Message]("sendAudio", params)
return req.Do(api)
}
type SendDocumentP struct {
BusinessConnectionID string `json:"business_connection_id,omitempty"`
ChatID int `json:"chat_id"`
MessageThreadID int `json:"message_thread_id,omitempty"`
DirectMessagesTopicID int `json:"direct_messages_topic_id,omitempty"`
Document string `json:"document"`
Caption string `json:"caption,omitempty"`
ParseMode ParseMode `json:"parse_mode,omitempty"`
CaptionEntities []*MessageEntity `json:"caption_entities,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"`
SuggestedPostParameters *SuggestedPostParameters `json:"suggested_post_parameters,omitempty"`
ReplyParameters *ReplyParameters `json:"reply_parameters,omitempty"`
ReplyMarkup *ReplyMarkup `json:"reply_markup,omitempty"`
}
func (api *Api) SendDocument(params SendDocumentP) (Message, error) {
req := NewRequest[Message]("sendDocument", params)
return req.Do(api)
}
type SendVideoP struct {
BusinessConnectionID string `json:"business_connection_id,omitempty"`
ChatID int `json:"chat_id"`
MessageThreadID int `json:"message_thread_id,omitempty"`
DirectMessagesTopicID int `json:"direct_messages_topic_id,omitempty"`
Video string `json:"video"`
Duration int `json:"duration,omitempty"`
Width int `json:"width,omitempty"`
Height int `json:"height,omitempty"`
Cover string `json:"cover,omitempty"`
StartTimestamp int `json:"start_timestamp,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"`
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"`
SuggestedPostParameters *SuggestedPostParameters `json:"suggested_post_parameters,omitempty"`
ReplyParameters *ReplyParameters `json:"reply_parameters,omitempty"`
ReplyMarkup *ReplyMarkup `json:"reply_markup,omitempty"`
}
func (api *Api) SendVideo(params SendVideoP) (Message, error) {
req := NewRequest[Message]("sendVideo", params)
return req.Do(api)
}
type SendAnimationP struct {
BusinessConnectionID string `json:"business_connection_id,omitempty"`
ChatID int `json:"chat_id"`
MessageThreadID int `json:"message_thread_id,omitempty"`
DirectMessagesTopicID int `json:"direct_messages_topic_id,omitempty"`
Animation string `json:"animation"`
Duration int `json:"duration,omitempty"`
Width int `json:"width,omitempty"`
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"`
SuggestedPostParameters *SuggestedPostParameters `json:"suggested_post_parameters,omitempty"`
ReplyParameters *ReplyParameters `json:"reply_parameters,omitempty"`
ReplyMarkup *ReplyMarkup `json:"reply_markup,omitempty"`
}
func (api *Api) SendAnimation(p SendAnimationP) (Message, error) {
req := NewRequest[Message]("sendAnimation", p)
return req.Do(api)
}
type SendVoiceP struct {
BusinessConnectionID string `json:"business_connection_id,omitempty"`
ChatID int `json:"chat_id"`
MessageThreadID int `json:"message_thread_id,omitempty"`
DirectMessagesTopicID int `json:"direct_messages_topic_id,omitempty"`
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"`
SuggestedPostParameters *SuggestedPostParameters `json:"suggested_post_parameters,omitempty"`
ReplyParameters *ReplyParameters `json:"reply_parameters,omitempty"`
ReplyMarkup *ReplyMarkup `json:"reply_markup,omitempty"`
}
func (api *Api) SendVoice(params *SendVoiceP) (Message, error) {
req := NewRequest[Message]("sendVoice", params)
return req.Do(api)
}
type SendVideoNoteP struct {
BusinessConnectionID string `json:"business_connection_id,omitempty"`
ChatID int `json:"chat_id"`
MessageThreadID int `json:"message_thread_id,omitempty"`
DirectMessagesTopicID int `json:"direct_messages_topic_id,omitempty"`
VideoNote string `json:"video_note"`
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"`
SuggestedPostParameters *SuggestedPostParameters `json:"suggested_post_parameters,omitempty"`
ReplyParameters *ReplyParameters `json:"reply_parameters,omitempty"`
ReplyMarkup *ReplyMarkup `json:"reply_markup,omitempty"`
}
func (api *Api) SendVideoNote(params SendVideoNoteP) (Message, error) {
req := NewRequest[Message]("sendVideoNote", params)
return req.Do(api)
}
type SendPaidMediaP[T InputPaidMedia] struct {
BusinessConnectionID string `json:"business_connection_id,omitempty"`
ChatID int `json:"chat_id"`
MessageThreadID int `json:"message_thread_id,omitempty"`
DirectMessagesTopicID int `json:"direct_messages_topic_id,omitempty"`
StarCount int `json:"star_count,omitempty"`
Media []T `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"`
SuggestedPostParameters *SuggestedPostParameters `json:"suggested_post_parameters,omitempty"`
ReplyParameters *ReplyParameters `json:"reply_parameters,omitempty"`
ReplyMarkup *ReplyMarkup `json:"reply_markup,omitempty"`
}
func (api *Api) SendPaidMediaPhoto(params SendPaidMediaP[InputPaidMediaPhoto]) (Message, error) {
req := NewRequest[Message]("sendPaidMedia", params)
return req.Do(api)
}
func (api *Api) SendPaidMediaVideo(params SendPaidMediaP[InputPaidMediaVideo]) (Message, error) {
req := NewRequest[Message]("sendPaidMedia", params)
return req.Do(api)
}
type SendMediaGroupP[T InputMedia] struct {
BusinessConnectionID string `json:"business_connection_id,omitempty"`
ChatID int `json:"chat_id"`
MessageThreadID int `json:"message_thread_id,omitempty"`
DirectMessagesTopicID int `json:"direct_messages_topic_id,omitempty"`
Media []T `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"`
}
func (api *Api) SendMediaGroupAudio(p SendMediaGroupP[InputMediaAudio]) (Message, error) {
req := NewRequest[Message]("sendMediaGroupAudio", p)
return req.Do(api)
}
func (api *Api) SendMediaGroupDocument(p SendMediaGroupP[InputMediaDocument]) (Message, error) {
req := NewRequest[Message]("sendMediaGroupDocument", p)
return req.Do(api)
}
func (api *Api) SendMediaGroupPhoto(p SendMediaGroupP[InputMediaPhoto]) (Message, error) {
req := NewRequest[Message]("sendMediaGroupPhoto", p)
return req.Do(api)
}
func (api *Api) SendMediaGroupVideo(p SendMediaGroupP[InputMediaVideo]) (Message, error) {
req := NewRequest[Message]("sendMediaGroupVideo", p)
return req.Do(api)
}

109
tgapi/attachments_types.go Normal file
View File

@@ -0,0 +1,109 @@
package tgapi
type InputMedia interface {
InputMediaPhoto | InputMediaVideo | InputMediaAudio | InputMediaDocument
}
type InputMediaType string
const (
InputMediaTypeAnimation InputMediaType = "animation"
InputMediaTypeDocument InputMediaType = "document"
InputMediaTypePhoto InputMediaType = "photo"
InputMediaTypeVideo InputMediaType = "video"
InputMediaTypeAudio InputMediaType = "audio"
)
type InputMediaPhoto struct {
Type InputMediaType `json:"type"`
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"`
HasSpoiler bool `json:"has_spoiler,omitempty"`
}
type InputMediaVideo struct {
Type InputMediaType `json:"type"`
Media string `json:"media"`
Cover string `json:"cover"`
StartTimestamp int `json:"start_timestamp"`
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"`
Width int `json:"width,omitempty"`
Height int `json:"height,omitempty"`
Duration int `json:"duration,omitempty"`
SupportsStreaming bool `json:"supports_streaming,omitempty"`
HasSpoiler bool `json:"has_spoiler,omitempty"`
}
type InputMediaAnimation struct {
Type InputMediaType `json:"type"`
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"`
Width int `json:"width,omitempty"`
Height int `json:"height,omitempty"`
Duration int `json:"duration,omitempty"`
HasSpoiler bool `json:"has_spoiler,omitempty"`
}
type InputMediaAudio struct {
Type InputMediaType `json:"type"`
Media string `json:"media"`
Caption string `json:"caption,omitempty"`
ParseMode ParseMode `json:"parse_mode,omitempty"`
CaptionEntities []MessageEntity `json:"caption_entities,omitempty"`
Duration int `json:"duration,omitempty"`
Performer string `json:"performer,omitempty"`
Title string `json:"title,omitempty"`
}
type InputMediaDocument struct {
Type InputMediaType `json:"type"`
Media string `json:"media"`
Caption string `json:"caption,omitempty"`
ParseMode ParseMode `json:"parse_mode,omitempty"`
CaptionEntities []MessageEntity `json:"caption_entities,omitempty"`
}
type InputPaidMediaType string
const (
InputPaidMediaTypeVideo InputPaidMediaType = "video"
InputPaidMediaTypePhoto InputPaidMediaType = "photo"
)
type InputPaidMedia interface {
InputPaidMediaVideo | InputPaidMediaPhoto
}
type InputPaidMediaPhoto struct {
Type InputPaidMediaType `json:"type"`
Media string `json:"media"`
}
type InputPaidMediaVideo struct {
Type InputPaidMediaType `json:"type"`
Media string `json:"media"`
Cover string `json:"cover"`
StartTimestamp int64 `json:"start_timestamp"`
Width int `json:"width"`
Height int `json:"height"`
Duration int `json:"duration"`
SupportsStreaming bool `json:"supports_streaming"`
}
type PhotoSize struct {
FileID string `json:"file_id"`
FileUniqueID string `json:"file_unique_id"`
Width int `json:"width"`
Height int `json:"height"`
FileSize int `json:"file_size,omitempty"`
}

186
tgapi/bot_methods.go Normal file
View File

@@ -0,0 +1,186 @@
package tgapi
type SetMyCommandsP struct {
Commands []BotCommand `json:"commands"`
Scope *BaseBotCommandScope `json:"scope,omitempty"`
Language string `json:"language_code,omitempty"`
}
func (api *Api) SetMyCommands(p SetMyCommandsP) (bool, error) {
req := NewRequest[bool]("setMyCommands", p)
return req.Do(api)
}
type DeleteMyCommandsP struct {
Scope *BaseBotCommandScope `json:"scope,omitempty"`
Language string `json:"language_code,omitempty"`
}
func (api *Api) DeleteMyCommands(p DeleteMyCommandsP) (bool, error) {
req := NewRequest[bool]("deleteMyCommands", p)
return req.Do(api)
}
type GetMyCommands struct {
Scope *BaseBotCommandScope `json:"scope,omitempty"`
Language string `json:"language_code,omitempty"`
}
func (api *Api) GetMyCommands(p GetMyCommands) ([]BotCommand, error) {
req := NewRequest[[]BotCommand]("getMyCommands", p)
return req.Do(api)
}
type SetMyName struct {
Name string `json:"name"`
Language string `json:"language_code,omitempty"`
}
func (api *Api) SetMyName(p SetMyName) (bool, error) {
req := NewRequest[bool]("setMyName", p)
return req.Do(api)
}
type GetMyName struct {
Language string `json:"language_code,omitempty"`
}
func (api *Api) GetMyName(p GetMyName) (BotName, error) {
req := NewRequest[BotName]("getMyName", p)
return req.Do(api)
}
type SetMyDescription struct {
Description string `json:"description"`
Language string `json:"language_code,omitempty"`
}
func (api *Api) SetMyDescription(p SetMyDescription) (bool, error) {
req := NewRequest[bool]("setMyDescription", p)
return req.Do(api)
}
type GetMyDescription struct {
Language string `json:"language_code,omitempty"`
}
func (api *Api) GetMyDescription(p GetMyDescription) (BotDescription, error) {
req := NewRequest[BotDescription]("getMyDescription", p)
return req.Do(api)
}
type SetMyShortDescription struct {
ShortDescription string `json:"short_description,omitempty"`
Language string `json:"language_code,omitempty"`
}
func (api *Api) SetMyShortDescription(p SetMyShortDescription) (bool, error) {
req := NewRequest[bool]("setMyShortDescription", p)
return req.Do(api)
}
type GetMyShortDescription struct {
Language string `json:"language_code,omitempty"`
}
func (api *Api) GetMyShortDescription(p GetMyShortDescription) (BotShortDescription, error) {
req := NewRequest[BotShortDescription]("getMyShortDescription", p)
return req.Do(api)
}
type SetMyProfilePhotoP[T InputProfilePhoto] struct {
Photo T `json:"photo"`
}
func (api *Api) SetMyProfilePhotoStatic(p SetMyProfilePhotoP[InputProfilePhotoStatic]) (bool, error) {
req := NewRequest[bool]("setMyProfilePhoto", p)
return req.Do(api)
}
func (api *Api) SetMyProfilePhotoAnimated(p SetMyProfilePhotoP[InputProfilePhotoAnimated]) (bool, error) {
req := NewRequest[bool]("setMyProfilePhoto", p)
return req.Do(api)
}
func (api *Api) RemoveMyProfilePhoto() (bool, error) {
req := NewRequest[bool]("removeMyProfilePhoto", NoParams)
return req.Do(api)
}
type SetChatMenuButtonP[T MenuButton] struct {
ChatID int `json:"chat_id"`
MenuButton T `json:"menu_button"`
}
func (api *Api) SetChatMenuButtonCommands(p SetChatMenuButtonP[MenuButtonCommands]) (bool, error) {
req := NewRequest[bool]("setChatMenuButton", p)
return req.Do(api)
}
func (api *Api) SetChatMenuButtonWebApp(p SetChatMenuButtonP[MenuButtonWebApp]) (bool, error) {
req := NewRequest[bool]("setChatMenuButton", p)
return req.Do(api)
}
func (api *Api) SetChatMenuButtonDefault(p SetChatMenuButtonP[MenuButtonDefault]) (bool, error) {
req := NewRequest[bool]("setChatMenuButton", p)
return req.Do(api)
}
type GetChatMenuButtonP struct {
ChatID int `json:"chat_id"`
}
func (api *Api) GetChatMenuButton(p GetChatMenuButtonP) (BaseMenuButton, error) {
req := NewRequest[BaseMenuButton]("getChatMenuButton", p)
return req.Do(api)
}
type SetMyDefaultAdministratorRightsP struct {
Rights *ChatAdministratorRights `json:"rights"`
ForChannels bool `json:"for_channels"`
}
func (api *Api) SetMyDefaultAdministratorRights(p SetMyDefaultAdministratorRightsP) (bool, error) {
req := NewRequest[bool]("setMyDefaultAdministratorRights", p)
return req.Do(api)
}
type GetMyDefaultAdministratorRightsP struct {
ForChannels bool `json:"for_channels"`
}
func (api *Api) GetMyDefaultAdministratorRights(p GetMyDefaultAdministratorRightsP) (ChatAdministratorRights, error) {
req := NewRequest[ChatAdministratorRights]("getMyDefaultAdministratorRights", p)
return req.Do(api)
}
func (api *Api) GetAvailableGifts() (Gifts, error) {
req := NewRequest[Gifts]("getAvailableGifts", NoParams)
return req.Do(api)
}
type SendGiftP struct {
UserID int `json:"user_id,omitempty"`
ChatID int `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"`
}
func (api *Api) SendGift(p SendGiftP) (bool, error) {
req := NewRequest[bool]("sendGift", p)
return req.Do(api)
}
type GiftPremiumSubscriptionP struct {
UserID int `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"`
}
func (api *Api) GiftPremiumSubscription(p GiftPremiumSubscriptionP) (bool, error) {
req := NewRequest[bool]("giftPremiumSubscription", p)
return req.Do(api)
}

99
tgapi/bot_types.go Normal file
View File

@@ -0,0 +1,99 @@
package tgapi
type BotCommand struct {
Command string `json:"command"`
Description string `json:"description"`
}
type BotCommandScopeType string
const (
BotCommandScopeDefaultType BotCommandScopeType = "default"
BotCommandScopePrivateType BotCommandScopeType = "all_private_chats"
BotCommandScopeGroupType BotCommandScopeType = "all_groups_chats"
BotCommandScopeAllChatAdministratorsType BotCommandScopeType = "all_chat_administrators"
BotCommandScopeChatType BotCommandScopeType = "chat"
BotCommandScopeChatAdministratorsType BotCommandScopeType = "chat_administrators"
BotCommandScopeChatMemberType BotCommandScopeType = "chat_member"
)
type BaseBotCommandScope struct {
Type BotCommandScopeType `json:"type"`
}
type BotCommandScopeDefault struct {
BaseBotCommandScope
}
type BotCommandScopePrivateChats struct {
BaseBotCommandScope
}
type BotCommandScopeAllGroupChats struct {
BaseBotCommandScope
}
type BotCommandScopeAllChatAdministrators struct {
BaseBotCommandScope
}
type BotCommandScopeChat struct {
BaseBotCommandScope
ChatID int `json:"chat_id"`
}
type BotCommandScopeChatAdministrators struct {
BaseBotCommandScope
ChatID int `json:"chat_id"`
}
type BotCommandScopeChatMember struct {
BaseBotCommandScope
ChatID int `json:"chat_id"`
UserID int `json:"user_id"`
}
type BotName struct {
Name string `json:"name"`
}
type BotDescription struct {
Description string `json:"description"`
}
type BotShortDescription struct {
ShortDescription string `json:"short_description"`
}
const (
InputProfilePhotoStaticType InputProfilePhotoType = "static"
InputProfilePhotoAnimatedType InputProfilePhotoType = "animated"
)
type InputProfilePhotoType string
type InputProfilePhoto interface {
InputProfilePhotoStatic | InputProfilePhotoAnimated
}
type BaseInputProfilePhoto struct {
Type InputProfilePhotoType `json:"type"`
}
type InputProfilePhotoStatic struct {
BaseInputProfilePhoto
Photo string `json:"photo"`
}
type InputProfilePhotoAnimated struct {
BaseInputProfilePhoto
Animation string `json:"animation"`
MainFrameTimestamp float64 `json:"main_frame_timestamp"`
}
const (
MenuButtonCommandsType MenuButtonType = "commands"
MenuButtonWebAppType MenuButtonType = "web_app"
MenuButtonDefaultType MenuButtonType = "default"
)
type MenuButtonType string
type MenuButton interface {
MenuButtonCommands | MenuButtonDefault | MenuButtonWebApp
}
type BaseMenuButton struct {
Type MenuButtonType `json:"type"`
}
type MenuButtonCommands struct{ BaseMenuButton }
type MenuButtonDefault struct{ BaseMenuButton }
type MenuButtonWebApp struct {
BaseMenuButton
Text string `json:"text"`
WebApp WebAppInfo `json:"web_app"`
}

149
tgapi/business_methods.go Normal file
View File

@@ -0,0 +1,149 @@
package tgapi
type VerifyUserP struct {
UserID int `json:"user_id"`
CustomDescription string `json:"custom_description,omitempty"`
}
func (api *Api) VerifyUser(p VerifyUserP) (bool, error) {
req := NewRequest[bool]("verifyUser", p)
return req.Do(api)
}
type VerifyChatP struct {
ChatID int `json:"chat_id"`
CustomDescription string `json:"custom_description,omitempty"`
}
func (api *Api) VerifyChat(p VerifyChatP) (bool, error) {
req := NewRequest[bool]("verifyChat", p)
return req.Do(api)
}
type RemoveUserVerificationP struct {
UserID int `json:"user_id"`
}
func (api *Api) RemoveUserVerification(p RemoveUserVerificationP) (bool, error) {
req := NewRequest[bool]("removeUserVerification", p)
return req.Do(api)
}
type RemoveChatVerificationP struct {
ChatID int `json:"chat_id"`
}
func (api *Api) RemoveChatVerification(p RemoveChatVerificationP) (bool, error) {
req := NewRequest[bool]("removeChatVerification", p)
return req.Do(api)
}
type ReadBusinessMessageP struct {
BusinessConnectionID string `json:"business_connection_id"`
ChatID int `json:"chat_id"`
MessageID int `json:"message_id"`
}
func (api *Api) ReadBusinessMessage(p ReadBusinessMessageP) (bool, error) {
req := NewRequest[bool]("readBusinessMessage", p)
return req.Do(api)
}
type DeleteBusinessMessageP struct {
BusinessConnectionID string `json:"business_connection_id"`
MessageIDs []int `json:"message_ids"`
}
func (api *Api) DeleteBusinessMessage(p DeleteBusinessMessageP) (bool, error) {
req := NewRequest[bool]("deleteBusinessMessage", p)
return req.Do(api)
}
type SetBusinessAccountNameP struct {
BusinessConnectionID string `json:"business_connection_id"`
FirstName string `json:"first_name"`
LastName string `json:"last_name,omitempty"`
}
func (api *Api) SetBusinessAccountName(p SetBusinessAccountNameP) (bool, error) {
req := NewRequest[bool]("setBusinessAccountName", p)
return req.Do(api)
}
type SetBusinessAccountUsernameP struct {
BusinessConnectionID string `json:"business_connection_id"`
Username string `json:"username,omitempty"`
}
func (api *Api) SetBusinessAccountUsername(p SetBusinessAccountUsernameP) (bool, error) {
req := NewRequest[bool]("setBusinessAccountUsername", p)
return req.Do(api)
}
type SetBusinessAccountBioP struct {
BusinessConnectionID string `json:"business_connection_id"`
Bio string `json:"bio,omitempty"`
}
func (api *Api) SetBusinessAccountBio(p SetBusinessAccountBioP) (bool, error) {
req := NewRequest[bool]("setBusinessAccountBio", p)
return req.Do(api)
}
type SetBusinessAccountProfilePhoto[T InputProfilePhoto] struct {
BusinessConnectionID string `json:"business_connection_id"`
Photo T `json:"photo,omitempty"`
IsPublic bool `json:"is_public,omitempty"`
}
func (api *Api) SetBusinessAccountProfilePhotoStatic(p SetMyProfilePhotoP[InputProfilePhotoStatic]) (bool, error) {
req := NewRequest[bool]("setBusinessAccountProfilePhoto", p)
return req.Do(api)
}
func (api *Api) SetBusinessAccountProfilePhotoAnimated(p SetMyProfilePhotoP[InputProfilePhotoAnimated]) (bool, error) {
req := NewRequest[bool]("setBusinessAccountProfilePhoto", p)
return req.Do(api)
}
type RemoveBusinessAccountProfilePhotoP struct {
BusinessConnectionID string `json:"business_connection_id"`
IsPublic bool `json:"is_public,omitempty"`
}
func (api *Api) RemoveBusinessAccountProfilePhoto(p RemoveBusinessAccountProfilePhotoP) (bool, error) {
req := NewRequest[bool]("removeBusinessAccountProfilePhoto", p)
return req.Do(api)
}
type SetBusinessAccountGiftSettingsP struct {
BusinessConnectionID string `json:"business_connection_id"`
ShowGiftButton bool `json:"show_gift_button"`
AcceptedGiftTypes AcceptedGiftTypes `json:"accepted_gift_types"`
}
func (api *Api) SetBusinessAccountGiftSettings(p SetBusinessAccountGiftSettingsP) (bool, error) {
req := NewRequest[bool]("setBusinessAccountGiftSettings", p)
return req.Do(api)
}
type GetBusinessAccountStarBalanceP struct {
BusinessConnectionID string `json:"business_connection_id"`
}
func (api *Api) GetBusinessAccountStarBalance(p GetBusinessAccountStarBalanceP) (StarAmount, error) {
req := NewRequest[StarAmount]("getBusinessAccountGiftSettings", p)
return req.Do(api)
}
type TransferBusinessAccountStartP struct {
BusinessConnectionID string `json:"business_connection_id"`
StarCount int `json:"star_count"`
}
func (api *Api) TransferBusinessAccountStart(p TransferBusinessAccountStartP) (bool, error) {
req := NewRequest[bool]("transferBusinessAccountStart", p)
return req.Do(api)
}
type GetBusinessAccountGiftsP struct {
}

44
tgapi/business_types.go Normal file
View File

@@ -0,0 +1,44 @@
package tgapi
type BusinessIntro struct {
Title string `json:"title,omitempty"`
Message string `json:"message,omitempty"`
Sticker *Sticker `json:"sticker,omitempty"`
}
type BusinessLocation struct {
Address string `json:"address"`
Location *Location `json:"location,omitempty"`
}
type BusinessOpeningHoursInterval struct {
OpeningMinute int `json:"opening_minute"`
ClosingMinute int `json:"closing_minute"`
}
type BusinessOpeningHours struct {
TimeZoneName string `json:"time_zone_name"`
OpeningHours []Birthdate `json:"opening_hours"`
}
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"`
CanTransferAndUpgradeGifts *bool `json:"can_transfer_and_upgrade_gifts,omitempty"`
CanTransferStars *bool `json:"can_transfer_stars,omitempty"`
CanManageStories *bool `json:"can_manage_stories,omitempty"`
}
type BusinessConnection struct {
ID string `json:"id"`
User User `json:"user"`
UserChatID int `json:"user_chat_id"`
Date int `json:"date"`
Rights *BusinessBotRights `json:"rights,omitempty"`
IsEnabled bool `json:"id_enabled"`
}

337
tgapi/chat_methods.go Normal file
View File

@@ -0,0 +1,337 @@
package tgapi
type BanChatMemberP struct {
ChatID int `json:"chat_id"`
UserID int `json:"user_id"`
UntilDate int64 `json:"until_date,omitempty"`
RevokeMessages bool `json:"revoke_messages,omitempty"`
}
func (api *Api) BanChatMember(p BanChatMemberP) (bool, error) {
req := NewRequest[bool]("banChatMember", p)
return req.Do(api)
}
type UnbanChatMemberP struct {
ChatID int `json:"chat_id"`
UserID int `json:"user_id"`
OnlyIfBanned bool `json:"only_if_banned"`
}
func (api *Api) UnbanChatMember(p UnbanChatMemberP) (bool, error) {
req := NewRequest[bool]("unbanChatMember", p)
return req.Do(api)
}
type RestrictChatMemberP struct {
ChatID int `json:"chat_id"`
UserID int `json:"user_id"`
Permissions ChatPermissions `json:"permissions"`
UseIndependentChatPermissions bool `json:"use_independent_chat_permissions,omitempty"`
UntilDate int `json:"until_date,omitempty"`
}
func (api *Api) RestrictChatMember(p RestrictChatMemberP) (bool, error) {
req := NewRequest[bool]("restrictChatMember", p)
return req.Do(api)
}
type PromoteChatMember struct {
ChatID int `json:"chat_id"`
UserID int `json:"user_id"`
IsAnonymous bool `json:"is_anonymous,omitempty"`
CanManageChat bool `json:"can_manage_chat,omitempty"`
CanDeleteMessages bool `json:"can_delete_messages,omitempty"`
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"`
CanEditStories bool `json:"can_edit_stories,omitempty"`
CanDeleteStories bool `json:"can_delete_stories,omitempty"`
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"`
CanManageDirectMessages bool `json:"can_manage_direct_messages,omitempty"`
}
func (api *Api) PromoteChatMember(p PromoteChatMember) (bool, error) {
req := NewRequest[bool]("promoteChatMember", p)
return req.Do(api)
}
type SetChatAdministratorCustomTitleP struct {
ChatID int `json:"chat_id"`
UserID int `json:"user_id"`
CustomTitle string `json:"custom_title"`
}
func (api *Api) SetChatAdministratorCustomTitle(p SetChatAdministratorCustomTitleP) (bool, error) {
req := NewRequest[bool]("setChatAdministratorCustomTitle", p)
return req.Do(api)
}
type BanChatSenderChatP struct {
ChatID int `json:"chat_id"`
SenderChatID int `json:"sender_chat_id"`
}
func (api *Api) BanChatSenderChat(p BanChatSenderChatP) (bool, error) {
req := NewRequest[bool]("banChatSenderChat", p)
return req.Do(api)
}
type UnbanChatSenderChatP struct {
ChatID int `json:"chat_id"`
SenderChatID int `json:"sender_chat_id"`
}
func (api *Api) UnbanChatSenderChat(p BanChatSenderChatP) (bool, error) {
req := NewRequest[bool]("unbanChatSenderChat", p)
return req.Do(api)
}
type SetChatPermissionsP struct {
ChatID int `json:"chat_id"`
Permissions ChatPermissions `json:"permissions"`
UseIndependentChatPermissions bool `json:"use_independent_chat_permissions,omitempty"`
}
func (api *Api) SetChatPermissions(p SetChatPermissionsP) (bool, error) {
req := NewRequest[bool]("setChatPermissions", p)
return req.Do(api)
}
type ExportChatInviteLinkP struct {
ChatID int `json:"chat_id"`
}
func (api *Api) ExportChatInviteLink(p ExportChatInviteLinkP) (string, error) {
req := NewRequest[string]("exportChatInviteLink", p)
return req.Do(api)
}
type CreateChatInviteLinkP struct {
ChatID int `json:"chat_id"`
Name string `json:"name,omitempty"`
ExpireDate int `json:"expire_date,omitempty"`
MemberLimit int `json:"member_limit,omitempty"`
CreatesJoinRequest int `json:"creates_join_request,omitempty"`
}
func (api *Api) CreateChatInviteLink(p CreateChatInviteLinkP) (ChatInviteLink, error) {
req := NewRequest[ChatInviteLink]("createChatInviteLink", p)
return req.Do(api)
}
type EditChatInviteLinkP struct {
ChatID int `json:"chat_id"`
InviteLink string `json:"invite_link"`
Name string `json:"name,omitempty"`
ExpireDate int `json:"expire_date,omitempty"`
MemberLimit int `json:"member_limit,omitempty"`
CreatesJoinRequest int `json:"creates_join_request,omitempty"`
}
func (api *Api) EditChatInviteLink(p EditChatInviteLinkP) (ChatInviteLink, error) {
req := NewRequest[ChatInviteLink]("editChatInviteLink", p)
return req.Do(api)
}
type CreateChatSubscriptionInviteLinkP struct {
ChatID int `json:"chat_id"`
Name string `json:"name,omitempty"`
SubscriptionPeriod int `json:"subscription_period,omitempty"`
SubscriptionPrice int `json:"subscription_price,omitempty"`
}
func (api *Api) CreateChatSubscriptionInviteLink(p CreateChatSubscriptionInviteLinkP) (ChatInviteLink, error) {
req := NewRequest[ChatInviteLink]("createChatSubscriptionInviteLink", p)
return req.Do(api)
}
type EditChatSubscriptionInviteLinkP struct {
ChatID int `json:"chat_id"`
InviteLink string `json:"invite_link"`
Name string `json:"name,omitempty"`
}
func (api *Api) EditChatSubscriptionInviteLink(p EditChatSubscriptionInviteLinkP) (ChatInviteLink, error) {
req := NewRequest[ChatInviteLink]("editChatSubscriptionInviteLink", p)
return req.Do(api)
}
type RevokeChatInviteLinkP struct {
ChatID int `json:"chat_id"`
InviteLink string `json:"invite_link"`
}
func (api *Api) RevokeChatInviteLink(p RevokeChatInviteLinkP) (ChatInviteLink, error) {
req := NewRequest[ChatInviteLink]("revokeChatInviteLink", p)
return req.Do(api)
}
type ApproveChatJoinRequestP struct {
ChatID int `json:"chat_id"`
UserID int `json:"user_id"`
}
func (api *Api) ApproveChatJoinRequest(p ApproveChatJoinRequestP) (bool, error) {
req := NewRequest[bool]("approveChatJoinRequest", p)
return req.Do(api)
}
type DeclineChatJoinRequestP struct {
ChatID int `json:"chat_id"`
UserID int `json:"user_id"`
}
func (api *Api) DeclineChatJoinRequest(p DeclineChatJoinRequestP) (bool, error) {
req := NewRequest[bool]("declineChatJoinRequest", p)
return req.Do(api)
}
func (api *Api) SetChatPhoto() {
uploader := NewUploader(api)
defer uploader.Close()
}
type DeleteChatPhotoP struct {
ChatID int `json:"chat_id"`
}
func (api *Api) DeleteChatPhoto(p DeleteChatPhotoP) (bool, error) {
req := NewRequest[bool]("deleteChatPhoto", p)
return req.Do(api)
}
type SetChatTitleP struct {
ChatID int `json:"chat_id"`
Title string `json:"title"`
}
func (api *Api) SetChatTitle(p SetChatTitleP) (bool, error) {
req := NewRequest[bool]("setChatTitle", p)
return req.Do(api)
}
type SetChatDescriptionP struct {
ChatID int `json:"chat_id"`
Description string `json:"description"`
}
func (api *Api) SetChatDescription(p SetChatDescriptionP) (bool, error) {
req := NewRequest[bool]("setChatDescription", p)
return req.Do(api)
}
type PinChatMessageP struct {
BusinessConnectionID string `json:"business_connection_id,omitempty"`
ChatID int `json:"chat_id"`
MessageID int `json:"message_id"`
DisableNotification bool `json:"disable_notification,omitempty"`
}
func (api *Api) PinChatMessage(p PinChatMessageP) (bool, error) {
req := NewRequest[bool]("pinChatMessage", p)
return req.Do(api)
}
type UnpinChatMessageP struct {
BusinessConnectionID string `json:"business_connection_id,omitempty"`
ChatID int `json:"chat_id"`
MessageID int `json:"message_id"`
}
func (api *Api) UnpinChatMessage(p UnpinChatMessageP) (bool, error) {
req := NewRequest[bool]("unpinChatMessage", p)
return req.Do(api)
}
type UnpinAllChatMessagesP struct {
ChatID int `json:"chat_id"`
}
func (api *Api) UnpinAllChatMessages(p UnpinAllChatMessagesP) (bool, error) {
req := NewRequest[bool]("unpinAllChatMessages", p)
return req.Do(api)
}
type LeaveChatP struct {
ChatID int `json:"chat_id"`
}
func (api *Api) LeaveChat(p LeaveChatP) (bool, error) {
req := NewRequest[bool]("leaveChatP", p)
return req.Do(api)
}
type GetChatP struct {
ChatID int `json:"chat_id"`
}
func (api *Api) GetChatP(p GetChatP) (ChatFullInfo, error) {
req := NewRequest[ChatFullInfo]("getChatP", p)
return req.Do(api)
}
type GetChatAdministratorsP struct {
ChatID int `json:"chat_id"`
}
func (api *Api) GetChatAdministrators(p GetChatAdministratorsP) ([]BaseChatMember, error) {
req := NewRequest[[]BaseChatMember]("getChatAdministrators", p)
return req.Do(api)
}
type GetChatMembersCountP struct {
ChatID int `json:"chat_id"`
}
func (api *Api) GetChatMemberCount(p GetChatMembersCountP) (int, error) {
req := NewRequest[int]("getChatMemberCount", p)
return req.Do(api)
}
type GetChatMemberP struct {
ChatID int `json:"chat_id"`
UserID int `json:"user_id"`
}
func (api *Api) GetChatMember(p GetChatMemberP) (BaseChatMember, error) {
req := NewRequest[BaseChatMember]("getChatMember", p)
return req.Do(api)
}
type SetChatStickerSetP struct {
ChatID int `json:"chat_id"`
StickerSetName string `json:"sticker_set_name"`
}
func (api *Api) SetChatStickerSet(p SetChatStickerSetP) (bool, error) {
req := NewRequest[bool]("setChatStickerSet", p)
return req.Do(api)
}
type DeleteChatStickerSetP struct {
ChatID int `json:"chat_id"`
}
func (api *Api) DeleteChatStickerSet(p DeleteChatStickerSetP) (bool, error) {
req := NewRequest[bool]("deleteChatStickerSet", p)
return req.Do(api)
}
type GetUserChatBoostsP struct {
ChatID int `json:"chat_id"`
UserID int `json:"user_id"`
}
func (api *Api) GetUserChatBoosts(p GetUserChatBoostsP) (UserChatBoosts, error) {
req := NewRequest[UserChatBoosts]("getUserChatBoosts", p)
return req.Do(api)
}

242
tgapi/chat_types.go Normal file
View File

@@ -0,0 +1,242 @@
package tgapi
type Chat struct {
ID int `json:"id"`
Type string `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"`
IsDirectMessages *bool `json:"is_direct_messages,omitempty"`
}
type ChatType string
const (
ChatTypePrivate ChatType = "private"
ChatTypeGroup ChatType = "group"
ChatTypeSupergroup ChatType = "supergroup"
ChatTypeChannel ChatType = "channel"
)
type ChatFullInfo struct {
ID int `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"`
BusinessIntro *BusinessIntro `json:"business_intro,omitempty"`
BusinessLocation *BusinessLocation `json:"business_location,omitempty"`
BusinessOpeningHours *BusinessOpeningHours `json:"business_opening_hours,omitempty"`
PersonalChat *Chat `json:"personal_chat,omitempty"`
ParentChat *Chat `json:"parent_chat,omitempty"`
AvailableReaction []BaseReaction `json:"available_reaction,omitempty"`
BackgroundCustomEmojiID *string `json:"background_custom_emoji_id,omitempty"`
ProfileAccentColorID *int `json:"profile_accent_color_id,omitempty"`
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"`
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"`
Description *string `json:"description,omitempty"`
InviteLink *string `json:"invite_link,omitempty"`
PinnedMessage *Message `json:"pinned_message,omitempty"`
Permissions *ChatPermissions `json:"permissions,omitempty"`
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 *int `json:"linked_chat_id,omitempty"`
Location *ChatLocation `json:"location,omitempty"`
Rating *UserRating `json:"rating,omitempty"`
FirstProfileAudio *Audio `json:"first_profile_audio,omitempty"`
UniqueGiftColors *UniqueGiftColors `json:"unique_gift_colors,omitempty"`
PaidMessageStarCount *int `json:"paid_message_star_count,omitempty"`
}
type ChatPhoto struct {
SmallFileID string `json:"small_file_id"`
SmallFileUniqueID string `json:"small_file_unique_id"`
BigFileID string `json:"big_file_id"`
BigFileUniqueID string `json:"big_file_unique_id"`
}
type ChatPermissions struct {
CanSendMessages bool `json:"can_send_messages"`
CanSendAudios bool `json:"can_send_audios"`
CanSendDocuments bool `json:"can_send_documents"`
CanSendPhotos bool `json:"can_send_photos"`
CanSendVideoNotes bool `json:"can_send_video_notes"`
CanSendVoiceNotes bool `json:"can_send_voice_notes"`
CanSendPolls bool `json:"can_send_polls"`
CanSendOtherMessages bool `json:"can_send_other_messages"`
CanAddWebPagePreview bool `json:"can_add_web_page_preview"`
CanChangeInfo bool `json:"can_change_info"`
CanInviteUsers bool `json:"can_invite_users"`
CanPinMessages bool `json:"can_pin_messages"`
CanManageTopics bool `json:"can_manage_topics"`
}
type ChatLocation struct {
Location Location `json:"location"`
Address string `json:"address"`
}
type ChatInviteLink struct {
InviteLink string `json:"invite_link"`
Creator User `json:"creator"`
CreateJoinRequest bool `json:"create_join_request"`
IsPrimary bool `json:"is_primary"`
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"`
}
type ChatMemberStatusType string
const (
ChatMemberStatusOwner ChatMemberStatusType = "owner"
ChatMemberStatusAdministrator ChatMemberStatusType = "administrator"
ChatMemberStatusMember ChatMemberStatusType = "member"
ChatMemberStatusRestricted ChatMemberStatusType = "restricted"
ChatMemberStatusLeft ChatMemberStatusType = "left"
ChatMemberStatusBanned ChatMemberStatusType = "kicked"
)
type ChatMember interface {
ChatMemberOwner | ChatMemberAdministrator | ChatMemberMember | ChatMemberRestricted | ChatMemberLeft | ChatMemberBanned
}
type BaseChatMember struct {
Status ChatMemberStatusType `json:"status"`
User User `json:"user"`
}
type ChatMemberOwner struct {
BaseChatMember
IsAnonymous bool `json:"is_anonymous"`
CustomTitle *string `json:"custom_title,omitempty"`
}
type ChatMemberAdministrator struct {
BaseChatMember
CanBeEdited bool `json:"can_be_edited"`
IsAnonymous bool `json:"is_anonymous"`
CanManageChat bool `json:"can_manage_chat"`
CanDeleteMessages bool `json:"can_delete_messages"`
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"`
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"`
CanManageDirectMessages *bool `json:"can_manage_direct_messages,omitempty"`
CustomTitle *string `json:"custom_title,omitempty"`
}
type ChatMemberMember struct {
BaseChatMember
UntilDate *int `json:"until_date,omitempty"`
}
type ChatMemberRestricted struct {
BaseChatMember
IsMember bool `json:"is_member"`
CanSendMessages bool `json:"can_send_messages"`
CanSendAudios bool `json:"can_send_audios"`
CanSendDocuments bool `json:"can_send_documents"`
CanSendVideos bool `json:"can_send_videos"`
CanSendVideoNotes bool `json:"can_send_video_notes"`
CanSendVoiceNotes bool `json:"can_send_voice_notes"`
CanSendPolls bool `json:"can_send_polls"`
CanSendOtherMessages bool `json:"can_send_other_messages"`
CanAddWebPagePreview bool `json:"can_add_web_page_preview"`
CanChangeInfo bool `json:"can_change_info"`
CanInviteUsers bool `json:"can_invite_users"`
CanPinMessages bool `json:"can_pin_messages"`
CanManageTopics bool `json:"can_manage_topics"`
UntilDate int `json:"until_date"`
}
type ChatMemberLeft struct {
BaseChatMember
}
type ChatMemberBanned struct {
BaseChatMember
UntilDate int `json:"until_date"`
}
type BaseChatBoostSource struct {
Source string `json:"source"`
User User `json:"user"`
}
type ChatBoostSourcePremium struct{ BaseChatBoostSource }
type ChatBoostSourceGiftCode struct{ BaseChatBoostSource }
type ChatBoostSourceGiveaway struct {
BaseChatBoostSource
GiveawayMessageID int `json:"giveaway_message_id"`
PrizeStarCount *int `json:"prize_star_count,omitempty"`
IsUnclaimed bool `json:"is_unclaimed"`
}
type ChatBoost[T BaseChatBoostSource] struct {
BoostID int `json:"boost_id"`
AddDate int `json:"add_date"`
ExpirationDate int `json:"expiration_date"`
Source T `json:"source"`
}
type UserChatBoosts struct {
Boosts []ChatBoost[BaseChatBoostSource] `json:"boosts"`
}
type ChatAdministratorRights struct {
IsAnonymous bool `json:"is_anonymous"`
CanManageChat bool `json:"can_manage_chat"`
CanDeleteMessages bool `json:"can_delete_messages"`
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"`
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"`
CanManageDirectMessages *bool `json:"can_manage_direct_messages,omitempty"`
}

86
tgapi/forum_methods.go Normal file
View File

@@ -0,0 +1,86 @@
package tgapi
type BaseForumTopicP struct {
ChatID int `json:"chat_id"`
MessageThreadID int `json:"message_thread_id"`
}
func (api *Api) GetForumTopicIconSet() ([]Sticker, error) {
req := NewRequest[[]Sticker]("getForumTopicIconSet", NoParams)
return req.Do(api)
}
type CreateForumTopicP struct {
ChatID int `json:"chat_id"`
Name string `json:"name"`
IconColor ForumTopicIconColor `json:"icon_color"`
IconCustomEmojiID string `json:"icon_custom_emoji_id"`
}
func (api *Api) CreateForumTopic(p CreateForumTopicP) (ForumTopic, error) {
req := NewRequest[ForumTopic]("createForumTopic", p)
return req.Do(api)
}
type EditForumTopicP struct {
BaseForumTopicP
Name string `json:"name"`
IconCustomEmojiID string `json:"icon_custom_emoji_id"`
}
func (api *Api) EditForumTopic(p EditForumTopicP) (bool, error) {
req := NewRequest[bool]("editForumTopic", p)
return req.Do(api)
}
func (api *Api) CloseForumTopic(p BaseForumTopicP) (bool, error) {
req := NewRequest[bool]("closeForumTopic", p)
return req.Do(api)
}
func (api *Api) ReopenForumTopic(p BaseForumTopicP) (bool, error) {
req := NewRequest[bool]("reopenForumTopic", p)
return req.Do(api)
}
func (api *Api) DeleteForumTopic(p BaseForumTopicP) (bool, error) {
req := NewRequest[bool]("deleteForumTopic", p)
return req.Do(api)
}
func (api *Api) UnpinAllForumTopicMessages(p BaseForumTopicP) (bool, error) {
req := NewRequest[bool]("unpinAllForumTopicMessages", p)
return req.Do(api)
}
type BaseGeneralForumTopicP struct {
ChatID int `json:"chat_id"`
}
type EditGeneralForumTopicP struct {
ChatID int `json:"chat_id"`
Name string `json:"name"`
}
func (api *Api) EditGeneralForumTopic(p EditGeneralForumTopicP) (bool, error) {
req := NewRequest[bool]("editGeneralForumTopic", p)
return req.Do(api)
}
func (api *Api) CloseGeneralForumTopic(p BaseGeneralForumTopicP) (bool, error) {
req := NewRequest[bool]("closeGeneralForumTopic", p)
return req.Do(api)
}
func (api *Api) ReopenGeneralForumTopic(p BaseGeneralForumTopicP) (bool, error) {
req := NewRequest[bool]("reopenGeneralForumTopic", p)
return req.Do(api)
}
func (api *Api) HideGeneralForumTopic(p BaseGeneralForumTopicP) (bool, error) {
req := NewRequest[bool]("hideGeneralForumTopic", p)
return req.Do(api)
}
func (api *Api) UnhideGeneralForumTopic(p BaseGeneralForumTopicP) (bool, error) {
req := NewRequest[bool]("unhideGeneralForumTopic", p)
return req.Do(api)
}
func (api *Api) UnpinAllGeneralForumTopicMessages(p BaseGeneralForumTopicP) (bool, error) {
req := NewRequest[bool]("unpinAllGeneralForumTopicMessages", p)
return req.Do(api)
}

15
tgapi/forum_types.go Normal file
View File

@@ -0,0 +1,15 @@
package tgapi
type ForumTopic struct {
MessageThreadID int `json:"message_thread_id"`
Name string `json:"name"`
IconColor int `json:"icon_color"`
IconCustomEmojiID string `json:"icon_custom_emoji_id,omitempty"`
IsNameImplicit bool `json:"is_name_implicit,omitempty"`
}
type ForumTopicIconColor int
const (
ForumTopicIconColorBlue ForumTopicIconColor = 7322096
)

367
tgapi/messages_methods.go Normal file
View File

@@ -0,0 +1,367 @@
package tgapi
type SendMessageP struct {
BusinessConnectionID string `json:"business_connection_id,omitempty"`
ChatID int `json:"chat_id"`
MessageThreadID int `json:"message_thread_id,omitempty"`
DirectMessagesTopicID int `json:"direct_messages_topic_id,omitempty"`
Text string `json:"text"`
ParseMode ParseMode `json:"parse_mode,omitempty"`
Entities []*MessageEntity `json:"entities,omitempty"`
LinkPreviewOptions *LinkPreviewOptions `json:"link_preview_options,omitempty"`
DisableNotifications bool `json:"disable_notifications,omitempty"`
ProtectContent bool `json:"protect_content,omitempty"`
AllowPaidBroadcast bool `json:"allow_paid_broadcast,omitempty"`
MessageEffectID string `json:"message_effect_id,omitempty"`
SuggestedPostParameters *SuggestedPostParameters `json:"suggested_post_parameters,omitempty"`
ReplyParameters *ReplyParameters `json:"reply_parameters,omitempty"`
ReplyMarkup *ReplyMarkup `json:"reply_markup,omitempty"`
}
func (api *Api) SendMessage(params *SendMessageP) (Message, error) {
req := NewRequest[Message, SendMessageP]("sendMessage", *params)
return req.Do(api)
}
type ForwardMessageP struct {
ChatID int `json:"chat_id"`
MessageThreadID int `json:"message_thread_id,omitempty"`
DirectMessagesTopicID int `json:"direct_messages_topic_id,omitempty"`
MessageID int `json:"message_id,omitempty"`
FromChatID int `json:"from_chat_id,omitempty"`
VideoStartTimestamp int `json:"video_start_timestamp,omitempty"`
DisableNotification bool `json:"disable_notification,omitempty"`
ProtectContent bool `json:"protect_content,omitempty"`
MessageEffectID string `json:"message_effect_id,omitempty"`
SuggestedPostParameters *SuggestedPostParameters `json:"suggested_post_parameters,omitempty"`
}
func (api *Api) ForwardMessage(params ForwardMessageP) (Message, error) {
req := NewRequest[Message]("forwardMessage", params)
return req.Do(api)
}
type ForwardMessagesP struct {
ChatID int `json:"chat_id"`
MessageThreadID int `json:"message_thread_id,omitempty"`
DirectMessagesTopicID int `json:"direct_messages_topic_id,omitempty"`
FromChatID int `json:"from_chat_id,omitempty"`
MessageIDs []int `json:"message_ids,omitempty"`
DisableNotification bool `json:"disable_notification,omitempty"`
ProtectContent bool `json:"protect_content,omitempty"`
}
func (api *Api) ForwardMessages(params ForwardMessagesP) ([]int, error) {
req := NewRequest[[]int]("forwardMessages", params)
return req.Do(api)
}
type CopyMessageP struct {
ChatID int `json:"chat_id"`
MessageThreadID int `json:"message_thread_id,omitempty"`
DirectMessagesTopicID int `json:"direct_messages_topic_id,omitempty"`
FromChatID int `json:"from_chat_id"`
MessageID int `json:"message_id"`
VideoStartTimestamp int `json:"video_start_timestamp,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"`
MessageEffectID string `json:"message_effect_id,omitempty"`
SuggestedPostParameters *SuggestedPostParameters `json:"suggested_post_parameters,omitempty"`
ReplyParameters *ReplyParameters `json:"reply_parameters,omitempty"`
ReplyMarkup *ReplyMarkup `json:"reply_markup,omitempty"`
}
func (api *Api) CopyMessage(params CopyMessageP) (int, error) {
req := NewRequest[int]("copyMessage", params)
return req.Do(api)
}
type CopyMessagesP struct {
ChatID int `json:"chat_id"`
MessageThreadID int `json:"message_thread_id,omitempty"`
DirectMessagesTopicID int `json:"direct_messages_topic_id,omitempty"`
FromChatID int `json:"from_chat_id,omitempty"`
MessageIDs []int `json:"message_ids,omitempty"`
DisableNotification bool `json:"disable_notification,omitempty"`
ProtectContent bool `json:"protect_content,omitempty"`
RemoveCaption bool `json:"remove_caption,omitempty"`
}
func (api *Api) CopyMessages(params CopyMessagesP) ([]int, error) {
req := NewRequest[[]int]("copyMessages", params)
return req.Do(api)
}
type SendLocationP struct {
BusinessConnectionID int `json:"business_connection_id,omitempty"`
ChatID int `json:"chat_id"`
MessageThreadID int `json:"message_thread_id,omitempty"`
DirectMessagesTopicID int `json:"direct_messages_topic_id,omitempty"`
Latitude float64 `json:"latitude"`
Longitude float64 `json:"longitude"`
HorizontalAccuracy float64 `json:"horizontal_accuracy,omitempty"`
LivePeriod int `json:"live_period,omitempty"`
Heading int `json:"heading,omitempty"`
ProximityAlertRadius int `json:"proximity_alert_radius,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"`
SuggestedPostParameters *SuggestedPostParameters `json:"suggested_post_parameters,omitempty"`
ReplyParameters *ReplyParameters `json:"reply_parameters,omitempty"`
ReplyMarkup *ReplyMarkup `json:"reply_markup,omitempty"`
}
func (api *Api) SendLocation(params SendLocationP) (Message, error) {
req := NewRequest[Message]("sendLocation", params)
return req.Do(api)
}
type SendVenueP struct {
BusinessConnectionID int `json:"business_connection_id,omitempty"`
ChatID int `json:"chat_id"`
MessageThreadID int `json:"message_thread_id,omitempty"`
DirectMessagesTopicID int `json:"direct_messages_topic_id,omitempty"`
Latitude float64 `json:"latitude"`
Longitude float64 `json:"longitude"`
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"`
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"`
SuggestedPostParameters *SuggestedPostParameters `json:"suggested_post_parameters,omitempty"`
ReplyParameters *ReplyParameters `json:"reply_parameters,omitempty"`
ReplyMarkup *ReplyMarkup `json:"reply_markup,omitempty"`
}
func (api *Api) SendVenue(params SendVenueP) (Message, error) {
req := NewRequest[Message]("sendVenue", params)
return req.Do(api)
}
type SendContactP struct {
BusinessConnectionID int `json:"business_connection_id,omitempty"`
ChatID int `json:"chat_id"`
MessageThreadID int `json:"message_thread_id,omitempty"`
DirectMessagesTopicID int `json:"direct_messages_topic_id,omitempty"`
PhoneNumber string `json:"phone_number"`
FirstName string `json:"first_name"`
LastName string `json:"last_name,omitempty"`
Vcard string `json:"vcard"`
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"`
SuggestedPostParameters *SuggestedPostParameters `json:"suggested_post_parameters,omitempty"`
ReplyParameters *ReplyParameters `json:"reply_parameters,omitempty"`
ReplyMarkup *ReplyMarkup `json:"reply_markup,omitempty"`
}
func (api *Api) SendContact(params SendContactP) (Message, error) {
req := NewRequest[Message]("sendContact", params)
return req.Do(api)
}
type SendPollP struct {
BusinessConnectionID int `json:"business_connection_id,omitempty"`
ChatID int `json:"chat_id"`
MessageThreadID int `json:"message_thread_id,omitempty"`
Question string `json:"question"`
QuestionParseMode ParseMode `json:"question_mode,omitempty"`
QuestionEntities []*MessageEntity `json:"question_entities,omitempty"`
Options []InputPollOption `json:"options"`
IsAnonymous bool `json:"is_anonymous,omitempty"`
Type PollType `json:"type"`
AllowsMultipleAnswers bool `json:"allows_multiple_answers,omitempty"`
CorrectOptionID int `json:"correct_option_id,omitempty"`
Explanation string `json:"explanation,omitempty"`
ExplanationParseMode ParseMode `json:"explanation_parse_mode,omitempty"`
ExplanationEntities []*MessageEntity `json:"explanation_entities,omitempty"`
OpenPeriod int `json:"open_period,omitempty"`
CloseDate int `json:"close_date"`
IsClosed bool `json:"is_closed,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"`
ReplyParameters *ReplyParameters `json:"reply_parameters,omitempty"`
ReplyMarkup *ReplyMarkup `json:"reply_markup,omitempty"`
}
func (api *Api) SendPoll(params SendPollP) (Message, error) {
req := NewRequest[Message]("sendPoll", params)
return req.Do(api)
}
type SendChecklistP struct {
BusinessConnectionID int `json:"business_connection_id"`
ChatID int `json:"chat_id"`
Checklist InputChecklist `json:"checklist"`
DisableNotification bool `json:"disable_notification,omitempty"`
ProtectContent bool `json:"protect_content,omitempty"`
MessageEffectID string `json:"message_effect_id,omitempty"`
ReplyParameters *ReplyParameters `json:"reply_parameters,omitempty"`
ReplyMarkup *ReplyMarkup `json:"reply_markup,omitempty"`
}
func (api *Api) SendChecklist(params SendChecklistP) (Message, error) {
req := NewRequest[Message]("sendChecklist", params)
return req.Do(api)
}
type SendDiceP struct {
BusinessConnectionID int `json:"business_connection_id,omitempty"`
ChatID int `json:"chat_id"`
MessageThreadID int `json:"message_thread_id,omitempty"`
DirectMessagesTopicID int `json:"direct_messages_topic_id,omitempty"`
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"`
SuggestedPostParameters *SuggestedPostParameters `json:"suggested_post_parameters,omitempty"`
ReplyParameters *ReplyParameters `json:"reply_parameters,omitempty"`
ReplyMarkup *ReplyMarkup `json:"reply_markup,omitempty"`
}
func (api *Api) SendDice(params SendDiceP) (Message, error) {
req := NewRequest[Message]("sendDice", params)
return req.Do(api)
}
type SendMessageDraftP struct {
ChatID int `json:"chat_id"`
MessageThreadID int `json:"message_thread_id,omitempty"`
DraftID int `json:"draft_id"`
Text string `json:"text"`
ParseMode ParseMode `json:"parse_mode,omitempty"`
Entities []*MessageEntity `json:"entities,omitempty"`
}
func (api *Api) SendMessageDraft(params SendMessageDraftP) (bool, error) {
req := NewRequest[bool]("sendMessageDraft", params)
return req.Do(api)
}
type SendChatActionP struct {
BusinessConnectionID string `json:"business_connection_id,omitempty"`
ChatID int `json:"chat_id"`
MessageThreadID int `json:"message_thread_id,omitempty"`
Action ChatActionType `json:"action"`
}
func (api *Api) SendChatAction(params SendChatActionP) (bool, error) {
req := NewRequest[bool]("sendChatAction", params)
return req.Do(api)
}
type SetMessageReactionP[T ReactionType] struct {
ChatId int `json:"chat_id"`
MessageId int `json:"message_id"`
Reaction []T `json:"reaction"`
IsBig bool `json:"is_big,omitempty"`
}
func (api *Api) SetMessageReactionEmoji(params SetMessageReactionP[ReactionTypeEmoji]) (bool, error) {
req := NewRequest[bool]("setMessageReaction", params)
return req.Do(api)
}
func (api *Api) SetMessageReactionCustom(params SetMessageReactionP[ReactionTypeCustomEmoji]) (bool, error) {
req := NewRequest[bool]("setMessageReaction", params)
return req.Do(api)
}
func (api *Api) SetMessageReactionPaid(params SetMessageReactionP[ReactionTypePaid]) (bool, error) {
req := NewRequest[bool]("setMessageReaction", params)
return req.Do(api)
}
// Message update methods
type EditMessageTextP struct {
BusinessConnectionID string `json:"business_connection_id,omitempty"`
ChatID int `json:"chat_id,omitempty"`
MessageID int `json:"message_id,omitempty"`
InlineMessageID string `json:"inline_message_id,omitempty"`
Text string `json:"text"`
ParseMode ParseMode `json:"parse_mode,omitempty"`
ReplyMarkup *ReplyMarkup `json:"reply_markup,omitempty"`
}
func (api *Api) EditMessageText(params *EditMessageTextP) (Message, error) {
req := NewRequest[Message]("editMessageText", params)
return req.Do(api)
}
type EditMessageCaptionP struct {
BusinessConnectionID string `json:"business_connection_id,omitempty"`
ChatID int `json:"chat_id,omitempty"`
MessageID int `json:"message_id,omitempty"`
InlineMessageID string `json:"inline_message_id,omitempty"`
Caption string `json:"caption"`
ParseMode ParseMode `json:"parse_mode,omitempty"`
ReplyMarkup *ReplyMarkup `json:"reply_markup,omitempty"`
}
func (api *Api) EditMessageCaption(params *EditMessageCaptionP) (Message, error) {
req := NewRequest[Message]("editMessageCaption", params)
return req.Do(api)
}
type DeleteMessageP struct {
ChatID int `json:"chat_id"`
MessageID int `json:"message_id"`
}
func (api *Api) DeleteMessage(params *DeleteMessageP) (bool, error) {
req := NewRequest[bool]("deleteMessage", params)
return req.Do(api)
}
type AnswerCallbackQueryP struct {
CallbackQueryID string `json:"callback_query_id"`
Text string `json:"text,omitempty"`
ShowAlert bool `json:"show_alert,omitempty"`
URL string `json:"url,omitempty"`
CacheTime int `json:"cache_time,omitempty"`
}
func (api *Api) AnswerCallbackQuery(params *AnswerCallbackQueryP) (bool, error) {
req := NewRequest[bool]("answerCallbackQuery", params)
return req.Do(api)
}

238
tgapi/messages_types.go Normal file
View File

@@ -0,0 +1,238 @@
package tgapi
type MessageReplyMarkup struct {
InlineKeyboard [][]InlineKeyboardButton `json:"inline_keyboard"`
}
type Message struct {
MessageID int `json:"message_id"`
MessageThreadID int `json:"message_thread_id,omitempty"`
BusinessConnectionId string `json:"business_connection_id,omitempty"`
From *User `json:"from,omitempty"`
SenderChat *Chat `json:"sender_chat,omitempty"`
SenderBoostCount int `json:"sender_boost_count,omitempty"`
SenderBusinessBot *User `json:"sender_business_bot,omitempty"`
Chat *Chat `json:"chat,omitempty"`
IsTopicMessage bool `json:"is_topic_message,omitempty"`
IsAutomaticForward bool `json:"is_automatic_forward,omitempty"`
IsFromOffline bool `json:"is_from_offline,omitempty"`
IsPaidPost bool `json:"is_paid_post,omitempty"`
MediaGroupId string `json:"media_group_id,omitempty"`
AuthorSignature string `json:"author_signature,omitempty"`
PaidStarCount int `json:"paid_star_count,omitempty"`
ReplyToMessage *Message `json:"reply_to_message,omitempty"`
Text string `json:"text"`
Photo []*PhotoSize `json:"photo,omitempty"`
Caption string `json:"caption,omitempty"`
CaptionEntities []MessageEntity `json:"caption_entities,omitempty"`
Date int `json:"date"`
EditDate int `json:"edit_date"`
ReplyMarkup *MessageReplyMarkup `json:"reply_markup,omitempty"`
Entities []MessageEntity `json:"entities,omitempty"`
LinkPreviewOptions *LinkPreviewOptions `json:"link_preview_options,omitempty"`
SuggestedPostInfo *SuggestedPostInfo `json:"suggested_post_info,omitempty"`
EffectID string `json:"effect_id,omitempty"`
}
type InaccessibleMessage struct {
Chat Chat `json:"chat"`
MessageID int `json:"message_id"`
Date int `json:"date"`
}
type MaybeInaccessibleMessage interface{ Message | InaccessibleMessage }
type MessageEntityType string
const (
MessageEntityMention MessageEntityType = "mention"
MessageEntityHashtag MessageEntityType = "hashtag"
MessageEntityCashtag MessageEntityType = "cashtag"
MessageEntityBotCommand MessageEntityType = "bot_command"
MessageEntityUrl MessageEntityType = "url"
MessageEntityEmail MessageEntityType = "email"
MessageEntityPhoneNumber MessageEntityType = "phone_number"
MessageEntityBold MessageEntityType = "bold"
MessageEntityItalic MessageEntityType = "italic"
MessageEntityUnderline MessageEntityType = "underline"
MessageEntityStrike MessageEntityType = "strikethrough"
MessageEntitySpoiler MessageEntityType = "spoiler"
MessageEntityBlockquote MessageEntityType = "blockquote"
MessageEntityExpandableBlockquote MessageEntityType = "expandable_blockquote"
MessageEntityCode MessageEntityType = "code"
MessageEntityPre MessageEntityType = "pre"
MessageEntityTextLink MessageEntityType = "text_link"
MessageEntityTextMention MessageEntityType = "text_mention"
MessageEntityCustomEmoji MessageEntityType = "custom_emoji"
)
type MessageEntity struct {
Type MessageEntityType `json:"type"`
Offset int `json:"offset"`
Length int `json:"length"`
URL string `json:"url,omitempty"`
User *User `json:"user,omitempty"`
Language string `json:"language,omitempty"`
CustomEmojiID string `json:"custom_emoji_id,omitempty"`
}
type ReplyParameters struct {
MessageID int `json:"message_id"`
ChatID int `json:"chat_id,omitempty"`
AllowSendingWithoutReply bool `json:"allow_sending_without_reply,omitempty"`
Quote string `json:"quote,omitempty"`
QuoteParsingMode string `json:"quote_parsing_mode,omitempty"`
QuoteEntities []*MessageEntity `json:"quote_entities,omitempty"`
QuotePosition int `json:"quote_position,omitempty"`
ChecklistTaskID int `json:"checklist_task_id,omitempty"`
}
type LinkPreviewOptions struct {
IsDisabled bool `json:"is_disabled,omitempty"`
URL string `json:"url,omitempty"`
PreferSmallMedia bool `json:"prefer_small_media,omitempty"`
PreferLargeMedia bool `json:"prefer_large_media,omitempty"`
ShowAboveText bool `json:"show_above_text,omitempty"`
}
type ReplyMarkup struct {
InlineKeyboard [][]InlineKeyboardButton `json:"inline_keyboard,omitempty"`
Keyboard [][]int `json:"keyboard,omitempty"`
IsPersistent bool `json:"is_persistent,omitempty"`
ResizeKeyboard bool `json:"resize_keyboard,omitempty"`
OneTimeKeyboard bool `json:"one_time_keyboard,omitempty"`
InputFieldPlaceholder string `json:"input_field_placeholder,omitempty"`
Selective bool `json:"selective,omitempty"`
RemoveKeyboard bool `json:"remove_keyboard,omitempty"`
ForceReply bool `json:"force_reply,omitempty"`
}
type InlineKeyboardMarkup struct {
InlineKeyboard [][]InlineKeyboardButton `json:"inline_keyboard,omitempty"`
}
type KeyboardButtonStyle string
type InlineKeyboardButton struct {
Text string `json:"text"`
URL string `json:"url,omitempty"`
CallbackData string `json:"callback_data,omitempty"`
Style KeyboardButtonStyle `json:"style,omitempty"`
IconCustomEmojiID string `json:"icon_custom_emoji_id,omitempty"`
}
type ReplyKeyboardMarkup struct {
Keyboard [][]int `json:"keyboard"`
}
type CallbackQuery struct {
ID string `json:"id"`
From User `json:"from"`
Message Message `json:"message"`
Data string `json:"data"`
}
type InputPollOption struct {
Text string `json:"text"`
TextParseMode ParseMode `json:"text_parse_mode,omitempty"`
TextEntities []*MessageEntity `json:"text_entities,omitempty"`
}
type PollType string
const (
PollTypeRegular PollType = "regular"
PollTypeQuiz PollType = "quiz"
)
type InputChecklistTask struct {
ID int `json:"id"`
Text string `json:"text"`
ParseMode ParseMode `json:"parse_mode,omitempty"`
TextEntities []*MessageEntity `json:"text_entities,omitempty"`
}
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"`
}
type ChatActionType string
const (
ChatActionTyping ChatActionType = "typing"
ChatActionUploadPhoto ChatActionType = "upload_photo"
ChatActionUploadVideo ChatActionType = "upload_video"
ChatActionUploadVoice ChatActionType = "upload_voice"
ChatActionUploadDocument ChatActionType = "upload_document"
ChatActionChooseSticker ChatActionType = "choose_sticker"
ChatActionFindLocation ChatActionType = "find_location"
ChatActionUploadVideoNone ChatActionType = "upload_video_none"
)
type MessageReactionUpdated struct {
Chat *Chat `json:"chat"`
MessageID int `json:"message_id"`
User *User `json:"user,omitempty"`
ActorChat *Chat `json:"actor_chat"`
Date int `json:"date"`
OldReaction []BaseReaction `json:"old_reaction"`
NewReaction []BaseReaction `json:"new_reaction"`
}
type MessageReactionCountUpdated struct {
Chat *Chat `json:"chat"`
MessageID int `json:"message_id"`
Date int `json:"date"`
Reactions []*ReactionCount `json:"reactions"`
}
type ReactionType interface {
ReactionTypeEmoji | ReactionTypeCustomEmoji | ReactionTypePaid
}
type BaseReaction struct {
Type string `json:"type"`
}
type ReactionTypeEmoji struct {
Type string `json:"type"`
Emoji string `json:"emoji"`
}
type ReactionTypeCustomEmoji struct {
Type string `json:"type"`
CustomEmojiID string `json:"custom_emoji_id"`
}
type ReactionTypePaid struct {
Type string `json:"type"`
}
type ReactionCount struct {
Type BaseReaction `json:"type"`
TotalCount int `json:"total_count"`
}
type SuggestedPostPrice struct {
Currency string `json:"currency"`
Amount int `json:"amount"`
}
type SuggestedPostInfo struct {
State string `json:"state"` //State of the suggested post. Currently, it can be one of “pending”, “approved”, “declined”.
Price SuggestedPostPrice `json:"price"`
SendDate int `json:"send_date"`
}
type SuggestedPostParameters struct {
Price SuggestedPostPrice `json:"price"`
SendDate int `json:"send_date"`
}

41
tgapi/methods.go Normal file
View File

@@ -0,0 +1,41 @@
package tgapi
type ParseMode string
const (
ParseMDV2 ParseMode = "MarkdownV2"
ParseHTML ParseMode = "HTML"
ParseMD ParseMode = "Markdown"
)
type EmptyParams struct{}
var NoParams = EmptyParams{}
type UpdateParams struct {
Offset int `json:"offset"`
Timeout int `json:"timeout"`
AllowedUpdates []string `json:"allowed_updates"`
}
func (api *Api) GetMe() (User, error) {
req := NewRequest[User, EmptyParams]("getMe", NoParams)
return req.Do(api)
}
func (api *Api) LogOut() (bool, error) {
req := NewRequest[bool, EmptyParams]("logOut", NoParams)
return req.Do(api)
}
func (api *Api) Close() (bool, error) {
req := NewRequest[bool, EmptyParams]("close", NoParams)
return req.Do(api)
}
type GetFileP struct {
FileId string `json:"file_id"`
}
func (api *Api) GetFile(params GetFileP) (File, error) {
req := NewRequest[File]("getFile", params)
return req.Do(api)
}

166
tgapi/stickers_methods.go Normal file
View File

@@ -0,0 +1,166 @@
package tgapi
type SendStickerP struct {
BusinessConnectionID string `json:"business_connection_id,omitempty"`
ChatID int `json:"chat_id"`
MessageThreadID int `json:"message_thread_id,omitempty"`
DirectMessagesTopicID int `json:"direct_messages_topic_id,omitempty"`
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"`
}
func (api *Api) SendSticker(p SendStickerP) (Message, error) {
req := NewRequest[Message]("sendSticker", p)
return req.Do(api)
}
type GetStickerSetP struct {
Name string `json:"name"`
}
func (api *Api) GetStickerSet(p GetStickerSetP) (StickerSet, error) {
req := NewRequest[StickerSet]("getStickerSet", p)
return req.Do(api)
}
type GetCustomEmojiStickersP struct {
CustomEmojiIDs []string `json:"custom_emoji_ids"`
}
func (api *Api) GetCustomEmojiStickers(p GetCustomEmojiStickersP) ([]Sticker, error) {
req := NewRequest[[]Sticker]("getCustomEmojiStickers", p)
return req.Do(api)
}
type CreateNewStickerSetP struct {
UserID int `json:"user_id"`
Name string `json:"name"`
Title string `json:"title"`
Stickers []InputSticker `json:"stickers"`
StickerType StickerType `json:"sticker_type,omitempty"`
NeedsRepainting bool `json:"needs_repainting,omitempty"`
}
func (api *Api) CreateNewStickerSet(p CreateNewStickerSetP) (bool, error) {
req := NewRequest[bool]("createNewStickerSet", p)
return req.Do(api)
}
type AddStickerToSetP struct {
UserID int `json:"user_id"`
Name string `json:"name"`
Sticker InputSticker `json:"sticker"`
}
func (api *Api) AddStickerToSet(p AddStickerToSetP) (bool, error) {
req := NewRequest[bool]("addStickerToSet", p)
return req.Do(api)
}
type SetStickerPositionInSetP struct {
Sticker string `json:"sticker"`
Position int `json:"position"`
}
func (api *Api) SetStickerPosition(p SetStickerPositionInSetP) (bool, error) {
req := NewRequest[bool]("setStickerPosition", p)
return req.Do(api)
}
type DeleteStickerFromSetP struct {
Sticker string `json:"sticker"`
}
func (api *Api) DeleteStickerFromSet(p DeleteStickerFromSetP) (bool, error) {
req := NewRequest[bool]("deleteStickerFromSet", p)
return req.Do(api)
}
type ReplaceStickerInSetP struct {
UserID int `json:"user_id"`
Name string `json:"name"`
OldSticker string `json:"old_sticker"`
Sticker InputSticker `json:"sticker"`
}
func (api *Api) ReplaceStickerInSet(p ReplaceStickerInSetP) (bool, error) {
req := NewRequest[bool]("replaceStickerInSet", p)
return req.Do(api)
}
type SetStickerEmojiListP struct {
Sticker string `json:"sticker"`
EmojiList []string `json:"emoji_list"`
}
func (api *Api) SetStickerEmojiList(p SetStickerEmojiListP) (bool, error) {
req := NewRequest[bool]("setStickerEmojiList", p)
return req.Do(api)
}
type SetStickerKeywordsP struct {
Sticker string `json:"sticker"`
Keywords []string `json:"keywords"`
}
func (api *Api) SetStickerKeywords(p SetStickerKeywordsP) (bool, error) {
req := NewRequest[bool]("setStickerKeywords", p)
return req.Do(api)
}
type SetStickerMaskPositionP struct {
Sticker string `json:"sticker"`
MaskPosition *MaskPosition `json:"mask_position,omitempty"`
}
func (api *Api) SetStickerMaskPosition(p SetStickerMaskPositionP) (bool, error) {
req := NewRequest[bool]("setStickerMaskPosition", p)
return req.Do(api)
}
type SetStickerSetTitleP struct {
Name string `json:"name"`
Title string `json:"title"`
}
func (api *Api) SetStickerSetTitle(p SetStickerSetTitleP) (bool, error) {
req := NewRequest[bool]("setStickerSetTitle", p)
return req.Do(api)
}
type SetStickerSetThumbnailP struct {
Name string `json:"name"`
UserID int `json:"user_id"`
Thumbnail string `json:"thumbnail"`
Format InputStickerFormat `json:"format"`
}
func (api *Api) SetStickerSetThumbnail(p SetStickerSetThumbnailP) (bool, error) {
req := NewRequest[bool]("setStickerSetThumbnail", p)
return req.Do(api)
}
type SetCustomEmojiStickerSetThumbnailP struct {
Name string `json:"name"`
CustomEmojiID string `json:"custom_emoji_id,omitempty"`
}
func (api *Api) SetCustomEmojiStickerSetThumbnail(p SetStickerSetThumbnailP) (bool, error) {
req := NewRequest[bool]("setCustomEmojiStickerSetThumbnail", p)
return req.Do(api)
}
type DeleteStickerSetP struct {
Name string `json:"name"`
}
func (api *Api) DeleteStickerSet(p DeleteStickerSetP) (bool, error) {
req := NewRequest[bool]("deleteStickerSet", p)
return req.Do(api)
}

65
tgapi/stickers_types.go Normal file
View File

@@ -0,0 +1,65 @@
package tgapi
type MaskPositionPoint string
const (
MaskPositionForehead MaskPositionPoint = "forehead"
MaskPositionEyes MaskPositionPoint = "eyes"
MaskPositionMouth MaskPositionPoint = "mouth"
MaskPositionChin MaskPositionPoint = "chin"
)
type MaskPosition struct {
Point MaskPositionPoint `json:"point"`
XShift float32 `json:"x_shift"`
YShift float32 `json:"y_shift"`
Scale float32 `json:"scale"`
}
type StickerType string
const (
StickerTypeRegular StickerType = "regular"
StickerTypeMask StickerType = "mask"
StickerTypeCustomEmoji StickerType = "custom_emoji"
)
type Sticker struct {
FileId string `json:"file_id"`
FileUniqueId string `json:"file_unique_id"`
Type StickerType `json:"type"`
Width int `json:"width"`
Height int `json:"height"`
IsAnimated bool `json:"is_animated"`
IsVideo bool `json:"is_video"`
Thumbnail *PhotoSize `json:"thumbnail,omitempty"`
Emoji *string `json:"emoji,omitempty"`
SetName *string `json:"set_name,omitempty"`
MaskPosition *MaskPosition `json:"mask_position,omitempty"`
CustomEmojiID *string `json:"custom_emoji_id,omitempty"`
NeedRepainting *bool `json:"need_repainting,omitempty"`
FileSize *int `json:"file_size,omitempty"`
}
type StickerSet struct {
Name string `json:"name"`
Title string `json:"title"`
StickerType StickerType `json:"sticker_type"`
Stickers []Sticker `json:"stickers"`
Thumbnail *PhotoSize `json:"thumbnail,omitempty"`
}
type InputStickerFormat string
const (
InputStickerFormatStatic InputStickerFormat = "static"
InputStickerFormatAnimated InputStickerFormat = "animated"
InputStickerFormatVideo InputStickerFormat = "video"
)
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"`
}

113
tgapi/types.go Normal file
View File

@@ -0,0 +1,113 @@
package tgapi
type Update struct {
UpdateID int `json:"update_id"`
Message *Message `json:"message"`
EditedMessage *Message `json:"edited_message,omitempty"`
ChannelPost *Message `json:"channel_post,omitempty"`
EditedChannelPost *Message `json:"edited_channel_post,omitempty"`
BusinessConnection *BusinessConnection `json:"business_connection,omitempty"`
BusinessMessage *Message `json:"business_message,omitempty"`
EditedBusinessMessage *Message `json:"edited_business_message,omitempty"`
DeletedBusinessMessage *Message `json:"deleted_business_messages,omitempty"`
MessageReaction *MessageReactionUpdated `json:"message_reaction,omitempty"`
MessageReactionCount *MessageReactionCountUpdated `json:"message_reaction_count,omitempty"`
CallbackQuery *CallbackQuery `json:"callback_query,omitempty"`
InlineQuery int
ChosenInlineResult int
}
type File struct {
FileId string `json:"file_id"`
FileUniqueID string `json:"file_unique_id"`
FileSize int `json:"file_size,omitempty"`
FilePath string `json:"file_path,omitempty"`
}
type Audio struct {
FileID string `json:"file_id"`
FileUniqueID string `json:"file_unique_id"`
Duration int `json:"duration"`
Performer string `json:"performer,omitempty"`
Title string `json:"title,omitempty"`
FileName string `json:"file_name,omitempty"`
MimeType string `json:"mime_type,omitempty"`
FileSize int `json:"file_size,omitempty"`
Thumbnail *PhotoSize `json:"thumbnail,omitempty"`
}
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"`
}
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"`
}
type WebAppInfo struct {
URL string `json:"url"`
}
type StarAmount struct {
Amount int `json:"amount"`
NanostarAmount int `json:"nanostar_amount"`
}
// Gifts
type AcceptedGiftTypes struct {
UnlimitedGifts bool `json:"unlimited_gifts"`
LimitedGifts bool `json:"limited_gifts"`
UniqueGifts bool `json:"unique_gifts"`
PremiumSubscription bool `json:"premium_subscription"`
GiftsFromChannels bool `json:"gifts_from_channels"`
}
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"`
}
type GiftBackground struct {
CenterColor int `json:"center_color"`
EdgeColor int `json:"edge_color"`
TextColor int `json:"text_color"`
}
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"`
}
type Gifts struct {
Gifts []Gift `json:"gifts"`
}
type OwnedGiftType string
type BaseOwnedGift struct {
Type OwnedGiftType `json:"type"`
}

165
tgapi/uploader.go Normal file
View File

@@ -0,0 +1,165 @@
package tgapi
import (
"bytes"
"encoding/json"
"fmt"
"io"
"mime/multipart"
"net/http"
"path/filepath"
"git.nix13.pw/scuroneko/laniakea/utils"
"git.nix13.pw/scuroneko/slog"
)
type Uploader struct {
api *Api
logger *slog.Logger
}
func NewUploader(api *Api) *Uploader {
logger := slog.CreateLogger().Level(GetLoggerLevel()).Prefix("UPLOADER")
logger.AddWriter(logger.CreateJsonStdoutWriter())
return &Uploader{api, logger}
}
func (u *Uploader) Close() error {
return u.logger.Close()
}
type UploaderFileType string
const (
UploaderPhotoType UploaderFileType = "photo"
UploaderVideoType UploaderFileType = "video"
UploaderAudioType UploaderFileType = "audio"
UploaderDocumentType UploaderFileType = "document"
UploaderVoiceType UploaderFileType = "voice"
UploaderVideoNoteType UploaderFileType = "video_note"
)
type UploaderFile struct {
filename string
data []byte
t UploaderFileType
}
func NewUploaderFile(name string, data []byte) UploaderFile {
t := uploaderTypeByExt(name)
return UploaderFile{filename: name, data: data, t: t}
}
// SetType used when auto-detect failed. I.e. you sending a voice message, but it detects as audio
func (f UploaderFile) SetType(t UploaderFileType) UploaderFile {
f.t = t
return f
}
type UploaderRequest[R, P any] struct {
method string
file UploaderFile
params P
}
func NewUploaderRequest[R, P any](method string, file UploaderFile, params P) UploaderRequest[R, P] {
return UploaderRequest[R, P]{method, file, params}
}
func (u UploaderRequest[R, P]) Do(up *Uploader) (*R, error) {
url := fmt.Sprintf("https://api.telegram.org/bot%s/%s", up.api.token, u.method)
buf := bytes.NewBuffer(nil)
w := multipart.NewWriter(buf)
fw, err := w.CreateFormFile(string(u.file.t), u.file.filename)
if err != nil {
w.Close()
return nil, err
}
_, err = fw.Write(u.file.data)
if err != nil {
w.Close()
return nil, err
}
err = utils.Encode(w, u.params)
if err != nil {
w.Close()
return nil, err
}
err = w.Close()
if err != nil {
return nil, err
}
req, err := http.NewRequest("POST", url, buf)
if err != nil {
return nil, err
}
req.Header.Set("Content-Type", w.FormDataContentType())
up.logger.Debugln("UPLOADER REQ", u.method)
res, err := http.DefaultClient.Do(req)
if err != nil {
return nil, err
}
defer res.Body.Close()
body, err := io.ReadAll(res.Body)
if err != nil {
return nil, err
}
up.logger.Debugln("UPLOADER RES", u.method, string(body))
if res.StatusCode != http.StatusOK {
return nil, fmt.Errorf("[%d] %s", res.StatusCode, string(body))
}
response := new(ApiResponse[*R])
err = json.Unmarshal(body, response)
if err != nil {
return nil, err
}
if !response.Ok {
return nil, fmt.Errorf("[%d] %s", response.ErrorCode, response.Description)
}
return response.Result, nil
}
type UploadPhotoP struct {
BusinessConnectionID string `json:"business_connection_id,omitempty"`
ChatID int `json:"chat_id"`
MessageThreadID int `json:"message_thread_id,omitempty"`
ParseMode ParseMode `json:"parse_mode,omitempty"`
Caption string `json:"caption,omitempty"`
CaptionEntities []*MessageEntity `json:"caption_entities,omitempty"`
ShowCaptionAboveMedia bool `json:"show_caption_above_media,omitempty"`
HasSpoiler bool `json:"has_spoiler,omitempty"`
DisableNotifications bool `json:"disable_notifications,omitempty"`
ProtectContent bool `json:"protect_content,omitempty"`
AllowPaidBroadcast bool `json:"allow_paid_broadcast,omitempty"`
MessageEffectID string `json:"message_effect_id,omitempty"`
ReplyMarkup *InlineKeyboardMarkup `json:"reply_markup,omitempty"`
}
func (u *Uploader) UploadPhoto(file UploaderFile, params UploadPhotoP) (*Message, error) {
req := NewUploaderRequest[Message]("sendPhoto", file, params)
return req.Do(u)
}
// setChatPhoto https://core.telegram.org/bots/api#setchatphoto
type UploadChatPhotoP struct {
}
func uploaderTypeByExt(filename string) UploaderFileType {
ext := filepath.Ext(filename)
switch ext {
case ".jpg", ".jpeg", ".png", ".webp", ".bmp":
return UploaderPhotoType
case ".mp4":
return UploaderVideoType
case ".mp3", ".m4a":
return UploaderAudioType
case ".ogg":
return UploaderVoiceType
default:
return UploaderDocumentType
}
}

34
tgapi/users_methods.go Normal file
View File

@@ -0,0 +1,34 @@
package tgapi
type GetUserProfilePhotosP struct {
UserID int `json:"user_id"`
Offset int `json:"offset,omitempty"`
Limit int `json:"limit,omitempty"`
}
func (api *Api) GetUserProfilePhotos(p GetUserProfilePhotosP) (UserProfilePhotos, error) {
req := NewRequest[UserProfilePhotos]("getUserProfilePhotos", p)
return req.Do(api)
}
type GetUserProfileAudiosP struct {
UserID int `json:"user_id"`
Offset int `json:"offset,omitempty"`
Limit int `json:"limit,omitempty"`
}
func (api *Api) GetUserProfileAudios(p GetUserProfileAudiosP) (UserProfileAudios, error) {
req := NewRequest[UserProfileAudios]("getUserProfileAudios", p)
return req.Do(api)
}
type SetUserEmojiStatusP struct {
UserID int `json:"user_id"`
EmojiID string `json:"emoji_status_custom_emoji_id,omitempty"`
ExpirationDate int `json:"emoji_status_expiration_date,omitempty"`
}
func (api *Api) SetUserEmojiStatus(p SetUserEmojiStatusP) (bool, error) {
req := NewRequest[bool]("setUserEmojiStatus", p)
return req.Do(api)
}

40
tgapi/users_types.go Normal file
View File

@@ -0,0 +1,40 @@
package tgapi
type User struct {
ID int `json:"id"`
IsBot bool `json:"is_bot"`
FirstName string `json:"first_name"`
LastName string `json:"last_name,omitempty"`
Username string `json:"username,omitempty"`
LanguageCode string `json:"language_code,omitempty"`
IsPremium bool `json:"is_premium,omitempty"`
AddedToAttachmentMenu bool `json:"added_to_attachment_menu,omitempty"`
CanJoinGroups bool `json:"can_join_groups,omitempty"`
CanReadAllGroupMessages bool `json:"can_read_all_group_messages,omitempty"`
SupportsInlineQueries bool `json:"supports_inline_queries,omitempty"`
CanConnectToBusiness bool `json:"can_connect_to_business,omitempty"`
HasMainWebApp bool `json:"has_main_web_app,omitempty"`
HasTopicsEnabled bool `json:"has_topics_enabled,omitempty"`
AllowsUsersToCreateTopics bool `json:"allows_users_to_create_topics,omitempty"`
}
type UserProfilePhotos struct {
TotalCount int `json:"total_count"`
Photos [][]PhotoSize `json:"photos"`
}
type UserProfileAudios struct {
TotalCount int `json:"total_count"`
Audios []Audio `json:"audios"`
}
type UserRating struct {
Level int `json:"level"`
Rating int `json:"rating"`
CurrentLevelRating int `json:"current_level_rating"`
NextLevelRating int `json:"next_level_rating"`
}
type Birthdate struct {
Day int `json:"day"`
Month int `json:"month"`
Year int `json:"year"`
}

15
tgapi/utils.go Normal file
View File

@@ -0,0 +1,15 @@
package tgapi
import (
"os"
"git.nix13.pw/scuroneko/slog"
)
func GetLoggerLevel() slog.LogLevel {
level := slog.FATAL
if os.Getenv("DEBUG") == "true" {
level = slog.DEBUG
}
return level
}