Survey command stuck on step 0 in SurveyCommand.php

Created on 20 April 2023, over 1 year ago
Updated 2 February 2024, 11 months ago

Problem/Motivation

When using /survey command it only replay first step answer: "Type your name" and then stop responding.
There is the same issue on root project: https://github.com/php-telegram-bot/example-bot/issues/45

Steps to reproduce

Proposed resolution

Remaining tasks

User interface changes

API changes

Data model changes

💬 Support request
Status

Fixed

Version

1.24

Component

Code

Created by

🇦🇿Azerbaijan haver

Live updates comments and jobs are added and updated live.
Sign in to follow issues

Comments & Activities

  • Issue created by @haver
  • 🇷🇺Russia APolitsin

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

    Вот где идёт попытка сохранения состояния:
    https://git.drupalcode.org/project/telega/-/blob/8.x-1.x/src/Utility/Red...

    Так оно подключается в юзер-команду:
    https://git.drupalcode.org/project/telega/-/blob/8.x-1.x/src/Utility/Use...

    Сейчас в модуль добавляется большой кусок функционала по интеграции с chatwoot, поэтому текущий момент быстро поправить не смогу. До майских планирую успеть выкатить новую версию, там и этот момент смогу пофиксить.

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

    services:
      redis:
        class: Drupal\redis\Service\RedisSrvice
    
    
    
    namespace Drupal\redis\Service;
    
    /**
     * GuzzleSrvice service.
     */
    class RedisSrvice {
    
      /**
       * The config factory.
       *
       * @var \Redis
       */
      protected $redis;
    
      /**
       * Constructs a Guzzle.
       */
      public function __construct() {
        $redis = new \Redis();
        $redis->connect('тутадрес сервера', 6379);
        try {
          $redis->auth('пароль');
          if ($redis->ping()) {
            // dsm("PONG: " . $redis->get("foo"));.
          }
          // dsm($redis->keys('*'));.
        }
        catch (\RedisException $e) {
    
        }
        $this->redis = $redis;
      }
    
      /**
       * Get.
       */
      public function get(string $topic) {
        $topic = $this->modifyTopic($topic);
        return $this->redis->get($topic);
      }
    
      /**
       * Get.
       */
      public function multiGet(array $data) {
        $redis = $this->redis->multi();
        foreach ($data as $key => $val) {
          $topic = $this->modifyTopic($val['topic']);
          $redis->get($topic);
        }
        $result = $redis->exec();
        $i = 0;
        foreach ($data as $key => $value) {
          $data[$key]['state'] = $result[$i++];
        }
        return $data;
      }
    
      /**
       * Set.
       */
      public function set(string $topic, string $message) {
        $topic = $this->modifyTopic($topic);
        return $this->redis->set($topic, $message);
      }
    
      /**
       * Set.
       */
      private function modifyTopic(string $topic) : string {
        return str_replace("/", ":", $topic);
      }
    
  • 🇦🇿Azerbaijan haver

    Там для хранения состояния, если отсутствует redis, используется как альтернатива кеш drual:

    if (\Drupal::hasService('redis')) {
          return \Drupal::service('redis')->set($key, $val);
        }
        else {
          \Drupal::cache()->set("telega::$key", $val);
        }
    

    Вопрос кладет ли он состояние в кеш и достает оттуда?

  • @haver opened merge request.
  • 🇦🇿Azerbaijan haver

    А вижу что на dev версии эта проблему уже пофиксили, там сделан рефакторинг кода. На 8.x-1.24 метод getVal() возвращает NULL по дефолту, соответственно информация о состоянии ни на редисе ни на друпал кеше не возвращается.
    Соответственно на деве это поправили и диалог в боте продолжается на следующие стадии как нужно.
    Спасибо.

  • Status changed to Fixed 11 months ago
  • Automatically closed - issue fixed for 2 weeks with no activity.

Production build 0.71.5 2024