You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
telebot/sticker.go

307 lines
7.8 KiB
Go

package telebot
import (
"encoding/json"
"errors"
"fmt"
"strconv"
)
type (
StickerSetType = string
StickerSetFormat = string
MaskFeature = string
)
const (
StickerRegular StickerSetType = "regular"
StickerMask StickerSetType = "mask"
StickerCustomEmoji StickerSetType = "custom_emoji"
)
const (
StickerStatic StickerSetFormat = "static"
StickerAnimated StickerSetFormat = "animated"
StickerVideo StickerSetFormat = "video"
)
const (
MaskForehead MaskFeature = "forehead"
MaskEyes MaskFeature = "eyes"
MaskMouth MaskFeature = "mouth"
MaskChin MaskFeature = "chin"
)
// StickerSet represents a sticker set.
type StickerSet struct {
Type StickerSetType `json:"sticker_type"`
Format StickerSetFormat `json:"sticker_format"`
Name string `json:"name"`
Title string `json:"title"`
Animated bool `json:"is_animated"`
Video bool `json:"is_video"`
Stickers []Sticker `json:"stickers"`
Thumbnail *Photo `json:"thumbnail"`
Emojis string `json:"emojis"`
ContainsMasks bool `json:"contains_masks"` // FIXME: can be removed
MaskPosition *MaskPosition `json:"mask_position"`
Repaint bool `json:"needs_repainting"`
// Input is a field used in createNewStickerSet method to specify a list
// of pre-defined stickers of type InputSticker to add to the set.
Input []InputSticker
}
type InputSticker struct {
File
Sticker string `json:"sticker"`
MaskPosition *MaskPosition `json:"mask_position"`
Emojis []string `json:"emoji_list"`
Keywords []string `json:"keywords"`
}
// MaskPosition describes the position on faces where
// a mask should be placed by default.
type MaskPosition struct {
Feature MaskFeature `json:"point"`
XShift float32 `json:"x_shift"`
YShift float32 `json:"y_shift"`
Scale float32 `json:"scale"`
}
// UploadSticker uploads a sticker file for later use.
func (b *Bot) UploadSticker(to Recipient, format StickerSetFormat, f File) (*File, error) {
params := map[string]string{
"user_id": to.Recipient(),
"sticker_format": format,
}
data, err := b.sendFiles("uploadStickerFile", map[string]File{"0": f}, params)
if err != nil {
return nil, err
}
var resp struct {
Result File
}
if err := json.Unmarshal(data, &resp); err != nil {
return nil, wrapError(err)
}
return &resp.Result, nil
}
// StickerSet returns a sticker set on success.
func (b *Bot) StickerSet(name string) (*StickerSet, error) {
data, err := b.Raw("getStickerSet", map[string]string{"name": name})
if err != nil {
return nil, err
}
var resp struct {
Result *StickerSet
}
if err := json.Unmarshal(data, &resp); err != nil {
return nil, wrapError(err)
}
return resp.Result, nil
}
// CreateStickerSet creates a new sticker set.
func (b *Bot) CreateStickerSet(of Recipient, set *StickerSet) error {
files := make(map[string]File)
for i, s := range set.Input {
repr := s.File.process(strconv.Itoa(i), files)
if repr == "" {
return fmt.Errorf("telebot: sticker #%d does not exist", i+1)
}
set.Input[i].Sticker = repr
}
data, _ := json.Marshal(set.Input)
params := map[string]string{
"user_id": of.Recipient(),
"name": set.Name,
"title": set.Title,
"sticker_format": set.Format,
"stickers": string(data),
}
if set.Type != "" {
params["sticker_type"] = set.Type
}
if set.Repaint {
params["needs_repainting"] = "true"
}
_, err := b.sendFiles("createNewStickerSet", files, params)
return err
}
// AddStickerToSet adds a new sticker to the existing sticker set.
func (b *Bot) AddStickerToSet(of Recipient, name string, sticker InputSticker) error {
files := make(map[string]File)
repr := sticker.File.process("0", files)
if repr == "" {
return errors.New("telebot: sticker does not exist")
}
sticker.Sticker = repr
data, _ := json.Marshal(sticker)
params := map[string]string{
"user_id": of.Recipient(),
"name": name,
"sticker": string(data),
}
_, err := b.sendFiles("addStickerToSet", files, params)
return err
}
// SetStickerPosition moves a sticker in set to a specific position.
func (b *Bot) SetStickerPosition(sticker string, position int) error {
params := map[string]string{
"sticker": sticker,
"position": strconv.Itoa(position),
}
_, err := b.Raw("setStickerPositionInSet", params)
return err
}
// DeleteSticker deletes a sticker from a set created by the bot.
func (b *Bot) DeleteSticker(sticker string) error {
_, err := b.Raw("deleteStickerFromSet", map[string]string{"sticker": sticker})
return err
}
// SetStickerSetThumb sets a thumbnail of the sticker set.
// Animated thumbnails can be set for animated sticker sets only.
//
// Thumbnail must be a PNG image, up to 128 kilobytes in size
// and have width and height exactly 100px, or a TGS animation
// up to 32 kilobytes in size.
//
// Animated sticker set thumbnail can't be uploaded via HTTP URL.
func (b *Bot) SetStickerSetThumb(of Recipient, set *StickerSet) error {
if set.Thumbnail == nil {
return errors.New("telebot: thumbnail is required")
}
files := make(map[string]File)
repr := set.Thumbnail.File.process("thumb", files)
if repr == "" {
return errors.New("telebot: thumbnail does not exist")
}
params := map[string]string{
"user_id": of.Recipient(),
"name": set.Name,
"thumbnail": repr,
}
_, err := b.sendFiles("setStickerSetThumbnail", files, params)
return err
}
// SetStickerSetTitle sets the title of a created sticker set.
func (b *Bot) SetStickerSetTitle(s StickerSet) error {
params := map[string]string{
"name": s.Name,
"title": s.Title,
}
_, err := b.Raw("setStickerSetTitle", params)
return err
}
// DeleteStickerSet deletes a sticker set that was created by the bot.
func (b *Bot) DeleteStickerSet(name string) error {
params := map[string]string{"name": name}
_, err := b.Raw("deleteStickerSet", params)
return err
}
// SetStickerEmojis changes the list of emoji assigned to a regular or custom emoji sticker.
func (b *Bot) SetStickerEmojis(sticker string, emojis []string) error {
data, err := json.Marshal(emojis)
if err != nil {
return err
}
params := map[string]string{
"sticker": sticker,
"emoji_list": string(data),
}
_, err = b.Raw("setStickerEmojiList", params)
return err
}
// SetStickerKeywords changes search keywords assigned to a regular or custom emoji sticker.
func (b *Bot) SetStickerKeywords(sticker string, keywords []string) error {
mk, err := json.Marshal(keywords)
if err != nil {
return err
}
params := map[string]string{
"sticker": sticker,
"keywords": string(mk),
}
_, err = b.Raw("setStickerKeywords", params)
return err
}
// SetStickerMaskPosition changes the mask position of a mask sticker.
func (b *Bot) SetStickerMaskPosition(sticker string, mask MaskPosition) error {
data, err := json.Marshal(mask)
if err != nil {
return err
}
params := map[string]string{
"sticker": sticker,
"mask_position": string(data),
}
_, err = b.Raw("setStickerMaskPosition", params)
return err
}
// CustomEmojiStickers returns the information about custom emoji stickers by their ids.
func (b *Bot) CustomEmojiStickers(ids []string) ([]Sticker, error) {
data, _ := json.Marshal(ids)
params := map[string]string{
"custom_emoji_ids": string(data),
}
data, err := b.Raw("getCustomEmojiStickers", params)
if err != nil {
return nil, err
}
var resp struct {
Result []Sticker
}
if err := json.Unmarshal(data, &resp); err != nil {
return nil, wrapError(err)
}
return resp.Result, nil
}
// SetCustomEmojiStickerSetThumb sets the thumbnail of a custom emoji sticker set.
func (b *Bot) SetCustomEmojiStickerSetThumb(name, id string) error {
params := map[string]string{
"name": name,
"custom_emoji_id": id,
}
_, err := b.Raw("setCustomEmojiStickerSetThumbnail", params)
return err
}