Подключаем бота телеграм к блокчейну, урок 2
В прошлом уроке я показал как создать бота и загрузить его на сервер.
Если вы пропустили - вот предыдущий урок и сам бот.
Мы научили бота здороваться. Теперь давайте научим его показывать информацию о пользователях Голоса.
Сделаем всё максимально просто - мы пишем боту ник, начиная с @ и получаем в ответ информацию о пользователе, если он найден.
Немного исправим функцию getUserRequest. Функционал приветствия вынесем в отдельную функцию commIsHello.
Листинг commIsHello
function commIsHello($text) {
$hello = array();
$hello[] = 'привет';
$hello[] = 'хай';
$hello[] = 'здорова';
$hello[] = 'здравствуйте';
$hello[] = 'здрасьте';
$hello[] = 'йо';
$bot_hello = array();
$bot_hello[] = 'И тебе привет';
$bot_hello[] = 'Привет от голоса';
$bot_hello[] = 'Доброго времени суток';
$bot_hello[] = 'Привет привет';
if (in_array(mb_strtolower($text), $hello)) {
//пользователь поздоровался.
//случайная фраза привет от бота
$bot_resp = $bot_hello[rand(0, (count($bot_hello) - 1))];
$data = array(
'text' => $bot_resp,
);
return $data;
}
return NULL;
}
В эту функцию передаём только текст от пользователя и если это приветствие - то функция commIsHello вернёт массив для ответа, в который мы потом добавим chat_id.
Функция getUserRequest тоже станет короче.
function getUserRequest($text, $chat_id) {
$resp = commIsHello($text);
if (!empty($resp)) {
$resp['chat_id'] = $chat_id;
requestToTelegram($resp);
return TRUE;
}
}
В ней мы передаем запрос от пользователя на проверку - не приветствие ли это. Если это приветствие - то "обогащаем" ответ айдишником чата, отправляем запрос в телеграм и возвращаем true(чтобы выйти из функции и не делать дальнейших проверок).
Теперь мы можем сделать функции, аналогичные функции commIsHello, в которых будем проверять запрос и пытаться распознать в нём другую команду.
Вызывать их будем так-же в функции getUserRequest, после проверки на приветствие.
Давайте создадим функцию commIsUser.
В ней проверим, что в запросе нет пробелов и он начинается со знака @.
Заготовка функции будет выглядеть так.
function commIsUser($text) {
$text = trim($text);//обрезаем пробелы в начале и в конце
$space = strpos($text, ' ');
if (($space === FALSE) && (mb_substr($text, 0, 1) == '@')) {
//возможно это ник пользователя
}
return NULL;
}
Я элементарно проверил на пробелы и первый символ. Можно было сделать это регулярным выражением, это было бы гораздо лаконичнее, но я сделал по-понятнее.
Давайте ради теста вернём предполагаемый ник.
function commIsUser($text) {
$text = trim($text);//обрезаем пробелы в начале и в конце
$space = strpos($text, ' ');
if (($space === FALSE) && (mb_substr($text, 0, 1) == '@')) {
//возможно это ник пользователя
$data = array(
'text' => 'Вы указали ' . mb_substr($text, 1),
);
return $data;
}
return NULL;
}
Проверяем. Если вы нигде не ошиблись - то получите ответ:
Отлично, ник мы распознали.
Теперь можно подключиться к блокчейну и вытянуть из него информацию о пользователе. Как сделать это на PHP - я показывал в прошлом уроке
Дописываем функцию commIsUser так:
//проверка на ник
function commIsUser($text) {
$text = trim($text);//обрезаем пробелы в начале и в конце
$space = strpos($text, ' ');
if (($space === FALSE) && (mb_substr($text, 0, 1) == '@')) {
//возможно это ник пользователя
//подключаемся к блокчейну
require('vendor/autoload.php');
$client = new WebSocket\Client("wss://ws.golos.io/");
$req = json_encode(
[
'id' => 1, 'method' => 'get_accounts', 'params' => [[mb_substr($text, 1)]]
]
);
$client->send($req);
$golos_resp = $client->receive();
teleToLog(json_decode($golos_resp));
$client->close();
}
return NULL;
}
Пробуем отправить ник в чат и затем смотрим лог. У вас должен появиться объект пользователя(если вы написали реальный ник.)
Если у вас код с прошлого урока - обновите функцию teleToLog, я добавил туда поддержку логирования объектов
Я сразу напишу весь код, вы можете разобрать весь ответ в логе и вытащить что-то ещё.
function commIsUser($text) {
$text = trim($text);//обрезаем пробелы в начале и в конце
$space = strpos($text, ' ');
if (($space === FALSE) && (mb_substr($text, 0, 1) == '@')) {
//возможно это ник пользователя
//подключаемся к блокчейну
require('vendor/autoload.php');
$client = new WebSocket\Client("wss://ws.golos.io/");
$req = json_encode(
[
'id' => 1, 'method' => 'get_accounts', 'params' => [[mb_substr($text, 1)]]
]
);
$client->send($req);
$golos_resp = $client->receive();
$resp_object = json_decode($golos_resp);
if (!empty($resp_object->result)) {
$obj = $resp_object->result[0];
$user = array();
$user[] = 'ID: ' . $obj->id;
$user[] = 'Логин: ' . $obj->name;
$user[] = 'Аккаунт создан: ' . $obj->created;
$user[] = 'Последний раз голосовал: ' . $obj->last_vote_time;
$user[] = 'Голосов: ' . $obj->balance;
$user[] = 'Золота: ' . $obj->sbd_balance;
$user[] = 'Создано постов: ' . $obj->post_count;
//расчёт репутации
$reputation = $obj->reputation;
$user[] = 'Репутация: ' . round((max(log10(abs($reputation)) - 9,0) * (($reputation >= 0) ? 1 : -1) * 9 + 25), 3);
$json_metadata = json_decode($obj->json_metadata);
if (!empty($json_metadata->user_image)) {
//фото
// передавать не буду, так как у некоторых логинов "заколдованные" аватары и сообщение в телеграм не приходит
// $user[] = 'Аватар: ' . $json_metadata->user_image;
}
$text = implode("\n", $user);
$data = array(
'text' => $text,
'parse_mode' => 'Markdown',
);
}
else {
$data = array(
'text' => 'Пользователь не найден.',
);
}
$client->close();
if (!empty($data)) {
return $data;
}
}
return NULL;
}
Листинг функции commIsUser на pastebin http://pastebin.com/2FndhXx6
Полный листинг function.php http://pastebin.com/ZAT62brC
Если ошибок нет - то всё должно работать
Если указать несуществующий ник - то получите соответствующую ошибку:
Вот и всё, можете проверить :)