factions/fac_chat/init.lua

280 lines
8.8 KiB
Lua
Raw Normal View History

2016-08-07 19:31:11 +02:00
factions_chat = {}
2016-08-07 19:36:56 +02:00
factions.commands = {}
2020-01-01 03:50:30 +01:00
local function register_command(cmd_name, cmd)
2016-08-07 19:31:11 +02:00
factions.commands[cmd_name] = { -- default command
2016-08-07 15:17:33 +02:00
name = cmd_name,
faction_permissions = {},
global_privileges = {},
format = {},
infaction = true,
2019-07-21 01:01:54 +02:00
description = "This command has no description.",
ignore_param_limit = false,
or_perm = false,
dont_show_in_help = false,
2016-08-07 15:17:33 +02:00
run = function(self, player, argv)
if self.global_privileges then
2016-08-08 13:46:42 +02:00
local tmp = {}
for i in ipairs(self.global_privileges) do
tmp[self.global_privileges[i]] = true
end
local bool, missing_privs = minetest.check_player_privs(player, tmp)
if not bool then
2019-09-14 21:50:43 +02:00
minetest.chat_send_player(player, "Unauthorized.")
return false
end
2016-08-08 13:46:42 +02:00
end
2016-08-07 15:17:33 +02:00
-- checks argument formats
local args = {
factions = {},
players = {},
strings = {},
2018-10-15 17:24:58 +02:00
unknowns = {},
2016-08-07 15:17:33 +02:00
other = {}
}
2019-07-21 01:01:54 +02:00
if not self.ignore_param_limit then
if #argv < #(self.format) then
2019-09-14 21:50:43 +02:00
minetest.chat_send_player(player, "Not enough parameters.")
return false
end
else
if self.format[1] then
local fm = self.format[1]
for i in ipairs(argv) do
if #argv > #(self.format) then
table.insert(self.format, fm)
else
break
end
end
end
end
for i in ipairs(self.format) do
local argtype = self.format[i]
2016-08-07 15:17:33 +02:00
local arg = argv[i]
if argtype == "faction" then
2016-08-20 00:47:35 +02:00
local fac = factions.get_faction(arg)
2016-08-07 15:17:33 +02:00
if not fac then
2019-09-14 21:50:43 +02:00
minetest.chat_send_player(player, "Specified faction " .. arg .. " does not exist")
2016-08-07 15:17:33 +02:00
return false
else
table.insert(args.factions, fac)
end
elseif argtype == "player" then
2019-03-12 00:38:03 +01:00
local data = minetest.get_auth_handler().get_auth(arg)
if data then
table.insert(args.players, arg)
else
2019-09-14 21:50:43 +02:00
minetest.chat_send_player(player, "Player does not exist.")
2019-03-12 00:38:03 +01:00
return false
end
2016-08-07 15:17:33 +02:00
elseif argtype == "string" then
table.insert(args.strings, arg)
else
2018-10-15 17:24:58 +02:00
table.insert(args.unknowns, arg)
2016-08-07 15:17:33 +02:00
end
end
for i=2, #argv do
if argv[i] then
table.insert(args.other, argv[i])
end
2016-08-07 15:17:33 +02:00
end
-- checks permissions
2019-01-26 07:21:05 +01:00
local player_faction, facname = factions.get_player_faction(player)
if self.infaction and not player_faction then
2019-01-26 07:21:05 +01:00
minetest.chat_send_player(player, "This command is only available within a faction")
2016-08-07 15:17:33 +02:00
return false
end
local one_p = false
2016-08-08 13:46:42 +02:00
if self.faction_permissions then
for i in ipairs(self.faction_permissions) do
2018-10-31 22:15:08 +01:00
local perm = self.faction_permissions[i]
2019-07-21 01:01:54 +02:00
if not self.or_perm and not factions.has_permission(facname, player, perm) then
2019-09-14 21:50:43 +02:00
minetest.chat_send_player(player, "You do not have the faction permission " .. perm)
return false
2019-07-21 01:01:54 +02:00
elseif self.or_perm and factions.has_permission(facname, player, perm) then
one_p = true
break
end
end
2016-08-07 15:17:33 +02:00
end
2019-07-21 01:01:54 +02:00
if self.or_perm and one_p == false then
2019-09-14 21:50:43 +02:00
minetest.chat_send_player(player, "You do not have any of faction permissions required.")
return false
end
2016-08-07 15:17:33 +02:00
-- get some more data
local pos = minetest.get_player_by_name(player):get_pos()
2016-08-14 15:53:40 +02:00
local parcelpos = factions.get_parcel_pos(pos)
return self.on_success(player, player_faction, pos, parcelpos, args)
2016-08-07 15:17:33 +02:00
end,
2016-08-14 15:53:40 +02:00
on_success = function(player, faction, pos, parcelpos, args)
2016-08-07 15:17:33 +02:00
minetest.chat_send_player(player, "Not implemented yet!")
end
2020-01-01 04:33:28 +01:00
}
-- count cmd spaces.
local words = cmd_name:split(" ")
local word_spaces = 0
for k in pairs(words) do
word_spaces = word_spaces + 1
end
cmd.word_spaces = word_spaces
2016-08-07 15:17:33 +02:00
-- override defaults
for k, v in pairs(cmd) do
2016-08-07 19:31:11 +02:00
factions.commands[cmd_name][k] = v
2016-08-07 15:17:33 +02:00
end
end
2020-01-01 03:50:30 +01:00
function factions.register_command(cmd_name, cmd)
local cmd_type = type(cmd_name)
if cmd_type == "string" then
register_command(cmd_name, cmd)
elseif cmd_type == "table" then
for k, v in pairs(cmd_name) do
register_command(v, cmd)
end
end
end
local init_commands
init_commands = function()
2018-10-31 22:15:08 +01:00
if factions_config.faction_user_priv == true then
minetest.register_privilege("faction_user",
{
description = "this user is allowed to interact with faction mod",
give_to_singleplayer = true,
}
)
end
2016-07-30 05:02:22 +02:00
minetest.register_privilege("faction_admin",
{
2016-08-07 19:31:11 +02:00
description = "this user is allowed to create or delete factions",
2016-07-30 05:02:22 +02:00
give_to_singleplayer = true,
}
)
local def_privs = {interact = true}
2018-10-31 22:15:08 +01:00
if factions_config.faction_user_priv == true then
2018-10-28 02:57:15 +01:00
def_privs.faction_user = true
end
minetest.register_chatcommand("f",
2016-07-30 05:02:22 +02:00
{
2018-10-31 22:15:08 +01:00
params = "<command> parameters",
description = "Factions commands. Type /f help for available commands.",
privs = def_privs,
2016-08-07 19:31:11 +02:00
func = factions_chat.cmdhandler,
2016-07-30 05:02:22 +02:00
}
)
minetest.register_chatcommand("faction",
2016-07-30 05:02:22 +02:00
{
params = "<command> parameters",
description = "Factions commands. Type /faction help for available commands.",
2018-10-28 02:57:15 +01:00
privs = def_privs,
func = factions_chat.cmdhandler,
2016-07-30 05:02:22 +02:00
}
)
end
2020-01-01 03:50:30 +01:00
2018-10-28 02:57:15 +01:00
local def_global_privileges = nil
2018-10-31 22:15:08 +01:00
if factions_config.faction_user_priv == true then
2018-10-28 02:57:15 +01:00
minetest.register_on_newplayer(function(player)
local name = player:get_player_name()
local privs = minetest.get_player_privs(name)
privs.faction_user = true
minetest.set_player_privs(name, privs)
2020-01-01 03:50:30 +01:00
end)
2018-10-28 02:57:15 +01:00
def_global_privileges = {"faction_user"}
end
2020-01-01 03:50:30 +01:00
local path = minetest.get_modpath("fac_chat")
dofile(path .. "/commands.lua")
dofile(path .. "/subcommands.lua")
2016-08-07 15:17:33 +02:00
-------------------------------------------------------------------------------
-- name: cmdhandler(playername, parameter)
2016-08-07 15:17:33 +02:00
--
--! @brief chat command handler
2016-08-07 19:31:11 +02:00
--! @memberof factions_chat
2016-08-07 15:17:33 +02:00
--! @private
--
--! @param playername name
--! @param parameter data supplied to command
-------------------------------------------------------------------------------
2020-01-01 03:50:30 +01:00
function factions_chat.cmdhandler(playername, parameter)
2016-08-07 15:17:33 +02:00
local player = minetest.env:get_player_by_name(playername)
local params = parameter:split(" ")
2019-01-26 07:21:05 +01:00
local player_faction, facname = factions.get_player_faction(playername)
2019-07-21 01:01:54 +02:00
if parameter == nil or parameter == "" then
2016-08-07 15:17:33 +02:00
if player_faction then
2019-03-12 00:38:03 +01:00
minetest.chat_send_player(playername, "You are in faction " .. player_faction.name .. ". Type /f help for a list of commands.")
2016-08-07 02:11:17 +02:00
else
minetest.chat_send_player(playername, "You are part of no faction")
2016-08-07 02:11:17 +02:00
end
2016-08-07 15:17:33 +02:00
return
end
2020-01-01 03:50:30 +01:00
--local cmd = factions.commands[params[1]]
local cmd = factions.commands[parameter]
if not cmd then
cmd = factions.commands[params[1]]
if not cmd then
minetest.chat_send_player(playername, "Unknown command.")
return false
end
2020-01-01 04:33:28 +01:00
end
2016-08-07 15:17:33 +02:00
local argv = {}
2020-01-01 04:33:28 +01:00
for i = 1 + cmd.word_spaces, #params, 1 do
2016-08-07 15:17:33 +02:00
table.insert(argv, params[i])
2016-08-07 02:11:17 +02:00
end
2019-07-21 01:01:54 +02:00
cmd:run(playername, argv)
2016-07-30 05:02:22 +02:00
end
function table_Contains(t, v)
for k, a in pairs(t) do
if a == v then
return true
end
end
return false
end
2020-01-01 03:50:30 +01:00
local premade_help = ""
local premade_help_admin = ""
2020-01-01 04:33:28 +01:00
local a_z = {"0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "a", "b", "c", "d", "e"
, "f", "g", "h", "i", "j", "k", "l", "m", "n", "o", "p", "q", "r", "s", "t", "u", "v", "w", "x", "y", "z"}
2019-06-29 21:57:55 +02:00
function factions.create_help_text()
2019-06-27 19:41:37 +02:00
for l, j in pairs(a_z) do
for k, v in pairs(factions.commands) do
if k:sub(1, 1) == j then
if not v.dont_show_in_help then
if not table_Contains(v.global_privileges, "faction_admin") then
premade_help = premade_help .. "\t/f " .. k .. v.description_arg .. " " .. v.description .. "\n"
end
premade_help_admin = premade_help_admin .. "\t/f " .. k .. v.description_arg .. " " .. v.description .. "\n"
end
end
end
end
2019-06-29 21:57:55 +02:00
end
2020-01-01 03:50:30 +01:00
2019-06-29 21:57:55 +02:00
minetest.register_on_mods_loaded(function()
factions.create_help_text()
2019-06-27 19:41:37 +02:00
end)
2016-07-30 05:02:22 +02:00
-------------------------------------------------------------------------------
-- name: show_help(playername, parameter)
2016-07-30 05:02:22 +02:00
--
--! @brief send help message to player
2016-08-07 19:31:11 +02:00
--! @memberof factions_chat
2016-07-30 05:02:22 +02:00
--! @private
--
--! @param playername name
-------------------------------------------------------------------------------
2016-08-07 19:31:11 +02:00
function factions_chat.show_help(playername)
2019-09-14 21:50:43 +02:00
local msg = "factions mod\nUsage:\n"
2019-07-21 01:01:54 +02:00
local has, missing = minetest.check_player_privs(playername, {faction_admin = true})
if has then
2019-09-14 21:50:43 +02:00
msg = msg .. premade_help_admin
else
2019-09-14 21:50:43 +02:00
msg = msg .. premade_help
end
2019-09-14 21:50:43 +02:00
minetest.chat_send_player(playername, msg, false)
2016-07-30 22:33:10 +02:00
end
2016-08-07 02:11:17 +02:00
init_commands()