def send_audio(self, chat_id, audio,
                 filename='audio',
                 duration=None,
                 performer=None,
                 title=None,
                 reply_to_message_id=None,
                 reply_markup=None,
                 timeout=30):
    method = r'sendAudio'

    payload = {'chat_id': chat_id}
    files = None
    if not is_string(audio):
      files = {'audio': (filename, audio)}
    else:
      payload['audio'] = audio
    if duration:
      payload['duration'] = duration
    if performer:
      payload['performer'] = performer
    if title:
      payload['title'] = title
    if reply_to_message_id:
      payload['reply_to_message_id'] = reply_to_message_id
    # if reply_markup:
    #   payload['reply_markup'] = _convert_markup(reply_markup)

    request = yield _request(self.token, method, 'POST', params=payload, files=files, timeout=timeout)
    returnValue(Message.de_json(request))
  def send_audio(self, chat_id, audio,
                 filename='audio',
                 duration=None,
                 performer=None,
                 title=None,
                 caption=None,
                 reply_to_message_id=None,
                 reply_markup=None,
                 timeout=None):
    method = r'sendAudio'

    payload = {'chat_id': chat_id}
    files = None
    if not is_string(audio):
      files = {'audio': (filename, audio)}
    else:
      payload['audio'] = audio
    if duration:
      payload['duration'] = duration
    if performer:
      payload['performer'] = performer
    if title:
      payload['title'] = title
    if caption:
      payload['caption'] = caption
    if reply_to_message_id:
      payload['reply_to_message_id'] = reply_to_message_id
    if reply_markup:
      payload['reply_markup'] = _convert_markup(reply_markup)

    request = yield self._request(method, 'POST', params=payload, files=files, timeout=timeout)
    returnValue(Message.de_json(request))
  def get_update(self):
    payload = {'timeout': 20, 'offset': self.last_update_id + 1}
    updates = yield _request(self.token, 'getUpdates', params=payload, timeout=25)

    new_messages_ids = set()
    new_messages = []
    for update in updates:
      log.debug("New update. ID: {update_id}", update_id=update['update_id'])
      if update['update_id'] > self.last_update_id:
        self.last_update_id = update['update_id']

      if 'inline_query' in update.keys():
        inline_query = InlineQuery.de_json(update['inline_query'])
        self.process_inline_query(inline_query)
      elif 'chosen_inline_result' in update.keys():
        chosen_inline_result = ChosenInlineResult.de_json(update['chosen_inline_result'])
        self.process_chosen_inline_query(chosen_inline_result)
      elif 'message' in update.keys():
        msg = Message.de_json(update['message'])
        msg.bot_name = self.name
        if not msg.from_user.id in new_messages_ids:
          new_messages.append(msg)
          new_messages_ids.add(msg.from_user.id)
      elif 'callback_query' in update.keys():
        callback_query = CallbackQuery.de_json(update['callback_query'])
        self.process_callback_query(callback_query)
      else:
        log.debug("Unknown update type: {update}",
                  update=json.dumps(update, skipkeys=True, ensure_ascii=False, default=lambda o: o.__dict__))

    if len(new_messages) > 0:
      self.process_new_messages(new_messages)
  def get_update(self, telegram_timeout=10, timeout=None, limit=100):
    payload = {'timeout': telegram_timeout, 'offset': self.last_update_id + 1, 'limit': limit}
    if self.allowed_updates:
      payload['allowed_updates'] = self.allowed_updates
    updates = yield self._request('getUpdates', params=payload, timeout=timeout)

    if self.on_updated_listener:
      self.on_updated_listener(updates)

    max_update_id = -1
    inline_queries = []
    chosen_inline_results = []
    callback_queries = []
    channel_posts = []
    messages = []

    for update in updates:
      if self._noisy:
        log.debug("New update. ID: {update_id}", update_id=update['update_id'])
      self._notify_update_prehandlers(update)

      if 'inline_query' in update:
        inline_queries.append(InlineQuery.de_json(update['inline_query']))
      elif 'chosen_inline_result' in update:
        chosen_inline_results.append(ChosenInlineResult.de_json(update['chosen_inline_result']))
      elif 'callback_query' in update:
        callback_queries.append(CallbackQuery.de_json(update['callback_query']))
      elif 'channel_post' in update:
        channel_posts.append(ChannelPost(Message.de_json(update['channel_post'])))
      elif 'message' in update:
        msg = Message.de_json(update['message'])
        msg.bot_name = self.name  # FIXME: a hack
        messages.append(msg)
      else:
        log.debug("Unsupported update type: {update}",
                  update=json.dumps(update, skipkeys=True, ensure_ascii=False, default=lambda o: o.__dict__))

      if update['update_id'] > max_update_id:
        max_update_id = update['update_id']

    yield self.process_updates(inline_queries, chosen_inline_results, callback_queries, channel_posts, messages)

    self.last_update_id = max_update_id
  def edit_message_text(self, chat_id, message_id, text,
                        parse_mode=None,
                        disable_web_page_preview=None,
                        reply_markup=None):
    method = r'editMessageText'

    payload = {'chat_id': str(chat_id), 'message_id': str(message_id), 'text': text}
    if disable_web_page_preview:
      payload['disable_web_page_preview'] = disable_web_page_preview
    if reply_markup:
      if isinstance(reply_markup, JsonSerializable):
        payload['reply_markup'] = reply_markup.to_json()
      elif isinstance(reply_markup, dict):
        payload['reply_markup'] = json.dumps(reply_markup)
    if parse_mode:
      payload['parse_mode'] = parse_mode
    request = yield self._request(method, 'POST', params=payload)
    returnValue(Message.de_json(request))
  def send_message(self, chat_id, text,
                   disable_web_page_preview=None,
                   reply_to_message_id=None,
                   reply_markup=None,
                   parse_mode=None):
    method = r'sendMessage'

    payload = {'chat_id': str(chat_id), 'text': text}
    if disable_web_page_preview:
      payload['disable_web_page_preview'] = disable_web_page_preview
    if reply_to_message_id:
      payload['reply_to_message_id'] = reply_to_message_id
    if reply_markup:
      payload['reply_markup'] = _convert_markup(reply_markup)
    if parse_mode:
      payload['parse_mode'] = parse_mode
    request = yield self._request(method, 'POST', params=payload)
    returnValue(Message.de_json(request))
  def edit_message_text(self, chat_id, message_id, text,
                        parse_mode=None,
                        disable_web_page_preview=None,
                        reply_markup=None):
    method = r'editMessageText'

    payload = {'chat_id': str(chat_id), 'message_id': str(message_id), 'text': text}
    if disable_web_page_preview:
      payload['disable_web_page_preview'] = disable_web_page_preview
    if reply_markup:
      if isinstance(reply_markup, JsonSerializable):
        payload['reply_markup'] = reply_markup.to_json()
      elif isinstance(reply_markup, dict):
        payload['reply_markup'] = json.dumps(reply_markup)
    if parse_mode:
      payload['parse_mode'] = parse_mode
    request = yield _request(self.token, method, 'POST', params=payload)
    returnValue(Message.de_json(request))