code: def _needed_markup_bot(self):
          
          if not isinstance(self.reply_markup, (
                  types.ReplyInlineMarkup, types.ReplyKeyboardMarkup)):
              return None
  
          for row in self.reply_markup.rows:
              for button in row.buttons:
                  if isinstance(button, types.KeyboardButtonSwitchInline):
                      if button.same_peer:
                          bot = self.input_sender
                          if not bot:
                              raise ValueError('No input sender')
                      else:
                          try:
                              return self._client._entity_cache[self.via_bot_id]
                          except KeyError:
                              raise ValueError('No input sender') from None
docs: Returns the input peer of the bot that's needed for the reply markup.
  
          This is necessary for :tl:`KeyboardButtonSwitchInline` since we need
          to know what bot we want to start. Raises ``ValueError`` if the bot
          cannot be found but is needed. Returns ``None`` if it's not needed.