Decoupled player handling from admin and stats module (issue #63)

This commit is contained in:
Timo Smit 2016-09-04 10:20:21 +02:00
parent 06d4413b02
commit 441e4cf7bb
7 changed files with 174 additions and 134 deletions

View file

@ -20,6 +20,8 @@ local events = require "luascripts.wolfadmin.util.events"
local settings = require "luascripts.wolfadmin.util.settings" local settings = require "luascripts.wolfadmin.util.settings"
local files = require "luascripts.wolfadmin.util.files" local files = require "luascripts.wolfadmin.util.files"
local db = require "luascripts.wolfadmin.db.db" local db = require "luascripts.wolfadmin.db.db"
local players = require "luascripts.wolfadmin.players.players"
local stats = require "luascripts.wolfadmin.players.stats" local stats = require "luascripts.wolfadmin.players.stats"
local admin = {} local admin = {}
@ -74,38 +76,6 @@ function admin.unlockPlayer(clientId)
stats.set(clientId, "teamLock", false) stats.set(clientId, "teamLock", false)
end 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) function admin.setPlayerLevel(clientId, level, adminId)
local playerid = db.getplayer(stats.get(clientId, "playerGUID"))["id"] local playerid = db.getplayer(stats.get(clientId, "playerGUID"))["id"]
local adminid = db.getplayer(stats.get(adminId, "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()) db.addsetlevel(playerid, level, adminid, os.time())
end 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) function admin.onconnect(clientId, firstTime, isBot)
-- only increase the counter on first connection (fixes counter increase on -- only increase the counter on first connection (fixes counter increase on
-- clientbegin which is also triggered on warmup/maprestart/etc) -- clientbegin which is also triggered on warmup/maprestart/etc)
stats.set(clientId, "namechangeStart", os.time()) stats.set(clientId, "namechangeStart", os.time())
stats.set(clientId, "namechangePts", 0) 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 end
events.handle("onClientConnect", admin.onconnect) events.handle("onClientConnect", admin.onconnect)
function stats.oninfochange(clientId) return admin
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

View file

@ -104,11 +104,11 @@ function game.onrevive(clientMedic, clientVictim)
end end
events.handle("onPlayerRevive", game.onrevive) events.handle("onPlayerRevive", game.onrevive)
function game.onbegin(clientId, firstTime) function game.onready(clientId, firstTime)
if firstTime and settings.get("g_welcomeMessage") ~= "" then if firstTime and settings.get("g_welcomeMessage") ~= "" then
et.trap_SendConsoleCommand(et.EXEC_APPEND, "cchat "..clientId.." \""..settings.get("g_welcomeMessage").."\";") et.trap_SendConsoleCommand(et.EXEC_APPEND, "cchat "..clientId.." \""..settings.get("g_welcomeMessage").."\";")
end end
end end
events.handle("onClientBegin", game.onbegin) events.handle("onPlayerReady", game.onready)
return game return game

View file

@ -38,8 +38,9 @@ local sprees = require "luascripts.wolfadmin.game.sprees"
local teams = require "luascripts.wolfadmin.game.teams" local teams = require "luascripts.wolfadmin.game.teams"
local voting = require "luascripts.wolfadmin.game.voting" local voting = require "luascripts.wolfadmin.game.voting"
local stats = require "luascripts.wolfadmin.players.stats"
local greetings = require "luascripts.wolfadmin.players.greetings" 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 version = "1.1.0-beta"
local release = "26 August 2016" local release = "26 August 2016"
@ -93,17 +94,11 @@ function et_ConsoleCommand(cmdText)
end end
function et_ClientConnect(clientId, firstTime, isBot) function et_ClientConnect(clientId, firstTime, isBot)
if firstTime == 1 then return events.trigger("onClientConnectAttempt", clientId, (firstTime == 1), (isBot == 1))
stats.set(clientId, "newConnection", true)
end
return events.trigger("onClientConnect", clientId, (firstTime == 1), (isBot == 1))
end end
function et_ClientBegin(clientId) function et_ClientBegin(clientId)
events.trigger("onClientBegin", clientId, stats.get(clientId, "newConnection")) events.trigger("onClientBegin", clientId)
stats.set(clientId, "newConnection", false)
end end
function et_ClientDisconnect(clientId) function et_ClientDisconnect(clientId)

View file

@ -107,12 +107,12 @@ function greetings.oninit(levelTime, randomSeed, restartMap)
if settings.get("g_fileGreetings") ~= "" then if settings.get("g_fileGreetings") ~= "" then
greetings.load() greetings.load()
events.handle("onClientBegin", greetings.onbegin) events.handle("onPlayerReady", greetings.onready)
end end
end end
events.handle("onGameInit", greetings.oninit) 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 if firstTime and (not stats.get(clientId, "isBot") or settings.get("g_botGreetings") == 1) then
greetings.show(clientId) greetings.show(clientId)
end end

View file

@ -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 <http://www.gnu.org/licenses/>.
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

View file

@ -15,8 +15,6 @@
-- You should have received a copy of the GNU General Public License -- You should have received a copy of the GNU General Public License
-- along with this program. If not, see <http://www.gnu.org/licenses/>. -- along with this program. If not, see <http://www.gnu.org/licenses/>.
local events = require "luascripts.wolfadmin.util.events"
local stats = {} local stats = {}
local data = {[-1337] = {["playerGUID"] = "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX"}} local data = {[-1337] = {["playerGUID"] = "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX"}}
@ -74,38 +72,4 @@ function stats.remove(clientId)
return true return true
end end
function stats.onconnect(clientId, firstTime, isBot) return stats
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

View file

@ -104,6 +104,7 @@ events.add("onCallvote")
events.add("onPollStart") events.add("onPollStart")
events.add("onPollFinish") events.add("onPollFinish")
events.add("onClientConnectAttempt")
events.add("onClientConnect") events.add("onClientConnect")
events.add("onClientDisconnect") events.add("onClientDisconnect")
events.add("onClientBegin") events.add("onClientBegin")
@ -117,6 +118,7 @@ events.add("onGameStateChange")
events.add("onGameFrame") events.add("onGameFrame")
events.add("onGameShutdown") events.add("onGameShutdown")
events.add("onPlayerReady")
events.add("onPlayerSpawn") events.add("onPlayerSpawn")
events.add("onPlayerDeath") events.add("onPlayerDeath")
events.add("onPlayerRevive") events.add("onPlayerRevive")
@ -125,4 +127,4 @@ events.add("onPlayerSkillUpdate")
events.add("onServerCommand") events.add("onServerCommand")
return events return events