Add Matrix API

main
Bram van den Heuvel 2024-02-20 10:57:29 +01:00
parent d6e0486188
commit b1037a815a
2 changed files with 119 additions and 0 deletions

43
lua/send.lua Normal file
View File

@ -0,0 +1,43 @@
function matrix.send_message(http_api, body, formatted_body, callback, txnId)
if txnId == nil then
txnId = os.time()
end
http_api.fetch({
url = (
config.url .. "/_matrix/client/v3/rooms/" .. config.room_id ..
"/send/m.room.message/" .. txnId
),
data = json.encode({
msgtype = "m.text",
body = body,
format = "org.matrix.custom.html",
formatted_body = formatted_body
}),
extra_headers = { "Authorization: Bearer " .. config.access_token },
method = "PUT"
}, function(result)
if result.code ~= 200 then
minetest.debug("Failed to send message to Matrix homeserver with code " .. result.code)
minetest.debug(result.data)
else
if callback ~= nil then
callback(json.decode(result.data))
end
end
end)
end
function matrix.send(http_api, strong_text, small_text, callback)
return matrix.send_message(
http_api, "**" .. strong_text .. "** " .. small_text,
"<strong>" .. strong_text .. "</strong> " .. small_text,
callback
)
end
function matrix.say(http_api)
return function(name, message)
return matrix.send(name .. ":", message)
end
end

76
lua/sync.lua Normal file
View File

@ -0,0 +1,76 @@
sync_so_far = nil
function matrix.sync(http_api, callback, global_callback)
local s = ""
if sync_so_far ~= nil then
s = "since=" .. sync_so_far .. "&"
end
local url = ( config.url .. "/_matrix/client/v3/sync?" .. s ..
"full_state=false&set_presence=online&" ..
"timeout=" .. (config.sync_timeout * 1000) .. "&"
)
http_api.fetch({
url = url,
method = "GET",
timeout = config.sync_timeout + 1,
extra_headers = { "Authorization: Bearer " .. config.access_token },
multipart = false
}, function(result)
if result.code ~= 200 then
minetest.debug("Failed to sync with Matrix server; received code " .. result.code)
minetest.debug(result.data)
else
local answer = json.decode(result.data)
if answer.next_batch ~= nil then
sync_so_far = answer.next_batch
end
if answer.rooms == nil then
elseif answer.rooms.join == nil then
elseif callback == nil then
else
for room_id, room in pairs(answer.rooms.join) do
if room_id == config.room_id then
-- Iterate over old state event updates
if room.state == nil then
elseif room.state.events == nil then
else
for _, event in pairs(room.state.events) do
callback(event)
end
end
-- Iterate over most recent timeline
if room.timeline == nil then
elseif room.timeline.events == nil then
else
for _, event in pairs(room.timeline.events) do
callback(event)
end
end
end
end
end
end
global_callback(result)
end)
end
local function sleep(duration)
local time = os.time()
while os.time() < time + duration do
end
end
function matrix.sync_forever(http_api, callback)
matrix.sync(http_api, callback, function(result)
sleep(1)
matrix.sync_forever(http_api, callback)
end)
end