@@ -2,24 +2,34 @@ package telebot
22
33import  (
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
1116const  (
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
1928const  (
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