Logrus

 
<<< Back

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

Очень часто встречаю жалобы, что кнопки в тлг не отображают реальное состояние, вообще во всех примерах не учитывается два нюанса:
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

Discuss (0) (13)

See also:
2021-01-10 DROP_TABLE
2020-05-07 Телеграмм. Полезное
2019-06-29 Телеграмм. Меню - запуск скриптов (сценариев)
2018-10-21 Настройки громкости
2018-10-07 Примеры кода
2018-09-25 Телеграмм. pChart
2018-05-02 Класс SOpenClose метод logicAction (по-русски "Входная дверь")
2018-04-05 Шаблон отображения в классе "Users"
2018-12-02 Режим "Никого нет дома"

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

На форуме: Logrus