Queer European MD passionate about IT
Browse Source

Compliance with bot API 7.2

- Included python version in `/version` command
- Added the parameter `business_connection_id` to the methods sendMessage, sendPhoto, sendVideo, sendAnimation, sendAudio, sendDocument, sendSticker, sendVideoNote, sendVoice, sendLocation, sendVenue, sendContact, sendPoll, sendDice, sendGame, and sendMediaGroup, sendChatAction.
- Moved the parameter `format` to Sticker instead of StickerSet (and related methods)
Davte 2 weeks ago
parent
commit
6b489363de
3 changed files with 156 additions and 82 deletions
  1. 1 1
      davtelepot/__init__.py
  2. 76 74
      davtelepot/administration_tools.py
  3. 79 7
      davtelepot/api.py

+ 1 - 1
davtelepot/__init__.py

@@ -11,7 +11,7 @@ __author__ = "Davide Testa"
 __email__ = "davide@davte.it"
 __credits__ = ["Marco Origlia", "Nick Lee @Nickoala"]
 __license__ = "GNU General Public License v3.0"
-__version__ = "2.10.1"
+__version__ = "2.10.2"
 __maintainer__ = "Davide Testa"
 __contact__ = "t.me/davte"
 

+ 76 - 74
davtelepot/administration_tools.py

@@ -13,6 +13,7 @@ import asyncio
 import datetime
 import json
 import logging
+import platform
 import re
 import types
 
