betterpm-minetest/init.lua

130 lines
4.6 KiB
Lua

betterpm = {}
local S = minetest.get_translator("betterpm")
local modpath = minetest.get_modpath("betterpm")
local storage = minetest.get_mod_storage()
local reply_to = {}
dofile(modpath .. "/settings.lua")
dofile(modpath .. "/chatcmdbuilder.lua")
local function formatPrefix(prefix, sender, target)
local res, _ = prefix:gsub("{sender}", sender)
res, _ = res:gsub("{target}", target)
return res
end
local function sendMessage(sender, target, message)
reply_to[sender] = target
reply_to[target] = sender
if not minetest.check_player_privs(sender, { shout=true }) and betterpm.requires_shout then
minetest.chat_send_player(sender,
minetest.colorize("#ff0000", S("You don't have the privilege to send private messages")))
return
end
local ignored = minetest.deserialize(storage:get_string(target)) or {}
if ignored[sender] or ignored[":all"] then
minetest.chat_send_player(sender,
minetest.colorize("#ff0000", S("You can't send messages to @1", target)))
return
end
if minetest.get_player_by_name(target) then
minetest.chat_send_player(target,
minetest.colorize(betterpm.targetPrefixColor, formatPrefix(betterpm.targetPrefix, sender, target) ..
minetest.colorize(betterpm.targetMsgColor, message)))
minetest.chat_send_player(sender,
minetest.colorize(betterpm.senderPrefixColor, formatPrefix(betterpm.senderPrefix, sender, target) ..
minetest.colorize(betterpm.senderMsgColor, message)))
else
minetest.chat_send_player(sender, minetest.colorize("#ff0000", S("@1 is not online", target)))
end
end
ChatCmdBuilder.new("msg", function(cmd)
cmd:sub(":target :message:text", function (sender, target, message)
sendMessage(sender, target, message)
end)
end, {
description = S("Write private messages"),
params = S("<name>") .. " " .. S("<message>"),
})
ChatCmdBuilder.new("w", function(cmd)
cmd:sub(":target :message:text", function (sender, target, message)
sendMessage(sender, target, message)
end)
end, {
description = S("Alias for /msg"),
params = S("<name>") .. " " .. S("<message>"),
})
ChatCmdBuilder.new("r", function(cmd)
cmd:sub(":message:text", function (sender, message)
if not minetest.check_player_privs(sender, { shout=true }) and betterpm.requires_shout then
minetest.chat_send_player(sender,
minetest.colorize("#ff0000", S("You don't have the privilege to send private messages")))
return
end
if reply_to[sender] ~= nil then
local ignored = minetest.deserialize(storage:get_string(reply_to[sender])) or {}
if ignored[sender] or ignored[":all"] then
minetest.chat_send_player(sender,
minetest.colorize("#ff0000", S("You can't send messages to @1", reply_to[sender])))
return
end
reply_to[reply_to[sender]] = sender
minetest.chat_send_player(reply_to[sender],
minetest.colorize(betterpm.targetPrefixColor, formatPrefix(betterpm.targetPrefix, sender, reply_to[sender]) ..
minetest.colorize(betterpm.targetMsgColor, message)))
minetest.chat_send_player(sender,
minetest.colorize(betterpm.senderPrefixColor, formatPrefix(betterpm.senderPrefix, sender, reply_to[sender]) ..
minetest.colorize(betterpm.senderMsgColor, message)))
else
minetest.chat_send_player(sender, S("You must write to someone before replying. Use /msg <name> <message>"))
end
end)
end, {
description = S("Reply to a private message"),
params = S("<message>"),
})
-- ignore private messages
ChatCmdBuilder.new("pmignore", function(cmd)
-- ignore everyone
cmd:sub("", function (sender)
local ignored = minetest.deserialize(storage:get_string(sender)) or {}
if ignored[":all"] then
ignored[":all"] = false
minetest.chat_send_player(sender, S("You are no longer ignoring all private messages"))
else
ignored[":all"] = true
minetest.chat_send_player(sender, S("You are now ignoring all private messages"))
end
storage:set_string(sender, minetest.serialize(ignored))
end)
cmd:sub(":name", function (sender, name)
local ignored = minetest.deserialize(storage:get_string(sender)) or {}
if ignored[name] then
ignored[name] = false
minetest.chat_send_player(sender, S("You are no longer ignoring private messages from @1", name))
else
ignored[name] = true
minetest.chat_send_player(sender, S("You are now ignoring private messages from @1", name))
end
storage:set_string(sender, minetest.serialize(ignored))
end)
end, {
description = S("Ignore private messages from specific players or from everyone (/pmignore)"),
params = S("<name>"),
})
minetest.log("action", "[BETTERPM] Mod initialised")