telegram/init.lua

148 lines
3.8 KiB
Lua
Raw Normal View History

2019-01-15 23:32:03 +03:00
local current_mod_name = minetest.get_current_modname()
local modpath = minetest.get_modpath(current_mod_name)
telegram = {}
2019-01-15 23:32:03 +03:00
local token = minetest.settings:get("telegram.token")
local chat_id = minetest.settings:get("telegram.chatid")
local updates_timeout = tonumber(minetest.settings:get("telegram.timeout"))
if not updates_timeout then
updates_timeout = 1
end
2019-01-15 23:32:03 +03:00
2019-01-15 23:45:45 +03:00
if not token then
error("Bot token should be specified in the config in order to work.")
end
2019-01-15 23:32:03 +03:00
local UPDATES_LIMIT = 10
local offset = 0
local http_in_progress = false
local JSON = dofile(modpath .. "/JSON.lua")
2019-01-15 23:32:03 +03:00
http_api = minetest.request_http_api()
if not http_api then
error("HTTP API cannot be enabled. Add the mods to trusted.")
2019-01-15 23:32:03 +03:00
end
local COMMANDS = {}
function telegram.register_command(name, command)
COMMANDS[name] = command
end
2019-01-15 23:32:03 +03:00
local function make_request(method, request_body, callback)
local response = {}
local request = {
url = "https://api.telegram.org/bot" .. token .. "/" .. method,
timeout = 10,
post_data = request_body
}
-- We can run request without callback, but minetest fails in this case
if not callback then
callback = function(response)
end
end
http_api.fetch(request, callback)
end
local function process_updates(response)
if response.completed then
local updates = JSON:decode(response.data)
if updates then
if updates.result then
for key, update in pairs(updates.result) do
if update.message then
if update.message.text then
--print(update.message.text)
telegram.on_text_receive(update.message)
end
end
-- TODO Other types of messages
offset = update.update_id + 1
end
end
end
end
http_in_progress = false
end
function telegram.send_message(chat_id, text)
local allowed_parse_mode = {
["Markdown"] = true,
["HTML"] = true
}
if (not allowed_parse_mode[parse_mode]) then parse_mode = "" end
local request_body = {}
request_body.chat_id = chat_id
request_body.text = tostring(text)
request_body.parse_mode = parse_mode
request_body.reply_markup = ""
make_request("sendMessage", request_body, nil)
end
2019-01-21 00:06:56 +03:00
local function get_command(msg)
local comm = nil
local bot_name = nil
comm, bot_name = string.match(msg.text, "/(%a+)@(.+)")
if not comm then
comm = string.match(msg.text, "/(%a+)")
end
-- TODO Check the bot name if using full command
return COMMANDS[comm]
end
2019-01-15 23:32:03 +03:00
function telegram.on_text_receive(msg)
2019-01-21 00:06:56 +03:00
local command = get_command(msg)
if command then
command(msg)
2019-01-15 23:32:03 +03:00
else
local message_text = msg.text
if msg.reply_to_message and msg.reply_to_message.text then
message_text = ">>" .. msg.reply_to_message.text .. "\n" .. message_text
end
minetest.chat_send_all("<" .. msg.from.first_name .. "@TG> " .. message_text)
2019-01-15 23:32:03 +03:00
end
end
local timer = 0
minetest.register_globalstep(function(dtime)
timer = timer + dtime
if timer >= updates_timeout and not http_in_progress then
2019-01-15 23:32:03 +03:00
local timeout = 0
print(offset)
local request_body = {
offset = offset,
limit = UPDATES_LIMIT,
timeout = timeout,
allowed_updates = nil
}
http_in_progress = true
make_request("getUpdates", request_body, process_updates)
timer = 0
end
end)
-- Don't send messages from MT to telegram if we don't know where to
if chat_id then
minetest.register_on_chat_message(function(name, message)
telegram.send_message(chat_id, "<" .. name .. "@MT> " .. message)
return false
end)
end
dofile(modpath .. "/commands.lua")