Inline keyboard Telegram пример

Сегодня будем делать бота — это отличное (и быстрое) занятие, которое развивает уставший мозг и даёт возможность отправить друзьям ссылочку со словами «Смотри, это моё».

Для работы понадобятся

  • Редактор кода, чтобы писать код. Если не знаете, какой выбрать — мы уже рассказывали. Если не умеете писать код, то вот инструкция, как его написать и запустить.
  • Node.js любой версии, выше 0.12. Нужно, чтобы библиотека для ботов заработала. Как установить Node.js.
  • Консоль. Или встроенный в систему вариант, или какой-нибудь другой.
  • VPN. Возможно, но не факт, потому что Телеграм работает не везде.

Шаг 1. Регистрируем бота

Придумываем название и имя боту. Название — то, как он будет подписан в списке контактов. Имя — строка, по которой его можно будет найти. Обратите внимание, что имя должно оканчиваться на bot . В ответ мы получим токен — длинную последовательность символов, которая пригодится нам в будущем. Мы назвали бота echoKeksBot , но вам придётся придумать другое название, потому что это уже занято.

#13 Inline Keyboard | InlineKeyboardMarkup | InlineKeyboardButton | How To Code A Telegram Bot

Извините.

Шаг 2. Создаём проект

Создаем папку в любом месте и открываем её в консоли. Там пишем npm init -y — эта команда создаст файл package.json , который выглядит примерно так:

Теперь установим node-telegram-bot-api — это библиотека для создания телеграм-ботов на Node.js. Введём команду:

npm install —save —save-exact node-telegram-bot-api

Создадим пустой файл index.js и напишем там самого простого бота, который будет отвечать на любое сообщение:

bot.on(‘message’, (msg) => < const chatId = msg.chat.id; bot.sendMessage(chatId, ‘Привет, Друг!’); >);

Шаг 3. Запускаем бота

Тут всё просто, в консоли пишем node index.js , заходим к нашему боту в телеграм и начинаем с ним общаться. Не закрывайте консоль — бот работает только на вашем компьютере, и без консоли он не станет отвечать.

Как видим, бот успешно отвечает. Но бот-повторяха — не интересно, усложним задачу. Пусть бот присылает нам картинку.

Шаг 4. Отсылаем картинку

Добавим картинку с Кексом в папку с проектом. Для отправки изображения используем метод .sendPhoto() — передадим в него id чата и путь до картинки. Получится такой код:

bot.on(‘message’, (msg) => < const chatId = msg.chat.id; bot.sendPhoto(chatId, ‘keks.png’); >);

Запускаем бота, проверяем, работает:

Шаг 5. Добавим клавиатуру. И пёсика

Добавим фотографию милого пёсика в корень проекта. Теперь там две картинки.

Создадим конфигурацию для клавиатуры в боте, пусть у нас будет 3 кнопки: «Хочу кота», «Хочу пёсика» и «Пойти учиться».

Telegram Bot Python #2 — Reply Keyboard, Inline Keyboard, Callbacks (aiogram)

// Конфиг клавиатуры const keyboard = [ [ < text: ‘Хочу кота’, // текст на кнопке callback_data: ‘moreKeks’ // данные для обработчика событий >], [ < text: ‘Хочу песика’, callback_data: ‘morePes’ >], [ < text: ‘Хочу проходить курсы’, url: ‘https://htmlacademy.ru/courses’ //внешняя ссылка >] ];

На нажатия первых двух кнопок мы ответим соответствующим сообщением в Телеграме, а последняя уведёт на внешний ресурс.

Чтобы отличить первые 2 кнопки, воспользуемся полем callback_data , где будем передавать тип кнопки. Для обработки нажатий добавим слушателя на событие callback_query , и в зависимости от значения query.data отправим нужную картинку к пользователю.

// Обработчик нажатий на клавиатуру bot.on(‘callback_query’, (query) => < const chatId = query.message.chat.id; let img = »; if (query.data === ‘moreKeks’) < // если кот img = ‘keks.png’; >if (query.data === ‘morePes’) < // если пёс img = ‘pes.png’; >if (img) < bot.sendPhoto(chatId, img, < // прикрутим клаву reply_markup: < inline_keyboard: keyboard >>); > else < bot.sendMessage(chatId, ‘Непонятно, давай попробуем ещё раз?’, < // прикрутим клаву reply_markup: < inline_keyboard: keyboard >>); > >);

