mail/webmail.lua

157 lines
3.3 KiB
Lua
Raw Normal View History

2019-09-16 08:06:54 +02:00
-- false per default
local has_xban2_mod = minetest.get_modpath("xban2")
local MP = minetest.get_modpath(minetest.get_current_modname())
local Channel = dofile(MP .. "/util/channel.lua")
local channel
-- auth request from webmail
local function auth_handler(data)
local auth = data.params
local handler = minetest.get_auth_handler()
minetest.log("action", "[webmail] auth: " .. auth.playername)
local success = false
local banned = false
local message = ""
if mail.webmail.disallow_banned_players and has_xban2_mod then
-- check xban db
local xbanentry = xban.find_entry(auth.playername)
if xbanentry and xbanentry.banned then
banned = true
message = "Banned!"
end
end
if not banned then
-- check tan
local tan = mail.tan[auth.playername]
if tan ~= nil then
success = tan == auth.password
end
-- check auth
if not success then
local entry = handler.get_auth(auth.playername)
if entry and minetest.check_password_entry(auth.playername, entry.password, auth.password) then
success = true
end
end
end
channel.send({
method = data.method,
id = data.id,
result = {
success = success,
message = message
}
})
end
-- send request from webmail
local function send_handler(data)
-- send mail from webclient
if not data.params then
return
end
minetest.log("action", "[webmail] sending mail from webclient: " .. data.params.sender ..
" -> " .. data.params.receiver)
mail.send(data.params)
channel.send({
method = data.method,
id = data.id,
result = {
success = true
}
})
end
-- get player messages request from webmail
local function get_player_messages_handler(data)
local messages = mail.getMessages(data.params.playername)
channel.send({
method = data.method,
id = data.id,
result = messages
})
end
-- remove mail
local function delete_mail_handler(data)
local index = data.params.index
local playername = data.params.playername
local messages = mail.getMessages(playername)
if messages[index] then
table.remove(messages, index)
end
mail.setMessages(playername, messages)
-- TODO: check subject
channel.send({
method = data.method,
id = data.id,
result = { success = true }
})
end
-- mark mail as read
local function mark_mail_read_handler(data)
local index = data.params.index
local playername = data.params.playername
local read = data.params.read
local messages = mail.getMessages(playername)
if messages[index] then
messages[index].unread = not read
end
mail.setMessages(playername, messages)
-- TODO: check subject
channel.send({
method = data.method,
id = data.id,
result = { success = true }
})
end
function mail.webmail_send_hook(m)
channel.send({
type = "new-message",
data = m
})
end
mail.register_on_receive(mail.webmail_send_hook)
function mail.webmail_init(http, url, key)
channel = Channel(http, url .. "/api/minetest/channel", {
extra_headers = { "webmailkey: " .. key }
})
channel.receive(function(data)
if data.method == "auth" then
auth_handler(data)
elseif data.method == "get-mails" then
get_player_messages_handler(data)
elseif data.method == "mark-mail-read" then
mark_mail_read_handler(data)
elseif data.method == "delete-mail" then
delete_mail_handler(data)
elseif data.method == "send" then
send_handler(data)
end
end)
end