mirror of
https://github.com/etlegacy/wolfadmin.git
synced 2024-11-21 20:01:18 +00:00
Fixed rename limit (refs #46)
* moved name change detection to players module * rename limit now kicks instead of name forcing * rename limit now actually calculates over past minute (approximately) * removed g_renameInterval, obsolete
This commit is contained in:
parent
d7d5565355
commit
4a80ab729b
3 changed files with 60 additions and 84 deletions
|
@ -18,16 +18,15 @@
|
|||
local db = require (wolfa_getLuaPath()..".db.db")
|
||||
|
||||
local players = require (wolfa_getLuaPath()..".players.players")
|
||||
-- local stats = require (wolfa_getLuaPath()..".players.stats")
|
||||
|
||||
local constants = require (wolfa_getLuaPath()..".util.constants")
|
||||
local events = require (wolfa_getLuaPath()..".util.events")
|
||||
local files = require (wolfa_getLuaPath()..".util.files")
|
||||
local settings = require (wolfa_getLuaPath()..".util.settings")
|
||||
local util = require (wolfa_getLuaPath()..".util.util")
|
||||
|
||||
local admin = {}
|
||||
|
||||
local playerRenames = {}
|
||||
|
||||
function admin.putPlayer(clientId, teamId)
|
||||
et.trap_SendConsoleCommand(et.EXEC_APPEND, "forceteam "..clientId.." "..util.getTeamCode(teamId)..";")
|
||||
end
|
||||
|
@ -86,37 +85,46 @@ function admin.onconnect(clientId, firstTime, isBot)
|
|||
end
|
||||
events.handle("onClientConnect", admin.onconnect)
|
||||
|
||||
function players.oninfochange(clientId)
|
||||
local clientInfo = et.trap_GetUserinfo(clientId)
|
||||
function admin.onClientNameChange(clientId, oldName, newName)
|
||||
-- rename filter
|
||||
if not playerRenames[clientId] or playerRenames[clientId]["last"] < os.time() - 60 then
|
||||
playerRenames[clientId] = {
|
||||
["first"] = os.time(),
|
||||
["last"] = os.time(),
|
||||
["count"] = 1
|
||||
}
|
||||
else
|
||||
playerRenames[clientId]["count"] = playerRenames[clientId]["count"] + 1
|
||||
playerRenames[clientId]["last"] = os.time()
|
||||
|
||||
local old = players.getCachedName(clientId)
|
||||
local new = et.Info_ValueForKey(clientInfo, "name")
|
||||
-- give them some time
|
||||
if (playerRenames[clientId]["last"] - playerRenames[clientId]["first"]) > 3 then
|
||||
local renamesPerMinute = playerRenames[clientId]["count"] / (playerRenames[clientId]["last"] - playerRenames[clientId]["first"]) * 60
|
||||
|
||||
-- TODO fix for Legacy
|
||||
-- prints messages by itself, also when rename is rejected - not desirable
|
||||
--[[ if new ~= old then
|
||||
if (os.time() - stats.get(clientId, "namechangeStart")) < settings.get("g_renameInterval") and stats.get(clientId, "namechangePts") >= settings.get("g_renameLimit") and not players.isNameForced(clientId) then
|
||||
players.setNameForced(clientId, true)
|
||||
|
||||
clientInfo = et.Info_SetValueForKey(clientInfo, "name", old)
|
||||
et.trap_SetUserinfo(clientId, clientInfo)
|
||||
et.ClientUserinfoChanged(clientId)
|
||||
|
||||
players.setNameForced(clientId, false)
|
||||
|
||||
et.trap_SendServerCommand(clientId, "cp \"Too many name changes in 1 minute.\";")
|
||||
else
|
||||
if (os.time() - stats.get(clientId, "namechangeStart")) > settings.get("g_renameInterval") then
|
||||
stats.set(clientId, "namechangeStart", os.time())
|
||||
stats.get(clientId, "namechangePts", 0)
|
||||
if renamesPerMinute > settings.get("g_renameLimit") then
|
||||
admin.kickPlayer(clientId, -1337, "Too many name changes.")
|
||||
end
|
||||
|
||||
stats.add(clientId, "namechangePts", 1)
|
||||
|
||||
events.trigger("onClientNameChange", clientId, old, new)
|
||||
end
|
||||
end ]]
|
||||
end
|
||||
|
||||
-- on some mods, this message is already printed
|
||||
-- known: old NQ versions, Legacy
|
||||
if et.trap_Cvar_Get("fs_game") ~= "legacy" then
|
||||
et.trap_SendConsoleCommand(et.EXEC_APPEND, "csay -1 \""..oldName.." ^7is now known as "..newName.."\";")
|
||||
end
|
||||
|
||||
-- update database
|
||||
if db.isconnected() then
|
||||
local playerId = db.getplayer(players.getGUID(clientId))["id"]
|
||||
local alias = db.getaliasbyname(playerId, newName)
|
||||
|
||||
if alias then
|
||||
db.updatealias(alias["id"], os.time())
|
||||
else
|
||||
db.addalias(playerId, newName, os.time())
|
||||
end
|
||||
end
|
||||
end
|
||||
events.handle("onClientInfoChange", players.oninfochange)
|
||||
events.handle("onClientNameChange", admin.onClientNameChange)
|
||||
|
||||
return admin
|
||||
|
|
|
@ -31,10 +31,6 @@ function players.isConnected(clientId)
|
|||
return (data[clientId] ~= nil)
|
||||
end
|
||||
|
||||
function players.getCachedName(clientId)
|
||||
return data[clientId]["name"]
|
||||
end
|
||||
|
||||
function players.getName(clientId)
|
||||
if clientId == -1337 then
|
||||
return "console"
|
||||
|
@ -67,14 +63,6 @@ function players.getLastPMSender(clientId)
|
|||
return data[clientId]["lastpmsender"]
|
||||
end
|
||||
|
||||
function players.setNameForced(clientId, state)
|
||||
data[clientId]["nameforced"] = state
|
||||
end
|
||||
|
||||
function players.isNameForced(clientId)
|
||||
return data[clientId]["nameforced"]
|
||||
end
|
||||
|
||||
function players.setMuted(clientId, state, type, issued, expires)
|
||||
data[clientId]["mute"] = nil
|
||||
|
||||
|
@ -119,7 +107,7 @@ function players.isTeamLocked(clientId)
|
|||
return data[clientId]["teamlock"]
|
||||
end
|
||||
|
||||
function players.onconnect(clientId, firstTime, isBot)
|
||||
function players.onClientConnect(clientId, firstTime, isBot)
|
||||
local clientInfo = et.trap_GetUserinfo(clientId)
|
||||
|
||||
-- name is NOT yet set in pers.netname, so get all info out of infostring
|
||||
|
@ -159,58 +147,39 @@ function players.onconnect(clientId, firstTime, isBot)
|
|||
end
|
||||
end
|
||||
end
|
||||
events.handle("onClientConnect", players.onconnect)
|
||||
|
||||
function players.onbegin(clientId)
|
||||
-- TODO:
|
||||
-- new approach: load necessary data in onClientConnect event handlers,
|
||||
-- load rest in onClientBegin handlers (avoids useless loading of stats,
|
||||
-- less coupling between main.lua and stats.lua)
|
||||
-- ensures that all data is loaded from this moment on
|
||||
events.handle("onClientConnect", players.onClientConnect)
|
||||
|
||||
function players.onClientBegin(clientId)
|
||||
events.trigger("onPlayerReady", clientId, data[clientId]["new"])
|
||||
|
||||
data[clientId]["new"] = false
|
||||
end
|
||||
events.handle("onClientBegin", players.onbegin)
|
||||
events.handle("onClientBegin", players.onClientBegin)
|
||||
|
||||
function players.ondisconnect(clientId)
|
||||
function players.onClientDisconnect(clientId)
|
||||
data[clientId] = nil
|
||||
end
|
||||
events.handle("onClientDisconnect", players.ondisconnect)
|
||||
events.handle("onClientDisconnect", players.onClientDisconnect)
|
||||
|
||||
function players.onnamechange(clientId, old, new)
|
||||
-- TODO: on some mods, this message is already printed
|
||||
-- known: old NQ versions, Legacy
|
||||
et.trap_SendConsoleCommand(et.EXEC_APPEND, "csay -1 \""..old.." ^7is now known as "..new.."\";")
|
||||
function players.onClientInfoChange(clientId)
|
||||
local oldTeam = data[clientId]["team"]
|
||||
local newTeam = tonumber(et.gentity_get(clientId, "sess.sessionTeam"))
|
||||
|
||||
data[clientId]["name"] = new
|
||||
if newTeam ~= oldTeam then
|
||||
data[clientId]["team"] = newTeam
|
||||
|
||||
if db.isconnected() then
|
||||
local playerid = db.getplayer(players.getGUID(clientId))["id"]
|
||||
local name = players.getName(clientId)
|
||||
local alias = db.getaliasbyname(playerid, name)
|
||||
events.trigger("onClientTeamChange", clientId, oldTeam, newTeam)
|
||||
end
|
||||
|
||||
if alias then
|
||||
db.updatealias(alias["id"], os.time())
|
||||
else
|
||||
db.addalias(playerid, name, os.time())
|
||||
end
|
||||
local oldName = data[clientId]["name"]
|
||||
local newName = et.gentity_get(clientId, "pers.netname")
|
||||
|
||||
if newName ~= oldName then
|
||||
data[clientId]["name"] = newName
|
||||
|
||||
events.trigger("onClientNameChange", clientId, oldName, newName)
|
||||
end
|
||||
end
|
||||
events.handle("onClientNameChange", players.onnamechange)
|
||||
|
||||
function players.oninfochange(clientId)
|
||||
local clientInfo = et.trap_GetUserinfo(clientId)
|
||||
local old = data[clientId]["team"]
|
||||
local new = tonumber(et.gentity_get(clientId, "sess.sessionTeam"))
|
||||
|
||||
if new ~= old then
|
||||
data[clientId]["team"] = new
|
||||
|
||||
events.trigger("onClientTeamChange", clientId, old, new)
|
||||
end
|
||||
end
|
||||
events.handle("onClientInfoChange", players.oninfochange)
|
||||
events.handle("onClientInfoChange", players.onClientInfoChange)
|
||||
|
||||
return players
|
||||
|
|
|
@ -40,8 +40,7 @@ local data = {
|
|||
["g_evenerInterval"] = 30,
|
||||
["g_voteNextMapTimeout"] = 0,
|
||||
["g_restrictedVotes"] = "",
|
||||
["g_renameLimit"] = 3,
|
||||
["g_renameInterval"] = 60,
|
||||
["g_renameLimit"] = 80,
|
||||
["g_standalone"] = 1,
|
||||
["g_debugWolfAdmin"] = 0,
|
||||
["omnibot_maxbots"] = 10,
|
||||
|
|
Loading…
Reference in a new issue