Не забудем про возможные ошибки и предложим пользователю попробовать снова, если он ввёл что-то не то. Перезапустим бота и проверим — всё работает. Главное — не закрывать консоль, иначе бот перестанет отвечать.

Полный файл с кодом: index.js.

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

«Доктайп» — журнал о фронтенде. Читайте, слушайте и учитесь с нами.

Читать дальше

Случайное число из диапазона

Случайное число из диапазона

Допустим, вам зачем-то нужно целое случайное число от min до max . Вот сниппет, который поможет:

function getRandomInRange(min, max)

  1. Math.random () генерирует случайное число между 0 и 1. Например, нам выпало число 0.54 .
  2. (max — min + 1): определяет количество возможных значений в заданном диапазоне. 10 — 0 + 1 = 11 . Это значит, что у нас есть 11 возможных значений (0, 1, 2, . 10).
  3. Math.random () * (max — min + 1): умножает случайное число на количество возможных значений: 0.54 * 11 = 5.94 .
  4. Math.floor (): округляет число вниз до ближайшего целого. Так, Math.floor(5.94) = 5 .
  5. . + min: смещает диапазон так, чтобы минимальное значение соответствовало min . Но в нашем примере, так как min = 0 , это не изменит результат. Пример: 5 + 0 = 5 .
  6. Итак, в нашем примере получилось случайное число 5 из диапазона от 0 до 10.

Чтобы протестировать, запустите:

console.log(getRandomInRange(1, 10)); // Тест

  • 7 сентября 2023

В чём разница между var и let

В чём разница между var и let

Если вы недавно пишете на JavaScript, то наверняка задавались вопросом, чем отличаются var и let , и что выбрать в каждом случае. Объясняем.

var и let — это просто два способа объявить переменную. Вот так:

var x = 10; let y = 20;

Переменная, объявленная через var , доступна только внутри «своей» функции, или глобально, если она была объявлена вне функции.

function myFunction() < var z = 30; console.log(z); // 30 >myFunction(); console.log(z); // ReferenceError

Это может создавать неожиданные ситуации. Допустим, вы создаёте цикл в функции и хотите, чтобы переменная i осталась в этой функции. Если вы используете var , эта переменная «утечёт» за пределы цикла и будет доступна во всей функции.

Еще по теме:  Быстрые команды для iPhone Телеграмм

Переменные, объявленные с помощью let доступны только в пределах блока кода, в котором они были объявлены.

if (true) < let a = 40; console.log(a); // 40 >console.log(a); // ReferenceError

В JavaScript блок кода — это участок кода, заключённый в фигурные скобки <> . Это может быть цикл, код в условном операторе или что-нибудь ещё.

if (true) < let blockScoped = «Я виден только здесь»; console.log(blockScoped); // «Я виден только здесь» >// здесь переменная blockScoped недоступна console.log(blockScoped); // ReferenceError

Если переменная j объявлена в цикле с let , она останется только в этом цикле, и попытка обратиться к ней за его пределами вызовет ошибку.

  • 30 августа 2023

Быстрый гайд по if, else, else if в JavaScript

Быстрый гайд по if, else, else if в JavaScript

Допустим, вы собираетесь идти на прогулку. Если на улице солнечно, вы возьмёте с собой солнечные очки.

Это можно описать с помощью оператора if .

let weather = «sunny»; if (weather === «sunny»)

А если погода не солнечная, а, скажем, дождливая, вы возьмете зонт.

Этот сценарий можно описать с помощью if-else .

let weather = «rainy»; if (weather === «sunny») < console.log(«Возьму солнечные очки»); >else

Условный оператор if-else if-else

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

И всё это очень легко описывается кодом:

