Почему мое первое сообщение бота (через REST API) отображается перед моим первым сообщением в ветке?

Я работаю над чат-ботом, который будет возвращать определенную информацию на основе вопроса пользователя. Процесс получения этой информации, скорее всего, займет пару секунд, и я хочу убедиться, что пользователь об этом знает.

Поэтому я использую предложение из этого вопроса о переполнении стека, и вернуть первое сообщение через REST API через сервисный аккаунт.

Второе сообщение бота затем отправляется через обычную реализацию. Я использую шаблон из базового бота здесь, развернутый в Google Cloud App Engine.

Вот фрагмент моего кода:

@app.route("/", methods=["POST"])
def home_post():
    """Respond to POST requests to this endpoint.
    All requests sent to this endpoint from Hangouts Chat are POST
    requests.
    """

    credentials = ServiceAccountCredentials.from_json_keyfile_name(
        "credentials.json", scopes=SCOPES
    )
    http = httplib2.Http()
    chat = discovery.build("chat", "v1", http=credentials.authorize(http))

    event_data = request.get_json()
    thread = event_data["message"]["thread"]

    message = {"text": "Thanks for your question! Let me check :)", "thread": thread}
    chat.spaces().messages().create(
        parent=event_data["space"]["name"], body=message
    ).execute()

    # doing something to find information requested by user

    return json.jsonify({"text": "Here is my answer :)"})

Все работает, как ожидалось, за исключением того, что первое сообщение, пришедшее в чат, помещается перед первоначальным упоминанием бота, после того, как второе сообщение приходит (как видно на записи или скриншоте).

Запись: https://www.loom.com/share/c37472b703184965ad9ee649cb9f17bc

введите описание изображения здесь

Почему это происходит? Что я могу сделать, чтобы порядок остался прежним?

Спасибо!


person Chris    schedule 04.12.2020    source источник
comment
Обратите внимание, что это только в комнатах. Порядок сообщений правильный при отправке сообщений боту непосредственно в личном кабинете.   -  person Chris    schedule 04.12.2020


Ответы (1)


Ваш код запускается onEvent

Таким образом, типы событий:

  • НЕОПРЕДЕЛЕННЫЕ
  • СООБЩЕНИЕ
  • ADDED_TO_SPACE
  • REMOVED_FROM_SPACE
  • CARD_CLICKED

Другими словами:

Простое добавление бота в чат - уже событие, которое побудит его отправить сообщение - даже до того, как бот был упомянут.

Как этого избежать:

Реализуйте условный оператор, который проверяет тип события перед отправкой сообщения.

Образец:

if event_data['type'] == 'MESSAGE':
    message = {"text": "Thanks for your question! Let me check :)", "thread": thread}
    chat.spaces().messages().create(
        parent=event_data["space"]["name"], body=message
    ).execute()
else:
    return

Образец без chat.spaces().messages().create:

if event_data['type'] == 'MESSAGE':
    message = "Thanks for your question! Let me check :)"
else:
    return
return json.jsonify({'text': message})

person ziganotschka    schedule 04.12.2020
comment
Спасибо @ziganotschka за ответ. Обратите внимание, что я уже добавил бота в комнату, прежде чем упомянуть о нем. Тем не менее я отредактировал свой код, включив в него предложенный вами условный оператор для проверки типа события. К сожалению, первое сообщение бота через REST API все еще движется вверх до моего сообщения с упоминанием бота. - person Chris; 04.12.2020
comment
Что, если вместо создания сообщения вы просто вернете его как ответ на событие? Смотрите мой обновленный ответ. - person ziganotschka; 04.12.2020
comment
Спасибо @ziganotschka, но тогда бот отправляет только одно сообщение. Снова рассмотрим мой вариант использования. Я хочу, чтобы бот сначала отправил сообщение, в котором говорится, пожалуйста, подождите моего ответа, затем выполняет некоторую работу, чтобы получить ответ, а затем отправляет этот ответ во втором сообщении. Имеет ли это смысл? - person Chris; 04.12.2020
comment
Можете ли вы проверить время на своем локальном компьютере? Просто чтобы исключить рассинхронизацию между вами и сценарием, который запускает реакцию бота. - person ziganotschka; 04.12.2020
comment
хм, я не совсем уверен, что понимаю, почему время на моей локальной машине может как-то повлиять на это. Обратите внимание, что сценарий развертывается в Google Cloud, и все отметки времени в сообщениях указаны в часовом поясе UTC. Я думаю, что интересно то, что сообщение через REST API сначала находится под упоминанием бота, а затем перемещается вверх после второго сообщения (см. Запись экрана, которую я опубликовал выше). Это действительно странное поведение. - person Chris; 04.12.2020
comment
Я не вижу ничего плохого в вашем коде, поэтому могу только представить, что это связано с настройками времени, например в этом случае. Может быть, вы можете протестировать с другой машины, чтобы избавиться от этой проблемы? - person ziganotschka; 07.12.2020
comment
Спасибо @ziganotschka. То же самое и здесь, не могу понять, что не так. В итоге я удалил первое сообщение прямо перед отправкой второго. Таким образом, пользователь видит сообщение «Пожалуйста, подождите», а затем, когда скрипт завершит работу, ответ, а первое сообщение удаляется. Также поддерживает чистоту чата. В любом случае спасибо за помощь. - person Chris; 07.12.2020
comment
Это хороший обходной путь, я рад, что он у вас заработал! - person ziganotschka; 07.12.2020