Skip to content

Commit 435ad60

Browse files
committed
sticker: finish stickers api
1 parent 32b47a4 commit 435ad60

File tree

6 files changed

+164
-107
lines changed

6 files changed

+164
-107
lines changed

api.go

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -163,6 +163,19 @@ func addFileToWriter(writer *multipart.Writer, filename, field string, file inte
163163
return err
164164
}
165165

166+
func (f *File) process(name string, files map[string]File) string {
167+
switch {
168+
case f.InCloud():
169+
return f.FileID
170+
case f.FileURL != "":
171+
return f.FileURL
172+
case f.OnDisk() || f.FileReader != nil:
173+
files[name] = *f
174+
return "attach://" + name
175+
}
176+
return ""
177+
}
178+
166179
func (b *Bot) sendText(to Recipient, text string, opt *SendOptions) (*Message, error) {
167180
params := map[string]string{
168181
"chat_id": to.Recipient(),

bot.go

Lines changed: 3 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -305,21 +305,8 @@ func (b *Bot) SendAlbum(to Recipient, a Album, opts ...interface{}) ([]Message,
305305
files := make(map[string]File)
306306

307307
for i, x := range a {
308-
var (
309-
repr string
310-
data []byte
311-
file = x.MediaFile()
312-
)
313-
314-
switch {
315-
case file.InCloud():
316-
repr = file.FileID
317-
case file.FileURL != "":
318-
repr = file.FileURL
319-
case file.OnDisk() || file.FileReader != nil:
320-
repr = "attach://" + strconv.Itoa(i)
321-
files[strconv.Itoa(i)] = *file
322-
default:
308+
repr := x.MediaFile().process(strconv.Itoa(i), files)
309+
if repr == "" {
323310
return nil, fmt.Errorf("telebot: album entry #%d does not exist", i)
324311
}
325312

@@ -332,7 +319,7 @@ func (b *Bot) SendAlbum(to Recipient, a Album, opts ...interface{}) ([]Message,
332319
im.ParseMode = sendOpts.ParseMode
333320
}
334321

335-
data, _ = json.Marshal(im)
322+
data, _ := json.Marshal(im)
336323
media[i] = string(data)
337324
}
338325

bot_test.go

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,9 @@ var (
2424
b, _ = newTestBot() // cached bot instance to avoid getMe method flooding
2525
to = &Chat{ID: chatID} // to chat recipient for send and edit methods
2626
user = &User{ID: userID} // to user recipient for some special cases
27+
28+
logo = FromURL("https://telegra.ph/file/c95b8fe46dd3df15d12e5.png")
29+
thumb = FromURL("https://telegra.ph/file/fe28e378784b3a4e367fb.png")
2730
)
2831

2932
func defaultSettings() Settings {
@@ -502,7 +505,7 @@ func TestBot(t *testing.T) {
502505
assert.Equal(t, ErrBadRecipient, err)
503506

504507
photo := &Photo{
505-
File: FromURL("https://telegra.ph/file/65c5237b040ebf80ec278.jpg"),
508+
File: logo,
506509
Caption: t.Name(),
507510
}
508511
var msg *Message

media.go

Lines changed: 2 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -280,20 +280,18 @@ func (v *VideoNote) MediaFile() *File {
280280
// Sticker object represents a WebP image, so-called sticker.
281281
type Sticker struct {
282282
File
283+
Type StickerSetType `json:"type"`
283284
Width int `json:"width"`
284285
Height int `json:"height"`
285286
Animated bool `json:"is_animated"`
286287
Video bool `json:"is_video"`
287288
Thumbnail *Photo `json:"thumbnail"`
288289
Emoji string `json:"emoji"`
289290
SetName string `json:"set_name"`
290-
MaskPosition *MaskPosition `json:"mask_position"`
291291
PremiumAnimation *File `json:"premium_animation"`
292-
Type StickerSetType `json:"type"`
292+
MaskPosition *MaskPosition `json:"mask_position"`
293293
CustomEmoji string `json:"custom_emoji_id"`
294294
Repaint bool `json:"needs_repainting"`
295-
Emojis []string `json:"emoji_list"`
296-
Keywords []string `json:"keywords"`
297295
}
298296

299297
func (s *Sticker) MediaType() string {
@@ -304,12 +302,6 @@ func (s *Sticker) MediaFile() *File {
304302
return &s.File
305303
}
306304

307-
func (s *Sticker) InputMedia() InputMedia {
308-
return InputMedia{
309-
Type: s.MediaType(),
310-
}
311-
}
312-
313305
// Contact object represents a contact to Telegram user.
314306
type Contact struct {
315307
PhoneNumber string `json:"phone_number"`

stickers.go renamed to sticker.go

Lines changed: 81 additions & 80 deletions
Original file line numberDiff line numberDiff line change
@@ -2,24 +2,34 @@ package telebot
22

33
import (
44
"encoding/json"
5+
"errors"
56
"fmt"
67
"strconv"
78
)
89

9-
type StickerSetType = string
10+
type (
11+
StickerSetType = string
12+
StickerSetFormat = string
13+
MaskFeature = string
14+
)
1015

1116
const (
12-
StickerRegular = "regular"
13-
StickerMask = "mask"
14-
StickerCustomEmoji = "custom_emoji"
17+
StickerRegular StickerSetType = "regular"
18+
StickerMask StickerSetType = "mask"
19+
StickerCustomEmoji StickerSetType = "custom_emoji"
1520
)
1621

17-
type StickerSetFormat = string
22+
const (
23+
StickerStatic StickerSetFormat = "static"
24+
StickerAnimated StickerSetFormat = "animated"
25+
StickerVideo StickerSetFormat = "video"
26+
)
1827

1928
const (
20-
StickerStatic = "static"
21-
StickerAnimated = "animated"
22-
StickerVideo = "video"
29+
MaskForehead MaskFeature = "forehead"
30+
MaskEyes MaskFeature = "eyes"
31+
MaskMouth MaskFeature = "mouth"
32+
MaskChin MaskFeature = "chin"
2333
)
2434

2535
// StickerSet represents a sticker set.
@@ -31,12 +41,23 @@ type StickerSet struct {
3141
Animated bool `json:"is_animated"`
3242
Video bool `json:"is_video"`
3343
Stickers []Sticker `json:"stickers"`
34-
Sticker Sticker `json:"sticker"`
3544
Thumbnail *Photo `json:"thumbnail"`
3645
Emojis string `json:"emojis"`
3746
ContainsMasks bool `json:"contains_masks"` // FIXME: can be removed
3847
MaskPosition *MaskPosition `json:"mask_position"`
3948
Repaint bool `json:"needs_repainting"`
49+
50+
// Input is a field used in createNewStickerSet method to specify a list
51+
// of pre-defined stickers of type InputSticker to add to the set.
52+
Input []InputSticker
53+
}
54+
55+
type InputSticker struct {
56+
File
57+
Sticker string `json:"sticker"`
58+
MaskPosition *MaskPosition `json:"mask_position"`
59+
Emojis []string `json:"emoji_list"`
60+
Keywords []string `json:"keywords"`
4061
}
4162

4263
// MaskPosition describes the position on faces where
@@ -48,28 +69,14 @@ type MaskPosition struct {
4869
Scale float32 `json:"scale"`
4970
}
5071

51-
// MaskFeature defines sticker mask position.
52-
type MaskFeature string
53-
54-
const (
55-
FeatureForehead MaskFeature = "forehead"
56-
FeatureEyes MaskFeature = "eyes"
57-
FeatureMouth MaskFeature = "mouth"
58-
FeatureChin MaskFeature = "chin"
59-
)
60-
61-
// UploadSticker uploads a PNG file with a sticker for later use.
62-
func (b *Bot) UploadSticker(to Recipient, s StickerSet) (*File, error) {
63-
files := map[string]File{
64-
"sticker": s.Sticker.File,
65-
}
66-
72+
// UploadSticker uploads a sticker file for later use.
73+
func (b *Bot) UploadSticker(to Recipient, format StickerSetFormat, f File) (*File, error) {
6774
params := map[string]string{
6875
"user_id": to.Recipient(),
69-
"sticker_format": s.Format,
76+
"sticker_format": format,
7077
}
7178

72-
data, err := b.sendFiles("uploadStickerFile", files, params)
79+
data, err := b.sendFiles("uploadStickerFile", map[string]File{"0": f}, params)
7380
if err != nil {
7481
return nil, err
7582
}
@@ -100,56 +107,51 @@ func (b *Bot) StickerSet(name string) (*StickerSet, error) {
100107
}
101108

102109
// CreateStickerSet creates a new sticker set.
103-
func (b *Bot) CreateStickerSet(to Recipient, s StickerSet) error {
110+
func (b *Bot) CreateStickerSet(of Recipient, set *StickerSet) error {
104111
files := make(map[string]File)
105-
for i, sticker := range s.Stickers {
106-
key := fmt.Sprint("sticker", i)
107-
files[key] = sticker.File
112+
for i, s := range set.Input {
113+
repr := s.File.process(strconv.Itoa(i), files)
114+
if repr == "" {
115+
return fmt.Errorf("telebot: sticker #%d does not exist", i+1)
116+
}
117+
set.Input[i].Sticker = repr
108118
}
109119

110-
data, err := json.Marshal(s.Stickers)
111-
if err != nil {
112-
return err
113-
}
120+
data, _ := json.Marshal(set.Input)
114121

115122
params := map[string]string{
116-
"user_id": to.Recipient(),
117-
"name": s.Name,
118-
"title": s.Title,
119-
"sticker_type": s.Type,
120-
"sticker_format": s.Format,
121-
"stickers": string(data),
122-
"needs_repainting": strconv.FormatBool(s.Repaint),
123+
"user_id": of.Recipient(),
124+
"name": set.Name,
125+
"title": set.Title,
126+
"sticker_format": set.Format,
127+
"stickers": string(data),
128+
}
129+
if set.Type != "" {
130+
params["sticker_type"] = set.Type
131+
}
132+
if set.Repaint {
133+
params["needs_repainting"] = "true"
123134
}
124135

125-
_, err = b.sendFiles("createNewStickerSet", files, params)
136+
_, err := b.sendFiles("createNewStickerSet", files, params)
126137
return err
127138
}
128139

129140
// AddStickerToSet adds a new sticker to the existing sticker set.
130-
func (b *Bot) AddStickerToSet(to Recipient, s StickerSet) error {
131-
var (
132-
files = make(map[string]File)
133-
sticker = s.Sticker
134-
)
135-
files["sticker"] = sticker.File
136-
137-
params := map[string]string{
138-
"user_id": to.Recipient(),
139-
"name": s.Name,
141+
func (b *Bot) AddStickerToSet(of Recipient, name string, sticker InputSticker) error {
142+
files := make(map[string]File)
143+
repr := sticker.File.process("0", files)
144+
if repr == "" {
145+
return errors.New("telebot: sticker does not exist")
140146
}
141147

142-
if sticker.Emojis != nil {
143-
data, _ := json.Marshal(s.Emojis)
144-
params["emoji_list"] = string(data)
145-
}
146-
if s.MaskPosition != nil {
147-
data, _ := json.Marshal(s.MaskPosition)
148-
params["mask_position"] = string(data)
149-
}
150-
if sticker.Keywords != nil {
151-
data, _ := json.Marshal(sticker.Keywords)
152-
params["keywords"] = string(data)
148+
sticker.Sticker = repr
149+
data, _ := json.Marshal(sticker)
150+
151+
params := map[string]string{
152+
"user_id": of.Recipient(),
153+
"name": name,
154+
"sticker": string(data),
153155
}
154156

155157
_, err := b.sendFiles("addStickerToSet", files, params)
@@ -182,25 +184,24 @@ func (b *Bot) DeleteSticker(sticker string) error {
182184
// up to 32 kilobytes in size.
183185
//
184186
// Animated sticker set thumbnail can't be uploaded via HTTP URL.
185-
func (b *Bot) SetStickerSetThumb(to Recipient, s StickerSet) error {
186-
var (
187-
sticker = s.Sticker
188-
files = make(map[string]File)
189-
)
190-
files["thumbnail"] = sticker.File
191-
192-
data, err := json.Marshal(sticker.File)
193-
if err != nil {
194-
return err
187+
func (b *Bot) SetStickerSetThumb(of Recipient, set *StickerSet) error {
188+
if set.Thumbnail == nil {
189+
return errors.New("telebot: thumbnail is required")
190+
}
191+
192+
files := make(map[string]File)
193+
repr := set.Thumbnail.File.process("thumb", files)
194+
if repr == "" {
195+
return errors.New("telebot: thumbnail does not exist")
195196
}
196197

197198
params := map[string]string{
198-
"name": s.Name,
199-
"user_id": to.Recipient(),
200-
"thumbnail": string(data),
199+
"user_id": of.Recipient(),
200+
"name": set.Name,
201+
"thumbnail": repr,
201202
}
202203

203-
_, err = b.sendFiles("setStickerSetThumbnail", files, params)
204+
_, err := b.sendFiles("setStickerSetThumbnail", files, params)
204205
return err
205206
}
206207

@@ -223,8 +224,8 @@ func (b *Bot) DeleteStickerSet(name string) error {
223224
return err
224225
}
225226

226-
// SetStickerEmojiList changes the list of emoji assigned to a regular or custom emoji sticker.
227-
func (b *Bot) SetStickerEmojiList(sticker string, emojis []string) error {
227+
// SetStickerEmojis changes the list of emoji assigned to a regular or custom emoji sticker.
228+
func (b *Bot) SetStickerEmojis(sticker string, emojis []string) error {
228229
data, err := json.Marshal(emojis)
229230
if err != nil {
230231
return err

0 commit comments

Comments
 (0)