Russian | English
Эта небольшая библиотека, котрая поможет реализовать основною «базовую» логику вашего бота.
Логика библиотеки написана так, чтобы все отсутствующие можно было легко реализовать.
В main.lua, можно просмотреть некоторые возможности библиотеки.
Надеюсь, разобраться в этом не составит большого труда ᓚ₍ ^. .^₎.
Бот который написан с использованием этой библиотеки: https://t.me/niko_rp_bot
git clone https://github.com/uriid1/tnt-tg-bot && cd tnt-tg-bot
Note
Флаг --optional
устанавливает модуль для pretty print-а таблиц
Флаг --http-patch
применяет патч к модулю http, который подменит 500 код ошибки на 200
это полезно, чтобы отвечать телеграму всегда кодом, соответствующим тому
что ваш запрос был обработан, хоть и некорректно.
chmod +x install-dependencies.sh && sh install-dependencies.sh --optional
BOT_TOKEN=123456:AAAAABBBBCCCCDDDeeeFFFF tarantool main.lua
-- init.lua
local bot = require('core.bot')
bot:cfg {
token = os.getenv('BOT_TOKEN'), -- Ваш токен, полученный от @botfather
parse_mode = 'HTML', -- Тип форматирования текста
}
-- Событие получения сущностей
bot.event.onGetEntities = function(message)
local entities = message:getEntities()
-- Вызов команды, если сущность является командой
if entities[1] and entities[1].type == 'bot_command' then
local command = bot.Command(message)
if command then
command(message)
end
end
end
-- Команда /start
bot.commands["/start"] = function(message)
-- Отправка текстового сообщения
bot:call('sendMessage', {
text = 'Hello!',
chat_id = message:getChatId(),
})
end
bot:startLongPolling()
bot:startWebHook({
-- Параметры локального сервера
port = 8081,
host = '0.0.0.0',
-- Ссылка по которой телеграм, будет отправлять -
-- на ваш сервер сообщения
bot_url = 'https://123.123.123.124/my_bot_location',
-- Путь до сертификата
certificate = '/etc/path/to/ssl/public.pem',
-- Опциональные параметры
-- https://core.telegram.org/bots/api#setwebhook
drop_pending_updates = true,
allowed_updates = { "message", "my_chat_member", "callback_query" }
})
!NOTE Если ваш сертификат, например от letsencrypt, то указывать до него путь не нужно
так так телеграм сам обработает получение публичного сертификата
bot:startWebHook({
port = 8081,
host = '0.0.0.0',
bot_url = 'https://mysite.ru/my_bot_location',
drop_pending_updates = true,
allowed_updates = { "message", "my_chat_member", "callback_query" }
})
Добавьте location в блок server, это позволит nginx проксировать запросы от от телеграма к боту.
location /my_bot_location {
proxy_set_header Host $http_host;
proxy_redirect off;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Scheme $scheme;
proxy_pass http://0.0.0.0:8081/;
}
Можно заметить, что некоторые классы не зависят друг от друга.
Например, класс core/classes/callback.lua содержит в себе объект сообщения и реализует методы, аналогичные - core/classes/message.lua
Причина, по которой в callback.lua
не создаётся объект сообщения из класса message.lua
заключается в оптимизации.
Но в будущем, вероятно всё же придется реализовать зависимости у классов.
С архитектурной стороны, так куда правильнее.