From 03b18f9c0a0b52789c0dae635055596ab5fff6f1 Mon Sep 17 00:00:00 2001 From: Timo Smit Date: Wed, 7 Sep 2016 18:52:48 +0200 Subject: [PATCH] (Re-)implemented muting and player locking --- luascripts/admin/admin.lua | 48 ---------------- luascripts/commands/admin/mute.lua | 82 +++++++++++++++++++++++++++ luascripts/commands/admin/plock.lua | 11 ++-- luascripts/commands/admin/punlock.lua | 11 ++-- luascripts/commands/admin/unmute.lua | 57 +++++++++++++++++++ luascripts/commands/admin/vmute.lua | 11 ++-- luascripts/commands/admin/vunmute.lua | 8 ++- luascripts/commands/commands.lua | 6 +- luascripts/players/players.lua | 39 +++++++++---- 9 files changed, 197 insertions(+), 76 deletions(-) create mode 100644 luascripts/commands/admin/mute.lua create mode 100644 luascripts/commands/admin/unmute.lua diff --git a/luascripts/admin/admin.lua b/luascripts/admin/admin.lua index 102472e..047b687 100644 --- a/luascripts/admin/admin.lua +++ b/luascripts/admin/admin.lua @@ -33,38 +33,6 @@ local teamLocks = { [constants.TEAM_SPECTATORS] = false, } -function admin.isPlayerMuted(clientId) - -- return players.isPlayerMuted(clientId) -end - -function admin.mutePlayer(clientId, length) - -- -end - -function admin.unmutePlayer(clientId) - -- -end - -function admin.isVoiceMuted(clientId) - if stats.get(clientId, "voiceMute") then - if stats.get(clientId, "voiceMute") - os.time() > 0 then - return true - else - admin.unmuteVoice(clientId) - end - end - - return false -end - -function admin.muteVoice(clientId, length) - stats.set(clientId, "voiceMute", length) -end - -function admin.unmuteVoice(clientId) - stats.set(clientId, "voiceMute", false) -end - function admin.putPlayer(clientId, teamId) et.trap_SendConsoleCommand(et.EXEC_APPEND, "forceteam "..clientId.." "..util.getTeamCode(teamId)..";") end @@ -77,22 +45,6 @@ function admin.unlockTeam(teamId) teamLocks[teamId] = false end -function admin.isPlayerLocked(clientId) - if stats.get(clientId, "teamLock") then - return true - end - - return false -end - -function admin.lockPlayer(clientId) - stats.set(clientId, "teamLock", true) -end - -function admin.unlockPlayer(clientId) - stats.set(clientId, "teamLock", false) -end - function admin.setPlayerLevel(clientId, level, adminId) local playerid = db.getplayer(players.getGUID(clientId))["id"] local adminid = db.getplayer(players.getGUID(clientId))["id"] diff --git a/luascripts/commands/admin/mute.lua b/luascripts/commands/admin/mute.lua new file mode 100644 index 0000000..10510f2 --- /dev/null +++ b/luascripts/commands/admin/mute.lua @@ -0,0 +1,82 @@ + +-- WolfAdmin module for Wolfenstein: Enemy Territory servers. +-- Copyright (C) 2015-2016 Timo 'Timothy' Smit + +-- This program is free software: you can redistribute it and/or modify +-- it under the terms of the GNU General Public License as published by +-- the Free Software Foundation, either version 3 of the License, or +-- at your option any later version. + +-- This program is distributed in the hope that it will be useful, +-- but WITHOUT ANY WARRANTY; without even the implied warranty of +-- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +-- GNU General Public License for more details. + +-- You should have received a copy of the GNU General Public License +-- along with this program. If not, see . + +local auth = require "luascripts.wolfadmin.auth.auth" + +local commands = require "luascripts.wolfadmin.commands.commands" + +local players = require "luascripts.wolfadmin.players.players" + +local util = require "luascripts.wolfadmin.util.util" + +function commandMute(clientId, cmdArguments) + if cmdArguments[1] == nil then + et.trap_SendConsoleCommand(et.EXEC_APPEND, "csay "..clientId.." \"^dmute usage: "..commands.getadmin("mute")["syntax"].."\";") + + return true + elseif tonumber(cmdArguments[1]) == nil then + cmdClient = et.ClientNumberFromString(cmdArguments[1]) + else + cmdClient = tonumber(cmdArguments[1]) + end + + if cmdClient == -1 then + et.trap_SendConsoleCommand(et.EXEC_APPEND, "csay "..clientId.." \"^dmute: ^9no or multiple matches for '^7"..cmdArguments[1].."^9'.\";") + + return true + elseif not et.gentity_get(cmdClient, "pers.netname") then + et.trap_SendConsoleCommand(et.EXEC_APPEND, "csay "..clientId.." \"^dmute: ^9no connected player by that name or slot #\";") + + return true + end + + local muteTime, muteReason = 600, "muted by admin" + + if cmdArguments[2] and util.getTimeFromString(cmdArguments[2]) and cmdArguments[3] then + muteTime = util.getTimeFromString(cmdArguments[2]) + muteReason = table.concat(cmdArguments, " ", 3) + elseif cmdArguments[2] and util.getTimeFromString(cmdArguments[2]) then + muteTime = util.getTimeFromString(cmdArguments[2]) + elseif cmdArguments[2] then + muteReason = table.concat(cmdArguments, " ", 2) + elseif auth.isallowed(clientId, "8") ~= 1 then + et.trap_SendConsoleCommand(et.EXEC_APPEND, "csay "..clientId.." \"^dmute usage: "..commands.getadmin("mute")["syntax"].."\";") + + return true + end + + if players.isPlayerMuted(cmdClient) then + et.trap_SendConsoleCommand(et.EXEC_APPEND, "csay "..clientId.." \"^dmute: ^7"..et.gentity_get(cmdClient, "pers.netname").." ^9is already muted.\";") + + return true + elseif auth.isallowed(cmdClient, "!") == 1 then + et.trap_SendConsoleCommand(et.EXEC_APPEND, "csay "..clientId.." \"^dmute: ^7"..et.gentity_get(cmdClient, "pers.netname").." ^9is immune to this command.\";") + + return true + elseif auth.getlevel(cmdClient) > auth.getlevel(clientId) then + et.trap_SendConsoleCommand(et.EXEC_APPEND, "csay "..clientId.." \"^dmute: ^9sorry, but your intended victim has a higher admin level than you do.\";") + + return true + end + + et.trap_SendConsoleCommand(et.EXEC_APPEND, "chat \"^dmute: ^7"..et.gentity_get(cmdClient, "pers.netname").." ^9has been muted for "..muteTime.." seconds\";") + + players.setPlayerMuted(cmdClient, true, players.MUTE_CHAT + players.MUTE_VOICE, os.time(), muteTime) + + return true +end +commands.addadmin("mute", commandMute, auth.PERM_MUTE, "voicemutes a player", "^9[^3name|slot#^9]") diff --git a/luascripts/commands/admin/plock.lua b/luascripts/commands/admin/plock.lua index fa20e09..465a430 100644 --- a/luascripts/commands/admin/plock.lua +++ b/luascripts/commands/admin/plock.lua @@ -16,11 +16,14 @@ -- along with this program. If not, see . local auth = require "luascripts.wolfadmin.auth.auth" -local util = require "luascripts.wolfadmin.util.util" + local commands = require "luascripts.wolfadmin.commands.commands" -local admin = require "luascripts.wolfadmin.admin.admin" + +local players = require "luascripts.wolfadmin.players.players" local stats = require "luascripts.wolfadmin.players.stats" +local util = require "luascripts.wolfadmin.util.util" + function commandPlayerLock(clientId, cmdArguments) if cmdArguments[1] == nil then et.trap_SendConsoleCommand(et.EXEC_APPEND, "csay "..clientId.." \"^dplock usage: "..commands.getadmin("plock")["syntax"].."\";") @@ -42,7 +45,7 @@ function commandPlayerLock(clientId, cmdArguments) return true end - if admin.isPlayerLocked(cmdClient) then + if players.isPlayerTeamLocked(cmdClient) then et.trap_SendConsoleCommand(et.EXEC_APPEND, "csay "..clientId.." \"^dplock: ^7"..et.gentity_get(cmdClient, "pers.netname").." ^9is already locked to a team.\";") return true @@ -58,7 +61,7 @@ function commandPlayerLock(clientId, cmdArguments) et.trap_SendConsoleCommand(et.EXEC_APPEND, "chat \"^dplock: ^7"..et.gentity_get(cmdClient, "pers.netname").." ^9has been locked to his team\";") - admin.lockPlayer(cmdClient) + players.setPlayerTeamLocked(cmdClient, true) return true end diff --git a/luascripts/commands/admin/punlock.lua b/luascripts/commands/admin/punlock.lua index 5c34522..6626f39 100644 --- a/luascripts/commands/admin/punlock.lua +++ b/luascripts/commands/admin/punlock.lua @@ -16,11 +16,14 @@ -- along with this program. If not, see . local auth = require "luascripts.wolfadmin.auth.auth" -local util = require "luascripts.wolfadmin.util.util" + local commands = require "luascripts.wolfadmin.commands.commands" -local admin = require "luascripts.wolfadmin.admin.admin" + +local players = require "luascripts.wolfadmin.players.players" local stats = require "luascripts.wolfadmin.players.stats" +local util = require "luascripts.wolfadmin.util.util" + function commandPlayerUnlock(clientId, cmdArguments) if cmdArguments[1] == nil then et.trap_SendConsoleCommand(et.EXEC_APPEND, "csay "..clientId.." \"^dpunlock usage: "..commands.getadmin("punlock")["syntax"].."\";") @@ -42,7 +45,7 @@ function commandPlayerUnlock(clientId, cmdArguments) return true end - if not admin.isPlayerLocked(cmdClient) then + if not players.isPlayerTeamLocked(cmdClient) then et.trap_SendConsoleCommand(et.EXEC_APPEND, "csay "..clientId.." \"^dpunlock: ^9no player by that name or slot # is locked to a team\";") return true @@ -50,7 +53,7 @@ function commandPlayerUnlock(clientId, cmdArguments) et.trap_SendConsoleCommand(et.EXEC_APPEND, "chat \"^dpunlock: ^7"..et.gentity_get(cmdClient, "pers.netname").." ^9has been unlocked from his team\";") - admin.unlockPlayer(cmdClient) + players.setPlayerTeamLocked(cmdClient, false) return true end diff --git a/luascripts/commands/admin/unmute.lua b/luascripts/commands/admin/unmute.lua new file mode 100644 index 0000000..0467874 --- /dev/null +++ b/luascripts/commands/admin/unmute.lua @@ -0,0 +1,57 @@ + +-- WolfAdmin module for Wolfenstein: Enemy Territory servers. +-- Copyright (C) 2015-2016 Timo 'Timothy' Smit + +-- This program is free software: you can redistribute it and/or modify +-- it under the terms of the GNU General Public License as published by +-- the Free Software Foundation, either version 3 of the License, or +-- at your option any later version. + +-- This program is distributed in the hope that it will be useful, +-- but WITHOUT ANY WARRANTY; without even the implied warranty of +-- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +-- GNU General Public License for more details. + +-- You should have received a copy of the GNU General Public License +-- along with this program. If not, see . + +local auth = require "luascripts.wolfadmin.auth.auth" + +local commands = require "luascripts.wolfadmin.commands.commands" + +local players = require "luascripts.wolfadmin.players.players" + +function commandUnmute(clientId, cmdArguments) + if cmdArguments[1] == nil then + et.trap_SendConsoleCommand(et.EXEC_APPEND, "csay "..clientId.." \"^dunmute usage: "..commands.getadmin("unmute")["syntax"].."\";") + + return true + elseif tonumber(cmdArguments[1]) == nil then + cmdClient = et.ClientNumberFromString(cmdArguments[1]) + else + cmdClient = tonumber(cmdArguments[1]) + end + + if cmdClient == -1 then + et.trap_SendConsoleCommand(et.EXEC_APPEND, "csay "..clientId.." \"^dunmute: ^9no or multiple matches for '^7"..cmdArguments[1].."^9'.\";") + + return true + elseif not et.gentity_get(cmdClient, "pers.netname") then + et.trap_SendConsoleCommand(et.EXEC_APPEND, "csay "..clientId.." \"^dunmute: ^9no connected player by that name or slot #\";") + + return true + end + + if not players.isPlayerMuted(cmdClient) then + et.trap_SendConsoleCommand(et.EXEC_APPEND, "csay "..clientId.." \"^dunmute: ^9no player by that name or slot # is muted\";") + + return true + end + + et.trap_SendConsoleCommand(et.EXEC_APPEND, "chat \"^dunmute: ^7"..et.gentity_get(cmdClient, "pers.netname").." ^9has been unmuted\";") + + players.setPlayerMuted(cmdClient, false) + + return true +end +commands.addadmin("unmute", commandUnmute, auth.PERM_MUTE, "unvoicemutes a player", "^9[^3name|slot#^9]") diff --git a/luascripts/commands/admin/vmute.lua b/luascripts/commands/admin/vmute.lua index d685ac7..73573dd 100644 --- a/luascripts/commands/admin/vmute.lua +++ b/luascripts/commands/admin/vmute.lua @@ -16,9 +16,12 @@ -- along with this program. If not, see . local auth = require "luascripts.wolfadmin.auth.auth" -local util = require "luascripts.wolfadmin.util.util" + local commands = require "luascripts.wolfadmin.commands.commands" -local admin = require "luascripts.wolfadmin.admin.admin" + +local players = require "luascripts.wolfadmin.players.players" + +local util = require "luascripts.wolfadmin.util.util" function commandVoiceMute(clientId, cmdArguments) if cmdArguments[1] == nil then @@ -56,7 +59,7 @@ function commandVoiceMute(clientId, cmdArguments) return true end - if admin.isVoiceMuted(cmdClient) then + if players.isPlayerMuted(cmdClient) then et.trap_SendConsoleCommand(et.EXEC_APPEND, "csay "..clientId.." \"^dvmute: ^7"..et.gentity_get(cmdClient, "pers.netname").." ^9is already muted.\";") return true @@ -72,7 +75,7 @@ function commandVoiceMute(clientId, cmdArguments) et.trap_SendConsoleCommand(et.EXEC_APPEND, "chat \"^dvmute: ^7"..et.gentity_get(cmdClient, "pers.netname").." ^9has been voicemuted for "..vmuteTime.." seconds\";") - admin.muteVoice(cmdClient, os.time() + vmuteTime) + players.setPlayerMuted(cmdClient, true, players.MUTE_VOICE, os.time(), vmuteTime) return true end diff --git a/luascripts/commands/admin/vunmute.lua b/luascripts/commands/admin/vunmute.lua index 4f83d95..f8aa640 100644 --- a/luascripts/commands/admin/vunmute.lua +++ b/luascripts/commands/admin/vunmute.lua @@ -16,8 +16,10 @@ -- along with this program. If not, see . local auth = require "luascripts.wolfadmin.auth.auth" + local commands = require "luascripts.wolfadmin.commands.commands" -local admin = require "luascripts.wolfadmin.admin.admin" + +local players = require "luascripts.wolfadmin.players.players" function commandVoiceUnmute(clientId, cmdArguments) if cmdArguments[1] == nil then @@ -40,7 +42,7 @@ function commandVoiceUnmute(clientId, cmdArguments) return true end - if not admin.isVoiceMuted(cmdClient) then + if not players.isPlayerMuted(cmdClient) then et.trap_SendConsoleCommand(et.EXEC_APPEND, "csay "..clientId.." \"^dvunmute: ^9no player by that name or slot # is voicemuted\";") return true @@ -48,7 +50,7 @@ function commandVoiceUnmute(clientId, cmdArguments) et.trap_SendConsoleCommand(et.EXEC_APPEND, "chat \"^dvunmute: ^7"..et.gentity_get(cmdClient, "pers.netname").." ^9has been unvoicemuted\";") - admin.unmuteVoice(cmdClient) + players.setPlayerMuted(cmdClient, false) return true end diff --git a/luascripts/commands/commands.lua b/luascripts/commands/commands.lua index b4d1705..eadd03b 100644 --- a/luascripts/commands/commands.lua +++ b/luascripts/commands/commands.lua @@ -210,7 +210,7 @@ function commands.onclientcommand(clientId, cmdText) -- all Wolfenstein-related commands defined separately for now if wolfCmd == "team" then - if admin.isPlayerLocked(clientId) then + if players.isPlayerTeamLocked(clientId) then local clientTeam = tonumber(et.gentity_get(clientId, "sess.sessionTeam")) local teamName = util.getTeamName(clientTeam) local teamColor = util.getTeamColor(clientTeam) @@ -231,13 +231,13 @@ function commands.onclientcommand(clientId, cmdText) return events.trigger("onCallvote", clientId, et.trap_Argv(1), voteArguments) elseif wolfCmd == "say" or wolfCmd == "say_team" or wolfCmd == "say_teamnl" or wolfCmd == "say_buddy" then - if et.gentity_get(clientId, "sess.muted") == 1 then + if players.isPlayerMuted(clientId, players.MUTE_CHAT) then et.trap_SendServerCommand(clientId, "cp \"^1You are muted\"") return 1 end elseif wolfCmd == "vsay" or wolfCmd == "vsay_team" then - if admin.isVoiceMuted(clientId) then + if players.isPlayerMuted(clientId, players.MUTE_VOICE) then et.trap_SendServerCommand(clientId, "cp \"^1You are voicemuted\"") return 1 diff --git a/luascripts/players/players.lua b/luascripts/players/players.lua index 0a10ab4..df28f8d 100644 --- a/luascripts/players/players.lua +++ b/luascripts/players/players.lua @@ -17,10 +17,14 @@ local db = require "luascripts.wolfadmin.db.db" +local bits = require "luascripts.wolfadmin.util.bits" local events = require "luascripts.wolfadmin.util.events" local players = {} +players.MUTE_CHAT = 1 +players.MUTE_VOICE = 2 + local data = {} function players.isConnected(clientId) @@ -47,25 +51,40 @@ function players.isBot(clientId) return data[clientId]["bot"] end -function players.setPlayerMuted(clientId, state, type, duration) - data[clientId]["mute"] = state +function players.setPlayerMuted(clientId, state, type, issued, expires) + data[clientId]["mute"] = nil if state == true then - data[clientId]["mutetype"] = type - data[clientId]["muteduration"] = duration + data[clientId]["mute"] = { + ["type"] = type, + ["issued"] = issued, + ["expires"] = expires + } end end -function players.isPlayerMuted(clientId) - return data[clientId]["mute"] +function players.isPlayerMuted(clientId, type) + if type == nil then + return data[clientId]["mute"] ~= nil + elseif type == players.MUTE_CHAT then + return data[clientId]["mute"] ~= nil and bits.hasbit(data[clientId]["mute"]["type"], players.MUTE_CHAT) + elseif type == players.MUTE_VOICE then + return data[clientId]["mute"] ~= nil and bits.hasbit(data[clientId]["mute"]["type"], players.MUTE_VOICE) + end + + return false end -function players.getPlayerMuteType(clientId, state, type, duration) - return data[clientId]["mutetype"] +function players.getPlayerMuteType(clientId) + return data[clientId]["mute"]["type"] end -function players.getPlayerMuteDuration(clientId, state, type, duration) - return data[clientId]["muteduration"] +function players.getPlayerMuteIssuedAt(clientId) + return data[clientId]["mute"]["issued"] +end + +function players.getPlayerMuteExpiresAt(clientId) + return data[clientId]["mute"]["expires"] end function players.setPlayerTeamLocked(clientId, state)