diff --git a/telebot/__init__.py b/telebot/__init__.py index 1fbc832..ac92378 100644 --- a/telebot/__init__.py +++ b/telebot/__init__.py @@ -4586,14 +4586,16 @@ class TeleBot: def create_new_sticker_set( self, user_id: int, name: str, title: str, - emojis: str, + emojis: Optional[List[str]]=None, png_sticker: Union[Any, str]=None, tgs_sticker: Union[Any, str]=None, webm_sticker: Union[Any, str]=None, contains_masks: Optional[bool]=None, sticker_type: Optional[str]=None, mask_position: Optional[types.MaskPosition]=None, - needs_repainting: Optional[bool]=None) -> bool: + needs_repainting: Optional[bool]=None, + stickers: List[types.InputSticker]=None, + sticker_format: Optional[str]=None) -> bool: """ Use this method to create new sticker set owned by a user. The bot will be able to edit the created sticker set. @@ -4601,6 +4603,9 @@ class TeleBot: Telegram documentation: https://core.telegram.org/bots/api#createnewstickerset + .. note:: + Fields *_sticker are deprecated, pass a list of stickers to stickers parameter instead. + :param user_id: User identifier of created sticker set owner :type user_id: :obj:`int` @@ -4641,17 +4646,37 @@ class TeleBot: for custom emoji sticker sets only :type needs_repainting: :obj:`bool` + :param stickers: List of stickers to be added to the set + :type stickers: :obj:`list` of :class:`telebot.types.InputSticker` + + :param sticker_format: Format of stickers in the set, must be one of “static”, “animated”, “video” + :type sticker_format: :obj:`str` + :return: On success, True is returned. :rtype: :obj:`bool` """ + if tgs_sticker: + sticker_format = 'animated' + elif webm_sticker: + sticker_format = 'video' + elif png_sticker: + sticker_format = 'static' + if contains_masks is not None: logger.warning('The parameter "contains_masks" is deprecated, use "sticker_type" instead') if sticker_type is None: sticker_type = 'mask' if contains_masks else 'regular' + if stickers is None: + stickers = png_sticker or tgs_sticker or webm_sticker + if stickers is None: + raise ValueError('You must pass at least one sticker') + stickers = [types.InputSticker(sticker=stickers, emoji_list=emojis, mask_position=mask_position)] + + + return apihelper.create_new_sticker_set( - self.token, user_id, name, title, emojis, png_sticker, tgs_sticker, - mask_position, webm_sticker, sticker_type, needs_repainting) + self.token, user_id, name, title, stickers, sticker_format, sticker_type, needs_repainting) def add_sticker_to_set( diff --git a/telebot/apihelper.py b/telebot/apihelper.py index 82d45aa..0ee636e 100644 --- a/telebot/apihelper.py +++ b/telebot/apihelper.py @@ -1629,28 +1629,32 @@ def upload_sticker_file(token, user_id, png_sticker): def create_new_sticker_set( - token, user_id, name, title, emojis, png_sticker, tgs_sticker, - mask_position=None, webm_sticker=None, sticker_type=None, needs_repainting=None): + token, user_id, name, title, stickers, sticker_format=None, sticker_type=None, needs_repainting=None): method_url = 'createNewStickerSet' - payload = {'user_id': user_id, 'name': name, 'title': title, 'emojis': emojis} - if png_sticker: - stype = 'png_sticker' - elif webm_sticker: - stype = 'webm_sticker' - else: - stype = 'tgs_sticker' - sticker = png_sticker or tgs_sticker or webm_sticker - files = None - if not util.is_string(sticker): - files = {stype: sticker} - else: - payload[stype] = sticker - if mask_position: - payload['mask_position'] = mask_position.to_json() + payload = {'user_id': user_id, 'name': name, 'title': title} if sticker_type: payload['sticker_type'] = sticker_type - if needs_repainting is not None: + if needs_repainting: payload['needs_repainting'] = needs_repainting + if sticker_format: + payload['sticker_format'] = sticker_format + + files = {} + lst = [] + + for sticker in stickers: + json_dict, file = sticker.convert_input_sticker() + json_dict = sticker.to_dict() + + if file: + list_keys = list(file.keys()) + files[list_keys[0]] = file[list_keys[0]] + lst.append(json_dict) + + payload['stickers'] = json.dumps(lst) + + + return _make_request(token, method_url, params=payload, files=files, method='post') diff --git a/telebot/async_telebot.py b/telebot/async_telebot.py index 6bb8b9a..eba6c47 100644 --- a/telebot/async_telebot.py +++ b/telebot/async_telebot.py @@ -5449,14 +5449,16 @@ class AsyncTeleBot: async def create_new_sticker_set( self, user_id: int, name: str, title: str, - emojis: str, + emojis: Optional[str]=None, png_sticker: Union[Any, str]=None, tgs_sticker: Union[Any, str]=None, webm_sticker: Union[Any, str]=None, contains_masks: Optional[bool]=None, sticker_type: Optional[str]=None, mask_position: Optional[types.MaskPosition]=None, - needs_repainting: Optional[bool]=None) -> bool: + needs_repainting: Optional[bool]=None, + stickers: List[types.InputSticker]=None, + sticker_format: Optional[str]=None) -> bool: """ Use this method to create new sticker set owned by a user. The bot will be able to edit the created sticker set. @@ -5464,6 +5466,9 @@ class AsyncTeleBot: Telegram documentation: https://core.telegram.org/bots/api#createnewstickerset + .. note:: + Fields *_sticker are deprecated, pass a list of stickers to stickers parameter instead. + :param user_id: User identifier of created sticker set owner :type user_id: :obj:`int` @@ -5504,17 +5509,37 @@ class AsyncTeleBot: for custom emoji sticker sets only :type needs_repainting: :obj:`bool` + :param stickers: List of stickers to be added to the set + :type stickers: :obj:`list` of :class:`telebot.types.InputSticker` + + :param sticker_format: Format of stickers in the set, must be one of “static”, “animated”, “video” + :type sticker_format: :obj:`str` + :return: On success, True is returned. :rtype: :obj:`bool` """ + if tgs_sticker: + sticker_format = 'animated' + elif webm_sticker: + sticker_format = 'video' + elif png_sticker: + sticker_format = 'static' + if contains_masks is not None: logger.warning('The parameter "contains_masks" is deprecated, use "sticker_type" instead') if sticker_type is None: sticker_type = 'mask' if contains_masks else 'regular' + + if stickers is None: + stickers = png_sticker or tgs_sticker or webm_sticker + if stickers is None: + raise ValueError('You must pass at least one sticker') + stickers = [types.InputSticker(sticker=stickers, emoji_list=emojis, mask_position=mask_position)] + + return await asyncio_helper.create_new_sticker_set( - self.token, user_id, name, title, emojis, png_sticker, tgs_sticker, - mask_position, webm_sticker, sticker_type, needs_repainting) + self.token, user_id, name, title, stickers, sticker_format, sticker_type, needs_repainting) async def add_sticker_to_set( @@ -5563,6 +5588,8 @@ class AsyncTeleBot: # Replaced the parameters png_sticker, tgs_sticker, webm_sticker, emojis and mask_position if sticker is None: sticker = png_sticker or tgs_sticker or webm_sticker + if sticker is None: + raise ValueError('You must pass at least one sticker') sticker = types.InputSticker(sticker, emojis, mask_position) return await asyncio_helper.add_sticker_to_set( diff --git a/telebot/asyncio_helper.py b/telebot/asyncio_helper.py index 850ab5a..7c0a80e 100644 --- a/telebot/asyncio_helper.py +++ b/telebot/asyncio_helper.py @@ -1616,28 +1616,31 @@ async def upload_sticker_file(token, user_id, png_sticker): async def create_new_sticker_set( - token, user_id, name, title, emojis, png_sticker, tgs_sticker, - mask_position=None, webm_sticker=None, sticker_type=None, needs_repainting=None): + token, user_id, name, title, stickers, sticker_format=None, sticker_type=None, needs_repainting=None): method_url = 'createNewStickerSet' - payload = {'user_id': user_id, 'name': name, 'title': title, 'emojis': emojis} - if png_sticker: - stype = 'png_sticker' - elif webm_sticker: - stype = 'webm_sticker' - else: - stype = 'tgs_sticker' - sticker = png_sticker or tgs_sticker or webm_sticker - files = None - if not util.is_string(sticker): - files = {stype: sticker} - else: - payload[stype] = sticker - if mask_position: - payload['mask_position'] = mask_position.to_json() + payload = {'user_id': user_id, 'name': name, 'title': title} if sticker_type: payload['sticker_type'] = sticker_type - if needs_repainting is not None: + if needs_repainting: payload['needs_repainting'] = needs_repainting + if sticker_format: + payload['sticker_format'] = sticker_format + + files = {} + lst = [] + + for sticker in stickers: + json_dict, file = sticker.convert_input_sticker() + json_dict = sticker.to_dict() + + if file: + list_keys = list(file.keys()) + files[list_keys[0]] = file[list_keys[0]] + lst.append(json_dict) + + payload['stickers'] = json.dumps(lst) + + return await _process_request(token, method_url, params=payload, files=files, method='post') diff --git a/telebot/types.py b/telebot/types.py index d789da1..a5e056d 100644 --- a/telebot/types.py +++ b/telebot/types.py @@ -7388,7 +7388,7 @@ class InputSticker(Dictionaryable, JsonSerializable): def to_dict(self) -> dict: json_dict = { 'sticker': self._sticker_dic, - 'emojis': self.emoji_list + 'emoji_list': self.emoji_list } if self.mask_position is not None: