Russian | English
This small library helps to implement the basic logic for your bot.
The library's logic is designed in such a way that any missing components can be easily implemented.
In main.lua, you can explore some of the library's features.
I hope you find it easy to understand ᓚ₍ ^. .^₎.
git clone https://github.com/uriid1/tnt-tg-bot && cd tnt-tg-bot
Note
The --optional
flag installs the module for pretty printing tables.
The --http-patch
flag applies a patch to the HTTP module, which replaces the 500 error code with a 200 code.
This is useful for always responding to Telegram with a code indicating that your request was processed, even if it was processed incorrectly.
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'), -- Your bot token from @botfather
parse_mode = 'HTML', -- Text formatting mode
}
-- Event for receiving entities
bot.event.onGetEntities = function(message)
local entities = message:getEntities()
-- Trigger command if the entity is a bot command
if entities[1] and entities[1].type == 'bot_command' then
local command = bot.Command(message)
if command then
command(message)
end
end
end
-- /start command
bot.commands["/start"] = function(message)
-- Send a text message
bot:call('sendMessage', {
text = 'Hello!',
chat_id = message:getChatId(),
})
end
bot:startLongPolling()
bot:startWebHook({
-- Local server parameters
port = 8081,
host = '0.0.0.0',
-- URL where Telegram will send messages to your server
bot_url = 'https://123.123.123.124/my_bot_location',
-- Путь до сертификата
certificate = '/etc/path/to/ssl/public.pem',
-- Optional parameters
-- https://core.telegram.org/bots/api#setwebhook
drop_pending_updates = true,
allowed_updates = { "message", "my_chat_member", "callback_query" }
})
!NOTE If your certificate is from a provider like Let's Encrypt, you don't need to specify the path to it.
Telegram will automatically handle retrieving the public certificate.
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" }
})
Add a location block in the server section to allow nginx to proxy requests from Telegram to your bot.
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/;
}
You may notice that some classes are independent of each other.
For example, the core/classes/callback.lua class contains a message object and implements methods similar to those in core/classes/message.lua.
The reason callback.lua doesn't create a message object from the message.lua class is for optimization.
However, in the future, it may be necessary to implement dependencies between classes.
From an architectural perspective, this would be the correct approach.