Очень часто встречаю жалобы, что кнопки в тлг не отображают реальное состояние, вообще во всех примерах не учитывается два нюанса:
1. кеширование
2. асинхронный вызов через метод свич
п.с. светом так тоже можно управлять и не только :(
На вкладке "Команды" создаем команду с таким кодом:
$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);`
На вкладке "События" создаем каллбек с таким кодом (и тут учитываем нюансы):
//определили в условии срабатывание нужного каллбека
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);
}
п.с. тут не рассмотрены возможности самих групп (вариаций масса)!
Нижний Тагил, Россия
На форуме: Logrus