Logrus

<<< Назад

Телеграмм. Меню - управление группами ПУ

Очень часто встречаю жалобы, что кнопки в тлг не отображают реальное состояние, вообще во всех примерах не учитывается два нюанса:
1. кеширование
2. асинхронный вызов через метод свич

п.с. светом так тоже можно управлять и не только :(

1
На вкладке "Команды" создаем команду с таким кодом:

$off = hex2bin('F09F8C91');
$on = hex2bin('F09F8C95');

$objects = getObjectsByClass('SGroups');
foreach($objects as $obj) {
 //выводим только те у кого нет единицы в свойстве hide
 if (gg($obj['TITLE'] . '.hide') != 1) {
  //задаем состояние значка вкл. или откл.
  if (gg($obj['TITLE'] . '.status')) {
   $state = $on;
  } else {
   $state = $off;
  }
  //формируем массив кнопок с их состоянием
  $option[] = $this->buildInlineKeyboardButton($state . ' ' . getObject($obj['TITLE'])->description, '', 'CallbackGroup_' . $obj['TITLE'], '');
 }
}

$count_row = 3;
$option = array_chunk($option, $count_row);
$keyb = $this->buildInlineKeyBoard($option);

$content = array('chat_id' => $chat_id, 'text' => 'Управление группами:', 'reply_markup' => $keyb, 'parse_mode' => 'HTML');
$this->sendContent($content);`

2
На вкладке "События" создаем каллбек с таким кодом (и тут учитываем нюансы):

//определили в условии срабатывание нужного каллбека
if (strpos($callback, 'CallbackGroup_') !== false) {

 $off = hex2bin('F09F8C91');
 $on = hex2bin('F09F8C95');

 //определили имя объекта из переданного параметра при нажатии определенной кнопки (14 = CallbackGroup_)
 $obj = substr($callback, 14);
 //DebMes(print_r($obj, true));
 $text = getObject($obj)->description;
 //запрашиваем состояние этого объекта (без кеширования - нюанс №1) и меняем на противоположное (через методы turnOff или turnOn  - нюанс №2)
 if (getobject($obj)->getProperty('status')) {
  $text .= ' выключен ' . $off;
  cm($obj . '.turnOff');
 } else {
  $text .= ' включен ' . $on;
  cm($obj . '.turnOn');
 }
 //выводим всплывающее сообщение с выполненным действием
 $this->sendAnswerCallbackQuery($callback_id, $text, false);

 $objects = getObjectsByClass('SGroups');
 foreach($objects as $obj) {
  if (gg($obj['TITLE'] . '.hide') != 1) {
   if (gg($obj['TITLE'] . '.status')) {
    $state = $on;
   } else {
    $state = $off;
   }
   //формируем заново клавиатуру с текущим состоянием объектов и настройками кнопок
   $option[] = $this->buildInlineKeyboardButton($state . ' ' . getObject($obj['TITLE'])->description, '', 'CallbackGroup_' . $obj['TITLE'], '');
  }
 }

 //обновляем результат
 $count_row = 3;
 $option = array_chunk($option, $count_row);
 $keyb = $this->buildInlineKeyBoard($option);
 $this->editMessage($chat_id, $message_id, 'Группы:', $keyb);
}

п.с. тут не рассмотрены возможности самих групп (вариаций масса)!
3

Обсуждение (0) (6)

Смотрите так же:
29.06.2019 Телеграмм. Меню - запуск скриптов (сценариев)
21.10.2018 Настройки громкости
07.10.2018 Примеры кода
29.09.2018 checkState
25.09.2018 pChart
24.09.2018 Уход за базой данных
05.08.2018 Управление подсветкой на шлюзе Сяоми
21.06.2018 Каталог ссылок
10.06.2018 Меню
08.07.2018 mail()
04.05.2018 Режим "EnergyTariffMode"
02.05.2018 Класс SOpenClose метод logicAction (по-русски "Входная дверь")
22.04.2018 Программы
19.04.2018 Пользовательские функции
11.04.2018 Шаблон отображения в классе "ExchangeRates"
05.04.2018 Шаблон отображения в классе "Users"
02.12.2018 Режим "Никого нет дома"
25.02.2018 Бэкап и обслуживание системы

Нижний Тагил, Россия

На форуме: Logrus