let weather = «sunny»; let time = «morning»; if (weather === «rainy») < // если дождь, то только так console.log(«Еду на автобусе»); >else if (time === «morning») < // если не дождь и утро console.log(«Еду на велике мимо пробок»); >else < // если второе не дождь и не утро console.log(«Еду на машине»); >

Ветвление только может показаться сложным, но вообще оно очень логичное, если понять, какие действия после каких условий выполняются. Разберитесь один раз и поймёте на всю жизнь, 100%.

  • 30 августа 2023

Как исправить ошибки SyntaxError в JavaScript

Как исправить ошибки SyntaxError в JavaScript

Ошибки SyntaxError появляются, если разработчик нарушил правила синтаксиса JavaScript, например, пропустил закрывающую скобку или точку с запятой. Давайте посмотрим, что означает каждая ошибка и в чём может быть проблема.

Ошибка TypeError: что это и как её исправить

Ошибка TypeError: что это и как её исправить

Ошибки TypeError появляются, когда разработчики пытаются выполнить операцию с неправильным типом данных. Давайте разберём несколько примеров: почему появилась ошибка и как её исправить.

3 способа объявить функцию в JavaScript

3 способа объявить функцию в JavaScript

Функции в JavaScript можно объявить тремя способами: через декларативное объявление, функциональное выражение или с помощью стрелок. Звучит сложно, но на самом деле всё совсем не так.

Как сделать простой слайдер на HTML и JavaScript

Как сделать простой слайдер на HTML и JavaScript

Вы сверстали сайт и сделали его красивым с помощью CSS. Осталось добавить интерактива, и можно добавлять проект в портфолио.

«Оживить» на сайте можно что угодно: меню, модальные окна, корзину, пагинацию… В этой статье мы разберём слайдер — посмотрим, как его сделать на чистом JavaScript. Слайдер пригодится для раздела с отзывами, фотографиями сотрудников, изображениями товаров или чего-нибудь ещё — всё зависит только от вашей фантазии и проекта.

☝ Мы покажем лишь один из возможных вариантов. Это не эталонное решение, да в разработке и не бывает единственно верного способа решить задачу. Но код точно работает, поэтому можете скопировать его в свой проект.

Полезные команды для работы с Node.js

Полезные команды для работы с Node.js

Перед тем как рассматривать полезные команды при работе с Node.js, её необходимо установить.

Команды помогают узнать версию Node.js,

node -h — показывает список всех доступных команд Node.js.

node -v , node —version — показывает установленную версию Node.js.

npm -h — показывает список всех доступных команд пакетного менеджера npm .

npm -v , npm —version — показывает установленную версию npm .

Команда npm update npm -g позволяет обновить версию npm .

npm list —depth=0 показывает список установленных пакетов.

Команда npm outdated —depth=0 покажет список установленных пакетов, которые требуют обновления. Если все пакеты обновлены, список будет пустым.

npm install package — позволяет установить любой пакет по его имени. Если при этом к команде добавить префикс -g пакет будет установлен глобально на весь компьютер.

Команда npm i package является укороченной альтернативой предыдущей команды.

npm uninstall package — удаляет установленный пакет по имени.

Команда npm list package — покажет версию установленного пакета, а команда npm view package version — последнюю версию пакета, которая существует.

Для работы с пакетным менеджером также пригодится файл package.json , который должен лежать в директории, с которой происходит работа в консоли.

Он содержит различные мета-данные, например, имя проекта, версия, описания и автор. Также он содержит список зависимостей, которые будут установлены, если вызвать из этой папки команду npm install .

Кроме этого он ещё имеет скрипты, которые вызывают другие команды консоли. Например, для этого файла вызов команды npm start вызовет запуск задачи Grunt с именем dev . А команда npm run build вызовет скрипт build , который запустит задачу в Grunt с именем build .

Во время работы часто возникает необходимость установить некоторые пакеты. Если установить пакет с префиксом —save , то он автоматически запишется в package.json в раздел dependencies . Такая же команда с префиксом —save-dev запишет пакет в раздел devDependencies .

nvm (илиNode Version Manager) — утилита, которая позволяет быстро менять версии Node.js.

Чтобы её установить, достаточно запустить скрипт

curl -o- https://raw.githubusercontent.com/creationix/nvm/v0.31.0/install.sh | bash

Теперь можно установить последнюю версию Node.js, например, 5.0 с помощью команды nvm install 5.0 . Чтобы начать использовать её, введите команду nvm use 5.0 . Таким образом, можно быстро переключаться между версиями, например, для тестирования.

Как составлять регулярные выражения

Как составлять регулярные выражения

Регулярное выражение — это последовательность символов (селекторов). Оно используется для поиска и обработки строк, слов, чисел и других текстовых данных.

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

Проверка типа интерфейса в TypeScript

Проверка типа интерфейса в TypeScript

Проверка типов интерфейса — одна из ключевых возможностей TypeScript. Она помогает убедиться, что объект или класс содержат необходимый набор свойств и методов, указанных в интерфейсе. Благодаря проверке типов вы можете писать более надёжный код, ведь часть ошибок будет найдена ещё на этапе компиляции.

Еще по теме:  Как в приложении Телеграмм узнать свой id

Источник: htmlacademy.ru

Telegram API Bot

Развитие Телеграмм во многом определяется наличием большого числа ботов – небольших сервисных программ-роботов. Их может создать каждый пользователь, знакомый с программированием на среднем уровне. Telegram API Bot – это программный интерфейс, позволяющий программировать собственного бота.

API включает в себя объекты и команды, предназначенные для установки поведения бота Telegram. Используя интерфейс, вы можете создавать собственные программные коды, которые при запуске в Telegram начинают работать как боты.

Элементы управления

В Бот Телеграмм API все элементы управления представляют собой объекты, которые представлены в JSON, то есть в виде строки, заданной по определенным правилам. Это позволяет производить обмен данными по сети максимально быстро и наименее затратно, так как передается не программный код, а набор пар «ключ:значение» в текстовом виде. В таблице приведены все типы API. Большая часть объектов предназначена для создания команд бота. Ключи дадут более расширенное представление о возможностях объекта.

Название Описание Ключи
User Пользователь в Телеграмм id
first_name
last_name
username
Chat Чат id
type
title
username
first_name
last_name
all_members_are_administrators
Message Сообщение message_id
from
date
chat
forward_from
forward_date
reply_to_message
text
entities
audio
document
photo
sticker
video
voice
caption
contact
location
venue
new_chat_member
left_chat_member
new_chat_title
new_chat_photo
delete_chat_photo
group_chat_created
supergroup_chat_created
channel_chat_created
migrate_to_chat_id
migrate_from_chat_id
pinned_message
MessageEntity Отдельная сущность в текстовом сообщении (хештег, ссылка и пр.) type
length
url
offset
PhotoSize Изображение заданного размера или превью фото, файла или стикера file_id
width
height
file_size
Audio Аудиозапись file_id
duration
performer
title
mime_type
file_size
Document Любой файл, не являющийся изображением, аудиозаписью или голосовой записью file_id
thumb
file_name
mime_type
file_size
Sticker Стикер file_id
width
height
thumb
file_size
Video Видеозапись file_id
width
height
duration
thumb
mime_type
file_size
Voice Голосовое сообщение file_id
duration
mime_type
file_size
Contact Телефонный контакт phone_number
first_name
last_name
user_id
Location Точка на карте longitude
latitude
Venue Объект на карте location
title
address
foursquare_id
UserProfilePhotos Фото профиля пользователя total_count
photos
File Готовый к загрузке файл file_id
file_size
file_path
ReplyKeyboardMarkup Клавиатура с возможностью ответа keyboard
resize_keyboard
one_time_keyboard
selective
KeyboardButton Кнопка клавиатуры для ответа text
request_contact
request_location
ReplyKeyboardHide Заменяет клавиатуру бота на стандартную клавиатуру Telegram hide_keyboard
selective
InlineKeyboardMarkup Встроенная клавиатура, появляющаяся под сообщением inline_keyboard
InlineKeyboardButton Одна кнопка на встроенной клавиатуре text
url
callback_data
switch_inline_query
switch_inline_query_current_chat
callback_game
CallbackQuery Входящий запрос обратной связи для встроенной кнопки с заданным параметром callback_data id
from
message
inline_message_id
data
ForceReply Эмулирует действия пользователя: выбор сообщения и нажатия кнопки «Ответить» force_reply
selective
ResponseParameters Сообщает, почему запрос не выполнился успешно migrate_to_chat_id
retry_after