@@ -223,9 +224,9 @@ def get_talk_panel(bot: Bot,
     return text, reply_markup
 
 
-async def _talk_command(bot: Bot,
-                        update,
-                        user_record):
+async def talk_command(bot: Bot,
+                       update,
+                       user_record):
     text = get_cleaned_text(
         update,
         bot,
@@ -343,17 +344,17 @@ async def end_session(bot: Bot,
     return
 
 
-async def _talk_button(bot: Bot,
-                       update,
-                       user_record,
-                       data):
+async def talk_button(bot: Bot,
+                      update,
+                      user_record,
+                      data):
     telegram_id = user_record['telegram_id']
     command, *arguments = data
     result, text, reply_markup = '', '', None
     if command == 'search':
         bot.set_individual_text_message_handler(
             await async_wrapper(
-                _talk_command,
+                talk_command,
             ),
             update
         )
@@ -426,7 +427,7 @@ async def _talk_button(bot: Bot,
     return result
 
 
-async def _restart_command(bot: Bot,
+async def restart_command(bot: Bot,
                            update,
                            user_record):
     with bot.db as db:
@@ -453,7 +454,7 @@ async def _restart_command(bot: Bot,
     return
 
 
-async def _stop_command(bot: Bot,
+async def stop_command(bot: Bot,
                         update,
                         user_record):
     text = bot.get_message(
@@ -495,10 +496,10 @@ async def stop_bots(bot: Bot):
     return
 
 
-async def _stop_button(bot: Bot,
-                       update,
-                       user_record,
-                       data: List[Union[int, str]]):
+async def stop_button(bot: Bot,
+                      update,
+                      user_record,
+                      data: List[Union[int, str]]):
     result, text, reply_markup = '', '', None
     telegram_id = user_record['telegram_id']
     command = data[0] if len(data) > 0 else 'None'
@@ -535,7 +536,7 @@ async def _stop_button(bot: Bot,
     return result
 
 
-async def _send_bot_database(bot: Bot, user_record: OrderedDict, language: str):
+async def send_bot_database(bot: Bot, user_record: OrderedDict, language: str):
     if not all(
             [
                 bot.db_url.endswith('.db'),
@@ -562,7 +563,7 @@ async def _send_bot_database(bot: Bot, user_record: OrderedDict, language: str):
     )
 
 
-async def _query_command(bot, update, user_record):
+async def query_command(bot, update, user_record):
     query = get_cleaned_text(
         update,
         bot,
@@ -640,7 +641,7 @@ async def _query_command(bot, update, user_record):
     )
 
 
-async def _query_button(bot, update, user_record, data):
+async def query_button(bot, update, user_record, data):
     result, text, reply_markup = '', '', None
     command = data[0] if len(data) else 'default'
     error_message = bot.get_message(
@@ -677,7 +678,7 @@ async def _query_button(bot, update, user_record, data):
     return result
 
 
-async def _log_command(bot, update, user_record):
+async def log_command(bot, update, user_record):
     if bot.log_file_path is None:
         return bot.get_message(
             'admin', 'log_command', 'no_log',
@@ -730,7 +731,7 @@ async def _log_command(bot, update, user_record):
     return
 
 
-async def _errors_command(bot, update, user_record):
+async def errors_command(bot, update, user_record):
     # Always send errors log file in private chat
     chat_id = update['from']['id']
     if bot.errors_file_path is None:
@@ -774,7 +775,7 @@ async def _errors_command(bot, update, user_record):
     return
 
 
-async def _maintenance_command(bot, update, user_record):
+async def maintenance_command(bot, update, user_record):
     maintenance_message = get_cleaned_text(update, bot, ['maintenance'])
     if maintenance_message.startswith('{'):
         maintenance_message = json.loads(maintenance_message)
@@ -883,14 +884,15 @@ async def get_new_versions(bot: Bot,
     return news
 
 
-async def _version_command(bot: Bot, update: dict,
-                           user_record: OrderedDict, language: str):
+async def version_command(bot: Bot, update: dict,
+                          user_record: OrderedDict, language: str):
     last_commit = await get_last_commit()
     text = bot.get_message(
         'admin', 'version_command', 'header',
         last_commit=last_commit,
         update=update, user_record=user_record
     ) + '\n\n'
+    text += f'<b>Python: </b> <code>{platform.python_version()}</code>\n'
     text += '\n'.join(
         f"<b>{package.__name__}</b>: "
         f"<code>{package.__version__}</code>"
@@ -1032,7 +1034,7 @@ async def get_package_updates(bot: Bot,
         await asyncio.sleep(monitoring_interval)
 
 
-async def _send_start_messages(bot: Bot):
+async def send_start_messages(bot: Bot):
     """Send restart messages at restart."""
     for restart_message in bot.db['restart_messages'].find(sent=None):
         asyncio.ensure_future(
@@ -1060,7 +1062,7 @@ async def _send_start_messages(bot: Bot):
     return
 
 
-async def _load_talking_sessions(bot: Bot):
+async def load_talking_sessions(bot: Bot):
     sessions = []
     for session in bot.db.query(
             """SELECT *
@@ -1139,7 +1141,7 @@ def get_custom_commands(bot: Bot, language: str = None) -> List[dict]:
     )
 
 
-async def _father_command(bot, language):
+async def father_command(bot, language):
     modes = [
         {
             key: (
@@ -1443,12 +1445,12 @@ async def edit_bot_father_settings_via_message(bot: Bot,
     return result, text, reply_markup
 
 
-async def _father_button(bot: Bot, user_record: OrderedDict,
+async def father_button(bot: Bot, user_record: OrderedDict,
                          language: str, data: list):
     """Handle BotFather button.
 
     Operational modes
-    - main: back to main page (see _father_command)
+    - main: back to main page (see `father_command`)
     - get: show commands stored by @BotFather
     - set: edit commands stored by @BotFather
     """
@@ -1542,7 +1544,7 @@ async def _father_button(bot: Bot, user_record: OrderedDict,
     elif command == 'main':
         return dict(
             text='',
-            edit=(await _father_command(bot=bot, language=language))
+            edit=(await father_command(bot=bot, language=language))
         )
     elif command == 'set':
         stored_commands = await bot.getMyCommands()
@@ -1810,8 +1812,8 @@ async def _father_button(bot: Bot, user_record: OrderedDict,
     return result
 
 
-async def _config_command(bot: Bot, update: dict,
-                          user_record: dict, language: str):
+async def config_command(bot: Bot, update: dict,
+                         user_record: dict, language: str):
     text = get_cleaned_text(
         update,
         bot,
@@ -1907,16 +1909,16 @@ def init(telegram_bot: Bot,
 
     # Tasks to complete before starting bot
     @telegram_bot.additional_task(when='BEFORE')
-    async def load_talking_sessions():
-        return await _load_talking_sessions(bot=telegram_bot)
+    async def _load_talking_sessions():
+        return await load_talking_sessions(bot=telegram_bot)
 
     @telegram_bot.additional_task(when='BEFORE', bot=telegram_bot)
     async def notify_version(bot):
         return await notify_new_version(bot=bot)
 
     @telegram_bot.additional_task('BEFORE')
-    async def send_restart_messages():
-        return await _send_start_messages(bot=telegram_bot)
+    async def _send_start_messages():
+        return await send_start_messages(bot=telegram_bot)
 
     # Administration commands
     @telegram_bot.command(command='/db',
@@ -1925,10 +1927,10 @@ def init(telegram_bot: Bot,
                           description=admin_messages[
                               'db_command']['description'],
                           authorization_level='admin')
-    async def send_bot_database(bot, user_record, language):
-        return await _send_bot_database(bot=bot,
-                                        user_record=user_record,
-                                        language=language)
+    async def _send_bot_database(bot, user_record, language):
+        return await send_bot_database(bot=bot,
+                                       user_record=user_record,
+                                       language=language)
 
     @telegram_bot.command(command='/errors',
                           aliases=[],
@@ -1936,8 +1938,8 @@ def init(telegram_bot: Bot,
                           description=admin_messages[
                               'errors_command']['description'],
                           authorization_level='admin')
-    async def errors_command(bot, update, user_record):
-        return await _errors_command(bot, update, user_record)
+    async def _errors_command(bot, update, user_record):
+        return await errors_command(bot, update, user_record)
 
     @telegram_bot.command(command='/father',
                           aliases=[],
@@ -1948,14 +1950,14 @@ def init(telegram_bot: Bot,
                               if key in ('description', )
                           },
                           authorization_level='admin')
-    async def father_command(bot, language):
-        return await _father_command(bot=bot, language=language)
+    async def _father_command(bot, language):
+        return await father_command(bot=bot, language=language)
 
     @telegram_bot.button(prefix='father:///',
                          separator='|',
                          authorization_level='admin')
-    async def query_button(bot, user_record, language, data):
-        return await _father_button(bot=bot,
+    async def _father_button(bot, user_record, language, data):
+        return await father_button(bot=bot,
                                     user_record=user_record,
                                     language=language,
                                     data=data)
@@ -1966,16 +1968,16 @@ def init(telegram_bot: Bot,
                           description=admin_messages[
                               'log_command']['description'],
                           authorization_level='admin')
-    async def log_command(bot, update, user_record):
-        return await _log_command(bot, update, user_record)
+    async def _log_command(bot, update, user_record):
+        return await log_command(bot, update, user_record)
 
     @telegram_bot.command(command='/maintenance', aliases=[],
                           show_in_keyboard=False,
                           description=admin_messages[
                               'maintenance_command']['description'],
                           authorization_level='admin')
-    async def maintenance_command(bot, update, user_record):
-        return await _maintenance_command(bot, update, user_record)
+    async def _maintenance_command(bot, update, user_record):
+        return await maintenance_command(bot, update, user_record)
 
     @telegram_bot.command(command='/query',
                           aliases=[],
@@ -1983,16 +1985,16 @@ def init(telegram_bot: Bot,
                           description=admin_messages[
                               'query_command']['description'],
                           authorization_level='admin')
-    async def query_command(bot, update, user_record):
-        return await _query_command(bot, update, user_record)
+    async def _query_command(bot, update, user_record):
+        return await query_command(bot, update, user_record)
 
     @telegram_bot.button(prefix='db_query:///',
                          separator='|',
                          description=admin_messages[
                              'query_command']['description'],
                          authorization_level='admin')
-    async def query_button(bot, update, user_record, data):
-        return await _query_button(bot, update, user_record, data)
+    async def _query_button(bot, update, user_record, data):
+        return await query_button(bot, update, user_record, data)
 
     @telegram_bot.command(command='/restart',
                           aliases=[],
@@ -2000,8 +2002,8 @@ def init(telegram_bot: Bot,
                           description=admin_messages[
                               'restart_command']['description'],
                           authorization_level='admin')
-    async def restart_command(bot, update, user_record):
-        return await _restart_command(bot, update, user_record)
+    async def _restart_command(bot, update, user_record):
+        return await restart_command(bot, update, user_record)
 
     @telegram_bot.command(command='/select',
                           aliases=[],
@@ -2009,8 +2011,8 @@ def init(telegram_bot: Bot,
                           description=admin_messages[
                               'select_command']['description'],
                           authorization_level='admin')
-    async def select_command(bot, update, user_record):
-        return await _query_command(bot, update, user_record)
+    async def _select_command(bot, update, user_record):
+        return await query_command(bot, update, user_record)
 
     @telegram_bot.command(command='/stop',
                           aliases=[],
@@ -2018,16 +2020,16 @@ def init(telegram_bot: Bot,
                           description=admin_messages[
                               'stop_command']['description'],
                           authorization_level='admin')
-    async def stop_command(bot, update, user_record):
-        return await _stop_command(bot, update, user_record)
+    async def _stop_command(bot, update, user_record):
+        return await stop_command(bot, update, user_record)
 
     @telegram_bot.button(prefix='stop:///',
                          separator='|',
                          description=admin_messages[
                              'stop_command']['description'],
                          authorization_level='admin')
-    async def stop_button(bot, update, user_record, data):
-        return await _stop_button(bot, update, user_record, data)
+    async def _stop_button(bot, update, user_record, data):
+        return await stop_button(bot, update, user_record, data)
 
     @telegram_bot.command(command='/talk',
                           aliases=[],
@@ -2035,14 +2037,14 @@ def init(telegram_bot: Bot,
                           description=admin_messages[
                               'talk_command']['description'],
                           authorization_level='admin')
-    async def talk_command(bot, update, user_record):
-        return await _talk_command(bot, update, user_record)
+    async def _talk_command(bot, update, user_record):
+        return await talk_command(bot, update, user_record)
 
     @telegram_bot.button(prefix='talk:///',
                          separator='|',
                          authorization_level='admin')
-    async def talk_button(bot, update, user_record, data):
-        return await _talk_button(bot, update, user_record, data)
+    async def _talk_button(bot, update, user_record, data):
+        return await talk_button(bot, update, user_record, data)
 
     @telegram_bot.command(command='/version',
                           aliases=[],
@@ -2053,11 +2055,11 @@ def init(telegram_bot: Bot,
                              },
                           show_in_keyboard=False,
                           authorization_level='admin')
-    async def version_command(bot, update, user_record, language):
-        return await _version_command(bot=bot,
-                                      update=update,
-                                      user_record=user_record,
-                                      language=language)
+    async def _version_command(bot, update, user_record, language):
+        return await version_command(bot=bot,
+                                     update=update,
+                                     user_record=user_record,
+                                     language=language)
 
     @telegram_bot.command(command='/config',
                           aliases=[],
@@ -2068,8 +2070,8 @@ def init(telegram_bot: Bot,
                              },
                           show_in_keyboard=False,
                           authorization_level='admin')
-    async def config_command(bot, update, user_record, language):
-        return await _config_command(bot=bot,
-                                     update=update,
-                                     user_record=user_record,
-                                     language=language)
+    async def _config_command(bot, update, user_record, language):
+        return await config_command(bot=bot,
+                                    update=update,
+                                    user_record=user_record,
+                                    language=language)

+ 79 - 7
davtelepot/api.py

@@ -305,7 +305,8 @@ class MaskPosition(dict):
 class InputSticker(dict):
     """This object describes a sticker to be added to a sticker set."""
 
-    def __init__(self, sticker: Union[str, dict, IO], emoji_list: List[str],
+    def __init__(self, sticker: Union[str, dict, IO], format_: str,
+                 emoji_list: List[str],
                  mask_position: Union['MaskPosition', None] = None,
                  keywords: Union[List[str], None] = None):
         """This object describes a sticker to be added to a sticker set.
@@ -318,6 +319,9 @@ class InputSticker(dict):
             multipart/form-data under <file_attach_name> name.
             Animated and video stickers can't be uploaded via HTTP URL.
             More information on Sending Files: https://core.telegram.org/bots/api#sending-files
+        @param format_: Format of the added sticker, must be one of “static”
+            for a .WEBP or .PNG image, “animated” for a .TGS animation,
+            “video” for a WEBM video
         @param emoji_list: List of 1-20 emoji associated with the sticker
         @param mask_position: Optional. Position where the mask should be
             placed on faces. For “mask” stickers only.
@@ -327,6 +331,10 @@ class InputSticker(dict):
         """
         super().__init__(self)
         self['sticker'] = sticker
+        if format_ not in ("static", "animated", "video"):
+            logging.error(f"Invalid format `{format_}")
+        else:
+            self['format'] = format_
         self['emoji_list'] = emoji_list
         self['mask_position'] = mask_position
         self['keywords'] = keywords
@@ -449,6 +457,16 @@ def handle_deprecated_reply_parameters(parameters: dict,
     return parameters
 
 
+def handle_forbidden_names_for_parameters(parameters: dict,
+                                          kwargs: dict):
+    if 'format' in kwargs:
+        parameters['format'] = kwargs['format']
+    if 'format_' in parameters:
+        parameters['format'] = parameters['format_']
+        del parameters['format_']
+    return parameters
+
+
 # This class needs to mirror Telegram API, so camelCase method are needed
 # noinspection PyPep8Naming
 class TelegramBot:
@@ -646,7 +664,8 @@ class TelegramBot:
                            sticker: Union[dict, str, IO],
                            emoji_list: Union[List[str], str],
                            mask_position: Union[MaskPosition, None] = None,
-                           keywords: Union[List[str], None] = None) -> InputSticker:
+                           keywords: Union[List[str], None] = None,
+                           format_: str = 'static') -> InputSticker:
         if isinstance(emoji_list, str):
             emoji_list = [c for c in emoji_list]
         if isinstance(keywords, str):
@@ -654,7 +673,8 @@ class TelegramBot:
         if isinstance(sticker, str) and os.path.isfile(sticker):
             sticker = self.prepare_file_object(sticker)
         return InputSticker(sticker=sticker, emoji_list=emoji_list,
-                            mask_position=mask_position, keywords=keywords)
+                            mask_position=mask_position, keywords=keywords,
+                            format_=format_)
 
     async def prevent_flooding(self, chat_id):
         """Await until request may be sent safely.
@@ -855,6 +875,7 @@ class TelegramBot:
 
     async def sendMessage(self, chat_id: Union[int, str],
                           text: str,
+                          business_connection_id: str = None,
                           message_thread_id: int = None,
                           parse_mode: str = None,
                           entities: List[dict] = None,
@@ -897,6 +918,7 @@ class TelegramBot:
         )
 
     async def sendPhoto(self, chat_id: Union[int, str], photo,
+                        business_connection_id: str = None,
                         caption: str = None,
                         parse_mode: str = None,
                         caption_entities: List[dict] = None,
@@ -921,6 +943,7 @@ class TelegramBot:
         )
 
     async def sendAudio(self, chat_id: Union[int, str], audio,
+                        business_connection_id: str = None,
                         caption: str = None,
                         parse_mode: str = None,
                         caption_entities: List[dict] = None,
@@ -953,6 +976,7 @@ class TelegramBot:
         )
 
     async def sendDocument(self, chat_id: Union[int, str], document,
+                           business_connection_id: str = None,
                            thumbnail=None,
                            caption: str = None,
                            parse_mode: str = None,
@@ -983,6 +1007,7 @@ class TelegramBot:
         )
 
     async def sendVideo(self, chat_id: Union[int, str], video,
+                        business_connection_id: str = None,
                         duration: int = None,
                         width: int = None,
                         height: int = None,
@@ -1017,6 +1042,7 @@ class TelegramBot:
         )
 
     async def sendAnimation(self, chat_id: Union[int, str], animation,
+                            business_connection_id: str = None,
                             duration: int = None,
                             width: int = None,
                             height: int = None,
@@ -1050,6 +1076,7 @@ class TelegramBot:
         )
 
     async def sendVoice(self, chat_id: Union[int, str], voice,
+                        business_connection_id: str = None,
                         caption: str = None,
                         parse_mode: str = None,
                         caption_entities: List[dict] = None,
@@ -1075,6 +1102,7 @@ class TelegramBot:
         )
 
     async def sendVideoNote(self, chat_id: Union[int, str], video_note,
+                            business_connection_id: str = None,
                             duration: int = None,
                             length: int = None,
                             thumbnail=None,
@@ -1103,6 +1131,7 @@ class TelegramBot:
         )
 
     async def sendMediaGroup(self, chat_id: Union[int, str], media: list,
+                             business_connection_id: str = None,
                              disable_notification: bool = None,
                              message_thread_id: int = None,
                              protect_content: bool = None,
@@ -1125,6 +1154,7 @@ class TelegramBot:
 
     async def sendLocation(self, chat_id: Union[int, str],
                            latitude: float, longitude: float,
+                           business_connection_id: str = None,
                            horizontal_accuracy: float = None,
                            live_period=None,
                            heading: int = None,
@@ -1207,6 +1237,7 @@ class TelegramBot:
     async def sendVenue(self, chat_id: Union[int, str],
                         latitude: float, longitude: float,
                         title: str, address: str,
+                        business_connection_id: str = None,
                         foursquare_id: str = None,
                         foursquare_type: str = None,
                         google_place_id: str = None,
@@ -1234,6 +1265,7 @@ class TelegramBot:
     async def sendContact(self, chat_id: Union[int, str],
                           phone_number: str,
                           first_name: str,
+                          business_connection_id: str = None,
                           last_name: str = None,
                           vcard: str = None,
                           disable_notification: bool = None,
@@ -1259,6 +1291,7 @@ class TelegramBot:
                        chat_id: Union[int, str],
                        question: str,
                        options: List[str],
+                       business_connection_id: str = None,
                        is_anonymous: bool = True,
                        type_: str = 'regular',
                        allows_multiple_answers: bool = False,
@@ -1308,6 +1341,7 @@ class TelegramBot:
         )
 
     async def sendChatAction(self, chat_id: Union[int, str], action,
+                             business_connection_id: str = None,
                              message_thread_id: int = None):
         """Fake a typing status or similar.
 
@@ -1776,6 +1810,7 @@ class TelegramBot:
 
     async def sendSticker(self, chat_id: Union[int, str],
                           sticker: Union[str, dict, IO],
+                          business_connection_id: str = None,
                           disable_notification: bool = None,
                           message_thread_id: int = None,
                           protect_content: bool = None,
@@ -1850,7 +1885,6 @@ class TelegramBot:
 
     async def createNewStickerSet(self, user_id: int, name: str, title: str,
                                   stickers: List['InputSticker'],
-                                  sticker_format: str = 'static',
                                   sticker_type: str = 'regular',
                                   needs_repainting: bool = False,
                                   **kwargs):
@@ -1862,6 +1896,10 @@ class TelegramBot:
         """
         if stickers is None:
             stickers = []
+        if 'sticker_format' in kwargs:
+            logging.error("Parameter `sticker_format` of method "
+                          "`createNewStickerSet` has been deprecated. "
+                          "Use `format` parameter of class `InputSticker` instead.")
         if 'contains_masks' in kwargs:
             logging.error("Parameter `contains_masks` of method "
                           "`createNewStickerSet` has been deprecated. "
@@ -2070,6 +2108,7 @@ class TelegramBot:
         )
 
     async def sendGame(self, chat_id: Union[int, str], game_short_name,
+                       business_connection_id: str = None,
                        message_thread_id: int = None,
                        protect_content: bool = None,
                        disable_notification: bool = None,
@@ -2133,7 +2172,8 @@ class TelegramBot:
         )
 
     async def sendDice(self,
-                       chat_id: Union[int, str] = None,
+                       chat_id: Union[int, str],
+                       business_connection_id: str = None,
                        emoji: str = None,
                        disable_notification: bool = None,
                        message_thread_id: int = None,
@@ -2843,7 +2883,10 @@ class TelegramBot:
             parameters=locals()
         )
 
-    async def setStickerSetThumbnail(self, name: str, user_id: int, thumbnail: 'InputFile or String'):
+    async def setStickerSetThumbnail(self, name: str, user_id: int,
+                                     format_: str,
+                                     thumbnail: 'InputFile or String',
+                                     **kwargs):
         """Set the thumbnail of a regular or mask sticker set.
 
         The format of the thumbnail file must match the format of the stickers
@@ -2851,9 +2894,13 @@ class TelegramBot:
         Returns True on success.
         See https://core.telegram.org/bots/api#setstickersetthumbnail for details.
         """
+        parameters = handle_forbidden_names_for_parameters(
+            parameters=locals().copy(),
+            kwargs=kwargs
+        )
         return await self.api_request(
             'setStickerSetThumbnail',
-            parameters=locals()
+            parameters=parameters
         )
 
     async def setCustomEmojiStickerSetThumbnail(self, name: str, custom_emoji_id: str):
@@ -2966,3 +3013,28 @@ class TelegramBot:
             'setMessageReaction',
             parameters=locals()
         )
+
+    async def getBusinessConnection(self, business_connection_id: str):
+        """Get information about the connection of the bot with a business account.
+
+        Returns a BusinessConnection object on success.
+        See https://core.telegram.org/bots/api#getbusinessconnection for details.
+        """
+        return await self.api_request(
+            'getBusinessConnection',
+            parameters=locals()
+        )
+
+    async def replaceStickerInSet(self, user_id: int, name: str,
+                                  old_sticker: str, sticker: 'InputSticker'):
+        """Replace an existing sticker in a sticker set with a new one.
+
+        The method is equivalent to calling deleteStickerFromSet, then
+            addStickerToSet, then setStickerPositionInSet.
+        Returns True on success.
+        See https://core.telegram.org/bots/api#replacestickerinset for details.
+        """
+        return await self.api_request(
+            'replaceStickerInSet',
+            parameters=locals()
+        )