diff --git a/luascripts/admin/admin.lua b/luascripts/admin/admin.lua index 20cbedf..803275b 100644 --- a/luascripts/admin/admin.lua +++ b/luascripts/admin/admin.lua @@ -20,6 +20,8 @@ local events = require "luascripts.wolfadmin.util.events" local settings = require "luascripts.wolfadmin.util.settings" local files = require "luascripts.wolfadmin.util.files" local db = require "luascripts.wolfadmin.db.db" + +local players = require "luascripts.wolfadmin.players.players" local stats = require "luascripts.wolfadmin.players.stats" local admin = {} @@ -74,38 +76,6 @@ function admin.unlockPlayer(clientId) stats.set(clientId, "teamLock", false) end -function admin.updatePlayer(clientId) - local player = db.getplayer(stats.get(clientId, "playerGUID")) - - if player then - local guid = stats.get(clientId, "playerGUID") - local ip = stats.get(clientId, "playerIP") - - db.updateplayer(guid, ip) - else - local guid = stats.get(clientId, "playerGUID") - local ip = stats.get(clientId, "playerIP") - - db.addplayer(guid, ip) - admin.setPlayerLevel(clientId, et.G_shrubbot_level(clientId), 1) - end -end - -function admin.updateAlias(clientId) - local playerid = db.getplayer(stats.get(clientId, "playerGUID"))["id"] - local name = stats.get(clientId, "playerName") - local alias = db.getaliasbyname(playerid, name) - - if alias then - db.updatealias(alias["id"], os.time()) - if alias["cleanalias"] == "" then - db.updatecleanalias(alias["id"], name) - end - else - db.addalias(playerid, name, os.time()) - end -end - function admin.setPlayerLevel(clientId, level, adminId) local playerid = db.getplayer(stats.get(clientId, "playerGUID"))["id"] local adminid = db.getplayer(stats.get(adminId, "playerGUID"))["id"] @@ -113,61 +83,23 @@ function admin.setPlayerLevel(clientId, level, adminId) db.addsetlevel(playerid, level, adminid, os.time()) end +function admin.onconnectattempt(clientId, firstTime, isBot) + if firstTime then + if stats.get(clientId, "playerGUID") == "NO_GUID" or stats.get(clientId, "playerGUID") == "unknown" then + return "\n\nIt appears you do not have a ^7GUID^9/^7etkey^9. In order to play on this server, enable ^7PunkBuster ^9(use ^7\\pb_cl_enable^9) ^9and/or create an ^7etkey^9.\n\nMore info: ^7www.etkey.org" + end + end + + events.trigger("onClientConnect", clientId, firstTime, isBot) +end +events.handle("onClientConnectAttempt", admin.onconnectattempt) + function admin.onconnect(clientId, firstTime, isBot) -- only increase the counter on first connection (fixes counter increase on -- clientbegin which is also triggered on warmup/maprestart/etc) stats.set(clientId, "namechangeStart", os.time()) stats.set(clientId, "namechangePts", 0) - - if firstTime then - if stats.get(clientId, "playerGUID") == "NO_GUID" or stats.get(clientId, "playerGUID") == "unknown" then - return "\n\nIt appears you do not have a ^7GUID^9/^7etkey^9. In order to play on this server, enable ^7PunkBuster ^9(use ^7\\pb_cl_enable^9) ^9and/or create an ^7etkey^9.\n\nMore info: ^7www.etkey.org" - end - - if db.isconnected() then - admin.updatePlayer(clientId) - admin.updateAlias(clientId) - end - end end events.handle("onClientConnect", admin.onconnect) -function stats.oninfochange(clientId) - local clientInfo = et.trap_GetUserinfo(clientId) - local old = stats.get(clientId, "playerName") - local new = et.Info_ValueForKey(clientInfo, "name") - - 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 stats.get(clientId, "namechangeForce") then - stats.set(clientId, "namechangeForce", true) - - clientInfo = et.Info_SetValueForKey(clientInfo, "name", old) - et.trap_SetUserinfo(clientId, clientInfo) - et.ClientUserinfoChanged(clientId) - - stats.set(clientId, "namechangeForce", false) - - et.trap_SendServerCommand(clientId, "cp \"Too many name changes in 1 minute.\";") - else - stats.set(clientId, "playerName", new) - - if (os.time() - stats.get(clientId, "namechangeStart")) > settings.get("g_renameInterval") then - stats.set(clientId, "namechangeStart", os.time()) - stats.get(clientId, "namechangePts", 0) - end - - stats.add(clientId, "namechangePts", 1) - - et.trap_SendConsoleCommand(et.EXEC_APPEND, "csay -1 \""..old.." ^7is now known as "..new.."\";") - - if db.isconnected() then - admin.updateAlias(clientId) - end - - events.trigger("onClientNameChange", clientId, old, new) - end - end -end -events.handle("onClientInfoChange", stats.oninfochange) - -return admin \ No newline at end of file +return admin diff --git a/luascripts/game/game.lua b/luascripts/game/game.lua index efaab62..8018183 100644 --- a/luascripts/game/game.lua +++ b/luascripts/game/game.lua @@ -104,11 +104,11 @@ function game.onrevive(clientMedic, clientVictim) end events.handle("onPlayerRevive", game.onrevive) -function game.onbegin(clientId, firstTime) +function game.onready(clientId, firstTime) if firstTime and settings.get("g_welcomeMessage") ~= "" then et.trap_SendConsoleCommand(et.EXEC_APPEND, "cchat "..clientId.." \""..settings.get("g_welcomeMessage").."\";") end end -events.handle("onClientBegin", game.onbegin) +events.handle("onPlayerReady", game.onready) -return game \ No newline at end of file +return game diff --git a/luascripts/main.lua b/luascripts/main.lua index 963ee19..b964601 100644 --- a/luascripts/main.lua +++ b/luascripts/main.lua @@ -38,8 +38,9 @@ local sprees = require "luascripts.wolfadmin.game.sprees" local teams = require "luascripts.wolfadmin.game.teams" local voting = require "luascripts.wolfadmin.game.voting" -local stats = require "luascripts.wolfadmin.players.stats" local greetings = require "luascripts.wolfadmin.players.greetings" +local players = require "luascripts.wolfadmin.players.players" +local stats = require "luascripts.wolfadmin.players.stats" local version = "1.1.0-beta" local release = "26 August 2016" @@ -93,17 +94,11 @@ function et_ConsoleCommand(cmdText) end function et_ClientConnect(clientId, firstTime, isBot) - if firstTime == 1 then - stats.set(clientId, "newConnection", true) - end - - return events.trigger("onClientConnect", clientId, (firstTime == 1), (isBot == 1)) + return events.trigger("onClientConnectAttempt", clientId, (firstTime == 1), (isBot == 1)) end function et_ClientBegin(clientId) - events.trigger("onClientBegin", clientId, stats.get(clientId, "newConnection")) - - stats.set(clientId, "newConnection", false) + events.trigger("onClientBegin", clientId) end function et_ClientDisconnect(clientId) diff --git a/luascripts/players/greetings.lua b/luascripts/players/greetings.lua index 399d378..333a00e 100644 --- a/luascripts/players/greetings.lua +++ b/luascripts/players/greetings.lua @@ -107,12 +107,12 @@ function greetings.oninit(levelTime, randomSeed, restartMap) if settings.get("g_fileGreetings") ~= "" then greetings.load() - events.handle("onClientBegin", greetings.onbegin) + events.handle("onPlayerReady", greetings.onready) end end events.handle("onGameInit", greetings.oninit) -function greetings.onbegin(clientId, firstTime) +function greetings.onready(clientId, firstTime) if firstTime and (not stats.get(clientId, "isBot") or settings.get("g_botGreetings") == 1) then greetings.show(clientId) end diff --git a/luascripts/players/players.lua b/luascripts/players/players.lua new file mode 100644 index 0000000..b876042 --- /dev/null +++ b/luascripts/players/players.lua @@ -0,0 +1,147 @@ + +-- 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 stats = require "luascripts.wolfadmin.players.stats" + +local events = require "luascripts.wolfadmin.util.events" + +local players = {} + +function players.updatePlayer(clientId) + local player = db.getplayer(stats.get(clientId, "playerGUID")) + + if player then + local guid = stats.get(clientId, "playerGUID") + local ip = stats.get(clientId, "playerIP") + + db.updateplayer(guid, ip) + else + local guid = stats.get(clientId, "playerGUID") + local ip = stats.get(clientId, "playerIP") + + db.addplayer(guid, ip) + -- admin.setPlayerLevel(clientId, et.G_shrubbot_level(clientId), 1) + end +end + +function players.updateAlias(clientId) + local playerid = db.getplayer(stats.get(clientId, "playerGUID"))["id"] + local name = stats.get(clientId, "playerName") + local alias = db.getaliasbyname(playerid, name) + + if alias then + db.updatealias(alias["id"], os.time()) + if alias["cleanalias"] == "" then + db.updatecleanalias(alias["id"], name) + end + else + db.addalias(playerid, name, os.time()) + end +end + +function players.onconnect(clientId, firstTime, isBot) + local clientInfo = et.trap_GetUserinfo(clientId) + + -- name is NOT yet set in pers.netname, so get all info out of infostring + stats.set(clientId, "playerName", et.Info_ValueForKey(clientInfo, "name")) + stats.set(clientId, "playerGUID", et.Info_ValueForKey(clientInfo, "cl_guid")) + stats.set(clientId, "playerIP", string.gsub(et.Info_ValueForKey(clientInfo, "ip"), ":%d*", "")) + stats.set(clientId, "playerTeam", tonumber(et.gentity_get(clientId, "sess.sessionTeam"))) + stats.set(clientId, "isBot", isBot) + + if firstTime == 1 then + stats.set(clientId, "newConnection", true) + + if db.isconnected() then + players.updatePlayer(clientId) + players.updateAlias(clientId) + 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.trigger("onPlayerReady", clientId, stats.get(clientId, "newConnection")) + + stats.set(clientId, "newConnection", false) +end +events.handle("onClientBegin", players.onbegin) + +function players.ondisconnect(clientId) + stats.remove(clientId) +end +events.handle("onClientDisconnect", players.ondisconnect) + +-- TODO: split into admin-side and player-side event? +function players.oninfochange(clientId) + local clientInfo = et.trap_GetUserinfo(clientId) + local old = stats.get(clientId, "playerName") + local new = et.Info_ValueForKey(clientInfo, "name") + + 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 stats.get(clientId, "namechangeForce") then + stats.set(clientId, "namechangeForce", true) + + clientInfo = et.Info_SetValueForKey(clientInfo, "name", old) + et.trap_SetUserinfo(clientId, clientInfo) + et.ClientUserinfoChanged(clientId) + + stats.set(clientId, "namechangeForce", false) + + et.trap_SendServerCommand(clientId, "cp \"Too many name changes in 1 minute.\";") + else + stats.set(clientId, "playerName", new) + + if (os.time() - stats.get(clientId, "namechangeStart")) > settings.get("g_renameInterval") then + stats.set(clientId, "namechangeStart", os.time()) + stats.get(clientId, "namechangePts", 0) + end + + stats.add(clientId, "namechangePts", 1) + + et.trap_SendConsoleCommand(et.EXEC_APPEND, "csay -1 \""..old.." ^7is now known as "..new.."\";") + + if db.isconnected() then + players.updateAlias(clientId) + end + + events.trigger("onClientNameChange", clientId, old, new) + end + end +end +events.handle("onClientInfoChange", players.oninfochange) + +function players.onteamchange(clientId) + local clientInfo = et.trap_GetUserinfo(clientId) + local old = stats.get(clientId, "playerTeam") + local new = tonumber(et.gentity_get(clientId, "sess.sessionTeam")) + + if new ~= old then + stats.set(clientId, "playerTeam", new) + + events.trigger("onClientTeamChange", clientId, old, new) + end +end +events.handle("onClientInfoChange", players.onteamchange) + +return players diff --git a/luascripts/players/stats.lua b/luascripts/players/stats.lua index bb498b4..110f046 100644 --- a/luascripts/players/stats.lua +++ b/luascripts/players/stats.lua @@ -15,8 +15,6 @@ -- You should have received a copy of the GNU General Public License -- along with this program. If not, see . -local events = require "luascripts.wolfadmin.util.events" - local stats = {} local data = {[-1337] = {["playerGUID"] = "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX"}} @@ -74,38 +72,4 @@ function stats.remove(clientId) return true end -function stats.onconnect(clientId, firstTime, isBot) - local clientInfo = et.trap_GetUserinfo(clientId) - - -- name is NOT yet set in pers.netname, so get all info out of infostring - stats.set(clientId, "playerName", et.Info_ValueForKey(clientInfo, "name")) - stats.set(clientId, "playerGUID", et.Info_ValueForKey(clientInfo, "cl_guid")) - stats.set(clientId, "playerIP", string.gsub(et.Info_ValueForKey(clientInfo, "ip"), ":%d*", "")) - stats.set(clientId, "playerTeam", tonumber(et.gentity_get(clientId, "sess.sessionTeam"))) - stats.set(clientId, "isBot", isBot) - - if firstTime then - stats.set(clientId, "voiceMute", false) - end -end -events.handle("onClientConnect", stats.onconnect) - -function stats.ondisconnect(clientId) - stats.remove(clientId) -end -events.handle("onClientDisconnect", stats.ondisconnect) - -function stats.onteamchange(clientId) - local clientInfo = et.trap_GetUserinfo(clientId) - local old = stats.get(clientId, "playerTeam") - local new = tonumber(et.gentity_get(clientId, "sess.sessionTeam")) - - if new ~= old then - stats.set(clientId, "playerTeam", new) - - events.trigger("onClientTeamChange", clientId, old, new) - end -end -events.handle("onClientInfoChange", stats.onteamchange) - -return stats \ No newline at end of file +return stats diff --git a/luascripts/util/events.lua b/luascripts/util/events.lua index 2eb9d49..fec8762 100644 --- a/luascripts/util/events.lua +++ b/luascripts/util/events.lua @@ -104,6 +104,7 @@ events.add("onCallvote") events.add("onPollStart") events.add("onPollFinish") +events.add("onClientConnectAttempt") events.add("onClientConnect") events.add("onClientDisconnect") events.add("onClientBegin") @@ -117,6 +118,7 @@ events.add("onGameStateChange") events.add("onGameFrame") events.add("onGameShutdown") +events.add("onPlayerReady") events.add("onPlayerSpawn") events.add("onPlayerDeath") events.add("onPlayerRevive") @@ -125,4 +127,4 @@ events.add("onPlayerSkillUpdate") events.add("onServerCommand") -return events \ No newline at end of file +return events