Результирующие строки, которые присылает мессенджер, представлены в виде тех же объектов API.

Обмен сообщениями происходит в виде запросов. В следующей таблице приведены примеры некоторых из них.

Метод Действие
getMe Позволяет получить информацию о пользователе
sendMessage Отправляет сообщение
sendPhoto Отправляет фото
sendAudio Отправляет аудио
sendDocument Отправляет документ
sendVideo Отправляет видео
sendContact Отправляет контакт
getUpdates Получает обновления из чата

Все методы (а их достаточно много) делятся на группы:

  1. Получение обновлений и информации.
  2. Работа в чате.
  3. Отправка различных элементов.
  4. Работа со стикерами.
  5. Обновление сообщений.
  6. Режим inline.
  7. Платежный функционал.
  8. Для игр.

Полной документации Telegram Bot API на русском пока не существует. Однако стандартный перевод в браузере Google Chrome прекрасно справляется с задачей.

Языки программирования

Telegram API поддерживается множеством языков программирования. Это дает возможность выбора создателю.

Любители JavaScript могут использовать Node.js Telegram Bot API. Здесь необходимо знание не только языка, но и умение обращаться с этим фреймворком, превратившим клиентский язык в полноценный серверный интерфейс.

Одним из самых популярных для написания ботов с использованием Telegram Bot API является PHP. Этот язык изначально был предназначен для создания серверных web-приложений. Он отличается простотой, логичностью и специализированностью именно для web-среды.

Часто используется Telegram Bot API в Python. Этот язык отличается минимализмом и достаточно прост в изучении. Он очень популярен за счет своей производительности.
Классикой является применение Telegram Bot API в С++. Язык нельзя назвать простым, но он является базой, на которой были созданы все остальные вышеперечисленные ЯП. Соответственно в нем не заложена определенная специализация. Инструменты позволяют создавать любые приложения.

Пример использования

Кроме объектов API имеет набор методов, которые позволяют отправлять сообщения, файл, фото стикеры, редактировать и многое другое. Все эти команды можно найти в описании API на официальном сайте.

Все запросы имеют вид:

https://api.telegram.org/bot/КОМАНДА

Всего существует 4 способа подачи запроса:

  1. Запрос в URL
  2. application/x-www-form-urlencoded
  3. application/json (не подходит для загрузки файлов)
  4. multipart/form-data (для загрузки файлов)

Доступны как GET, так и POST запросы.

Самый простой способ попробовать команды API – адресная строка в браузере. Зайдите в свой бот в web-версии или с мобильного устройства. Затем в браузере наберите команду:

В результате в окне появится JSON-строка

В браузере появится строка

А в чате Телеграмм вы увидите приветствие от созданного робота.

Как видите, создать с нуля новый элемент для Телеграмм не сложно. Трудности начинаются в момент программирования, но об этом расскажем в других статьях.

Источник: telegramzy.ru

Как я Telegram бота на Go писал. Часть вторая. Прокачиваем бота.

Author's picture

В предыдущей части был написан бот, который по заданному имени или части имени находит подходящие и показывает пользователю в отдельных сообщениях. В этот раз немного улучшим его: улучшим форматирование, добавим inline- режим и реализуем пару команд.

Улучшаем форматирование

Скажу сразу, что Telegram умеет в HTML и Markdown. Но, к сожалению, очень ограничено: если посмотреть документацию, то поддерживается только полужирное начертание, курсив, моноширинный шрифт и ссылки: Markdown:

*полужирный* _курсив_ [ссылка](http://www.example.com/) `строчный моноширинный` «`text блочный моноширинный (можно писать код) «`
полужирный, полужирный курсив ссылка строчный моноширинный блочный моноширинный (можно писать код)

Лично мне больше по душе Markdown. К счастью, библиотека, которую я использую для разработки бота так же умеет в HTML и Markdown. Немного улучшим наши сообщения:

  1. Название заклинания будем отображать полужирным
  2. Курсивом добавим информацию про уровень заклинания, школу, класс, время действия и прочее
  3. Описание заклинания оставим обычным текстом

То есть сообщение будет выглядеть (в исходном виде) примерно так:

Еще по теме:  Как закрыть всплывающие сообщение Телеграмма

*Alter Self* *Level* _2_ *School* _T_ *Time* _1 action_ *Range* _Self_ *Components* _V, S_ *Duration* _Concentration, up to 1 hour_ *Classes* _Sorcerer, Wizard_ *Roll* _1d6+1_ You assume a different form. When you cast the spell, choose one of the following options, the effects of which last for the duration of the spell. While the spell lasts, you can end one option as an action to gain the benefits of a different one. Aquatic Adaptation: You adapt your body to an aquatic environment, sprouting gills, and growing webbing between your fingers. You can breathe underwater and gain a swimming speed equal to your walking speed. Change Appearance: You transform your appearance.

You decide what you look like, including your height, weight, facial features, sound of your voice, hair length, coloration, and distinguishing characteristics, if any. You can make yourself appear as a member of another race, though none of your statistics change. You also don’t appear as a creature of a different size than you, and your basic shape stays the same, if you’re bipedal, you can’t use this spell to become quadrupedal, for instance. At any time for the duration of the spell, you can use your action to change your appearance in this way again. Natural Weapons: You grow claws, fangs, spines, horns, or a different natural weapon of your choice.

Your unarmed strikes deal 1d6 bludgeoning, piercing, or slashing damage, as appropriate to the natural weapon you chose, and you are proficient with you unarmed strikes. Finally, the natural weapon is magic and you have a +1 bonus to the attack and damage rolls you make using it.

В общем — ничего сложного, правда? Для того, чтобы отправить сообщение в Markdown-формате необходимо сказать об этом telegram-у при помощи свойства ParseMode структуры MessageConfig :

text := fmt.Sprintf( «*%s*n» + «*Level* _%v_n» + «*School* _%s_n» + «*Time* _%s_n» + «*Range* _%s_n» + «*Components* _%s_n» + «*Duration* _%s_n» + «*Classes* _%s_n» + «*Roll* _%s_n» + «%s», spell.Name, spell.Level, spell.School, spell.Time, spell.Range, spell.Components, spell.Duration, spell.Classes, strings.Join(spell.Rolls, «, «), strings.Join(spell.Texts, «n»)) msg := tgbotapi.NewMessage(update.Message.Chat.ID, text) msg.ParseMode = «markdown» bot.Send(msg)

2016-10-08_23-57-20.png

Можно немного упороться и сделать дополнительную предобработку: вместо школы или компонент выводить текстовое название школы и компоненты, но оставим это на самостоятельное изучение — сейчас можно обойтись без этого. Как мне кажется, выглядит довольно пристойно:

inline боты

Я не буду рассказывать что это такое — можете посмотреть в документации. Вкратце — это штука позволяет обращаться к боту из любого чата telegram и отправить ответ бота в этот чат (или в приватный чат — если это реализовано в боте). Для реализации этой функциональности в telegram-bot-api уже есть нужная функция: NewInlineQueryResultArticleMarkdown принимающая три параметра:

  1. id — идентификатор сообщения (толком не понял, для чего используется)
  2. title — текст, который будет отображаться в выпадающем списке
  3. messageText — ответ бота, если пользователь нажмёт на этот элемент списка.

Сделаем так: если в inline режиме что-то пишут боту — считаем это имя заклинания и находим всё подходящие и их описания. Далее отправляем весь список подходящих заклинаний и ждём действий пользователя. Но для начала необходимо изменить код, который обрабатывает получение новых обновлений от telegram: при получении inline сообщения свойство update.Message не будет означено, вместо него будет получено update.InlineQuery и это необходим корректно обрабатывать:

if update.Message == nil update.InlineQuery != nil < // код для inline режима >else < // код для «обычного» режима >

ОК, добавим обработку inline сообщений:

query := update.InlineQuery.Query filteredSpells := Filter(spells.Spells, func(spell Spell) bool < return strings.Index(strings.ToLower(spell.Name), strings.ToLower(query)) >= 0 >) var articles []interface<> if len(filteredSpells) == 0 < msg := tgbotapi.NewInlineQueryResultArticleMarkdown(update.InlineQuery.ID, «No one spells matches», «No one spells matches») articles = append(articles, msg) >else < var i = 0 // добавим счётчик заклинаний, чтобы не показывать больше 10 for _, spell := range(filteredSpells) < text := fmt.Sprintf( «*%s*n» + «*Level* _%v_n» + «*School* _%s_n» + «*Time* _%s_n» + «*Range* _%s_n» + «*Components* _%s_n» + «*Duration* _%s_n» + «*Classes* _%s_n» + «*Roll* _%s_n» + «%s», spell.Name, spell.Level, spell.School, spell.Time, spell.Range, spell.Components, spell.Duration, spell.Classes, strings.Join(spell.Rolls, «, «), strings.Join(spell.Texts, «n»)) msg := tgbotapi.NewInlineQueryResultArticleMarkdown(spell.Name, spell.Name, text) articles = append(articles, msg) if i >= 10 < break >> > inlineConfig := tgbotapi.InlineConfig < InlineQueryID: update.InlineQuery.ID, IsPersonal: true, CacheTime: 0, Results: articles, >_, err := bot.AnswerInlineQuery(inlineConfig) if err != nil

  1. Вводим команду /setinline
  2. Выбираем DndSpellsBot
  3. Пишем сообщение, которое будет отображаться в качестве подсказки

2016-10-09_00-33-01.pngСнова запустим бота и попробуем обратиться к нему: 2016-10-09_01-17-00.pngПохоже, всё работает как надо. Осталось добавить команды

Команды

Команда — особо сформированное сообщение боту. Всегда начинаются с / и длиной не более 32 символов. Имеют следующий вид:

/command [optional] [argument]
// Если сообщение — не команда, то Command() будет пустой строкой, // иначе — текст команды command := update.Message.Command() if command == «» < // Здесь логика для «обычных» сообщений >else < // Здесь — для команд >

2016-10-14_08-21-36.png

Можно сделать просто — параметром к команде передавать имя класса. А можно воспользоваться возможностями мессенджера и показать пользователю список доступных классов в виде кнопок: Сделать это несложно (когда знаешь как делать):

switch command < case «setclass»: msg := tgbotapi.NewMessage(update.Message.Chat.ID, «Select your class») keyboard := tgbotapi.InlineKeyboardMarkup<>for _, class := range classes < var row []tgbotapi.InlineKeyboardButton btn := tgbotapi.NewInlineKeyboardButtonData(class, class) row = append(row, btn) keyboard.InlineKeyboard = append(keyboard.InlineKeyboard, row) >msg.ReplyMarkup = keyboard bot.Send(msg) >

В-третьих — запомним, по идентификатору пользователя, что он хочет получать заклинания для выбранного класса (для простоты — создадим map[int]string):

// Перед функцие main добави наш словарь var classesMap map[int]string

В цикле обработки обновлений чата добавим обработку когда update.Message не означен, но есть update.CallbackQuery — ответ от inline-клавиатуры:

if update.CallbackQuery != nil

И, в-четвертых, нам необходимо учитывать этот класс в наших запросах на поиск заклинаний:

filteredSpells := Filter(spells.Spells, func(spell Spell) bool < class, ok := classesMap[update.Message.From.ID] classCond := true if ok < classCond = strings.Index(strings.ToLower(spell.Classes), strings.ToLower(class)) >= 0 > return strings.Index(strings.ToLower(spell.Name), strings.ToLower(query)) >= 0 classCond >)

Команду для очистки класса оставим на самостоятельную реализацию 🙂 Полный исходный код можно найти на bitbucket.

Если вам понравилась статья, то можете зайти в мой telegram-канал. В канал попадают небольшие заметки о Python, .NET, Go.

Источник: makesomecode.me

Рейтинг
( Пока оценок нет )
Загрузка ...