Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- ESX = nil
- local bancache,namecache = {},{}
- local open_assists,active_assists = {},{}
- function split(s, delimiter)result = {};for match in (s..delimiter):gmatch("(.-)"..delimiter) do table.insert(result, match) end return result end
- Citizen.CreateThread(function() -- startup
- TriggerEvent('esx:getSharedObject', function(obj) ESX = obj end)
- while ESX==nil do Wait(0) end
- MySQL.ready(function()
- refreshNameCache()
- refreshBanCache()
- end)
- sendToDiscord("Démarrage...")
- print("[^1"..GetCurrentResourceName().."^7] Performing version check...")
- PerformHttpRequest("https://api.elipse458.me/resources/checkupdates.php", function(a,b,c)
- local data = json.decode(b)
- if a~=200 then
- print("[^1"..GetCurrentResourceName().."^7] Version check failed!")
- else
- if data and data.updateNeeded then
- print("[^1"..GetCurrentResourceName().."^7] Outdated!")
- print("[^1"..GetCurrentResourceName().."^7] Current version: 1.7 | New version: "..data.newVersion.." | Versions behind: "..data.versionsBehind)
- print("[^1"..GetCurrentResourceName().."^7] Changelog:")
- for k,v in ipairs(data.update.changelog) do
- print("- "..v)
- end
- print("[^1"..GetCurrentResourceName().."^7] Database update needed: "..(data.update.dbUpdateNeeded and "^4Yes^7" or "^1No^7"))
- print("[^1"..GetCurrentResourceName().."^7] Config update needed: "..(data.update.configUpdateNeeded and "^4Yes^7" or "^1No^7"))
- print("[^1"..GetCurrentResourceName().."^7] Update url: ^4"..data.update.releaseUrl.."^7")
- if (type(data.versionsBehind)=="string" or data.versionsBehind>1) and data.update.dbUpdateNeeded then
- print("[^1"..GetCurrentResourceName().."^7] ^1!!^7 You are multiple versions behind, make sure you run update sql files (if any) from all new versions in order of release ^1!!^7")
- end
- sendToDiscord("Update found!\nUpdate url: "..data.update.releaseUrl.."\nCurrent version: 1.7\nNew version: "..data.newVersion.."\nVersions behind: "..data.versionsBehind)
- else
- print("[^1"..GetCurrentResourceName().."^7] No updates found!")
- end
- end
- end, "POST", "resname=el_bwh&ver=1.7")
- ESX.RegisterServerCallback("el_bwh:ban", function(source,cb,target,reason,length,offline)
- if not target or not reason then return end
- local xPlayer = ESX.GetPlayerFromId(source)
- local xTarget = ESX.GetPlayerFromId(target)
- if not xPlayer or (not xTarget and not offline) then cb(nil); return end
- if isAdmin(xPlayer) then
- local success, reason = banPlayer(xPlayer,offline and target or xTarget,reason,length,offline)
- cb(success, reason)
- else logUnfairUse(xPlayer); cb(false) end
- end)
- ESX.RegisterServerCallback("el_bwh:warn",function(source,cb,target,message,anon)
- if not target or not message then return end
- local xPlayer = ESX.GetPlayerFromId(source)
- local xTarget = ESX.GetPlayerFromId(target)
- if not xPlayer or not xTarget then cb(nil); return end
- if isAdmin(xPlayer) then
- warnPlayer(xPlayer,xTarget,message,anon)
- cb(true)
- else logUnfairUse(xPlayer); cb(false) end
- end)
- ESX.RegisterServerCallback("el_bwh:getWarnList",function(source,cb)
- local xPlayer = ESX.GetPlayerFromId(source)
- -- local start = GetGameTimer() -- debug
- if isAdmin(xPlayer) then
- local warnlist = {}
- for k,v in ipairs(MySQL.Sync.fetchAll("SELECT * FROM bwh_warnings LIMIT @limit",{["@limit"]=Config.page_element_limit})) do
- v.receiver_name=namecache[v.receiver]
- v.sender_name=namecache[v.sender]
- table.insert(warnlist,v)
- end
- cb(json.encode(warnlist),MySQL.Sync.fetchScalar("SELECT CEIL(COUNT(id)/@limit) FROM bwh_warnings",{["@limit"]=Config.page_element_limit}))
- else logUnfairUse(xPlayer); cb(false) end
- -- TriggerClientEvent("chat:addMessage",source,{multiline=false,args={"[^4DEBUG^7] ^1BWH",("Warnlist loading time: %sms"):format(GetGameTimer()-start)}}) -- debug
- end)
- ESX.RegisterServerCallback("el_bwh:getBanList",function(source,cb)
- local xPlayer = ESX.GetPlayerFromId(source)
- -- local start = GetGameTimer() -- debug
- if isAdmin(xPlayer) then
- local data = MySQL.Sync.fetchAll("SELECT * FROM bwh_bans LIMIT @limit",{["@limit"]=Config.page_element_limit})
- local banlist = {}
- for k,v in ipairs(data) do
- v.receiver_name = namecache[json.decode(v.receiver)[1]]
- v.sender_name = namecache[v.sender]
- table.insert(banlist,v)
- end
- cb(json.encode(banlist),MySQL.Sync.fetchScalar("SELECT CEIL(COUNT(id)/@limit) FROM bwh_bans",{["@limit"]=Config.page_element_limit}))
- else logUnfairUse(xPlayer); cb(false) end
- -- TriggerClientEvent("chat:addMessage",source,{multiline=false,args={"[^4DEBUG^7] ^1BWH",("Banlist loading time: %sms"):format(GetGameTimer()-start)}}) -- debug
- end)
- ESX.RegisterServerCallback("el_bwh:getListData",function(source,cb,list,page)
- local xPlayer = ESX.GetPlayerFromId(source)
- if isAdmin(xPlayer) then
- if list=="banlist" then
- local banlist = {}
- for k,v in ipairs(MySQL.Sync.fetchAll("SELECT * FROM bwh_bans LIMIT @limit OFFSET @offset",{["@limit"]=Config.page_element_limit,["@offset"]=Config.page_element_limit*(page-1)})) do
- v.receiver_name = namecache[json.decode(v.receiver)[1]]
- v.sender_name = namecache[v.sender]
- table.insert(banlist,v)
- end
- cb(json.encode(banlist))
- else
- local warnlist = {}
- for k,v in ipairs(MySQL.Sync.fetchAll("SELECT * FROM bwh_warnings LIMIT @limit OFFSET @offset",{["@limit"]=Config.page_element_limit,["@offset"]=Config.page_element_limit*(page-1)})) do
- v.sender_name=namecache[v.sender]
- v.receiver_name=namecache[v.receiver]
- table.insert(warnlist,v)
- end
- cb(json.encode(warnlist))
- end
- else logUnfairUse(xPlayer); cb(nil) end
- end)
- ESX.RegisterServerCallback("el_bwh:unban",function(source,cb,id)
- local xPlayer = ESX.GetPlayerFromId(source)
- if isAdmin(xPlayer) then
- MySQL.Async.execute("UPDATE bwh_bans SET unbanned=1 WHERE id=@id",{["@id"]=id},function(rc)
- local bannedidentifier = "N/A"
- for k,v in ipairs(bancache) do
- if v.id==id then
- bannedidentifier = v.receiver[1]
- bancache[k].unbanned = true
- break
- end
- end
- logAdmin(("Admin ^1%s^7 a dé-banni ^1%s^7 (%s)"):format(xPlayer.getName(),(bannedidentifier~="N/A" and namecache[bannedidentifier]) and namecache[bannedidentifier] or "N/A",bannedidentifier))
- cb(rc>0)
- end)
- else logUnfairUse(xPlayer); cb(false) end
- end)
- end)
- AddEventHandler("playerConnecting",function(name, setKick, def)
- local identifiers = GetPlayerIdentifiers(source)
- if #identifiers>0 and identifiers[1]~=nil then
- local banned, data = isBanned(identifiers)
- namecache[identifiers[1]]=GetPlayerName(source)
- if banned then
- print(("[^1"..GetCurrentResourceName().."^7] Le joueur banni %s (%s) a essayé de rejoindre, son bannissement expire le %s (ID du ban : #%s)"):format(GetPlayerName(source),data.receiver[1],data.length and os.date("%d-%m-%Y %H:%M",data.length) or "PERMANENT",data.id))
- local kickmsg = Config.banformat:format(data.reason,data.length and os.date("%Y-%m-%d %H:%M",data.length) or "PERMANENT",data.sender_name,data.id)
- if Config.backup_kick_method then DropPlayer(source,kickmsg) else def.done(kickmsg) end
- else
- local data = {["@name"]=GetPlayerName(source)}
- for k,v in ipairs(identifiers) do
- data["@"..split(v,":")[1]]=v
- end
- if not data["@steam"] then
- print("[^1"..GetCurrentResourceName().."^7] Un joueur se connecte sans SteamID, sautant le stockage des identifiants")
- else
- MySQL.Async.execute("INSERT INTO `bwh_identifiers` (`steam`, `license`, `ip`, `name`, `xbl`, `live`, `discord`, `fivem`) VALUES (@steam, @license, @ip, @name, @xbl, @live, @discord, @fivem) ON DUPLICATE KEY UPDATE `license`=@license, `ip`=@ip, `name`=@name, `xbl`=@xbl, `live`=@live, `discord`=@discord, `fivem`=@fivem",data)
- end
- end
- else
- if Config.backup_kick_method then DropPlayer(source,"[BWH] Aucun identifiant n'a été trouvé lors de la connexion, veuillez vous reconnecter") else def.done("[BWH] Aucun identifiant n'a été trouvé lors de la connexion, veuillez vous reconnecter") end
- end
- end)
- AddEventHandler("playerDropped",function(reason)
- if open_assists[source] then open_assists[source]=nil end
- for k,v in ipairs(active_assists) do
- if v==source then
- active_assists[k]=nil
- TriggerClientEvent("chat:addMessage",k,{color={255,0,0},multiline=false,args={"BWH : ","L'administrateur qui vous aidait à quitter le serveur"}})
- return
- elseif k==source then
- TriggerClientEvent("el_bwh:assistDone",v)
- TriggerClientEvent("chat:addMessage",v,{color={255,0,0},multiline=false,args={"BWH : ","Le joueur que vous aidiez a quitté le serveur, téléportation a la position précédente..."}})
- active_assists[k]=nil
- return
- end
- end
- end)
- function refreshNameCache()
- namecache={}
- for k,v in ipairs(MySQL.Sync.fetchAll("SELECT steam,name FROM bwh_identifiers")) do
- namecache[v.steam]=v.name
- end
- end
- function refreshBanCache()
- bancache={}
- for k,v in ipairs(MySQL.Sync.fetchAll("SELECT id,receiver,sender,reason,UNIX_TIMESTAMP(length) AS length,unbanned FROM bwh_bans")) do
- table.insert(bancache,{id=v.id,sender=v.sender,sender_name=namecache[v.sender]~=nil and namecache[v.sender] or "N/A",receiver=json.decode(v.receiver),reason=v.reason,length=v.length,unbanned=v.unbanned==1})
- end
- end
- function sendToDiscord(msg)
- if Config.discord_webhook~=nil then
- PerformHttpRequest(Config.discord_webhook, function(a,b,c)end, "POST", json.encode({embeds={{title="BWH LOGS",description=msg:gsub("%^%d",""),color=65280,}}}), {["Content-Type"]="application/json"})
- end
- end
- function logAdmin(msg)
- for k,v in ipairs(ESX.GetPlayers()) do
- if isAdmin(ESX.GetPlayerFromId(v)) then
- TriggerClientEvent("chat:addMessage",v,{color={255,0,0},multiline=false,args={"BWH : ",msg}})
- sendToDiscord(msg)
- end
- end
- end
- function isBanned(identifiers)
- for _,ban in ipairs(bancache) do
- if not ban.unbanned and (ban.length==nil or ban.length>os.time()) then
- for _,bid in ipairs(ban.receiver) do
- for _,pid in ipairs(identifiers) do
- if bid==pid then return true, ban end
- end
- end
- end
- end
- return false, nil
- end
- function isAdmin(xPlayer)
- for k,v in ipairs(Config.admin_groups) do
- if xPlayer.getGroup()==v then return true end
- end
- return false
- end
- function execOnAdmins(func)
- local ac = 0
- for k,v in ipairs(ESX.GetPlayers()) do
- if isAdmin(ESX.GetPlayerFromId(v)) then
- ac = ac + 1
- func(v)
- end
- end
- return ac
- end
- function logUnfairUse(xPlayer)
- if not xPlayer then return end
- print(("[^1"..GetCurrentResourceName().."^7] Le joueur %s (%s) a essayé d'utiliser une fonction d'administration"):format(xPlayer.getName(),xPlayer.identifier))
- logAdmin(("Le joueur %s (%s) a essayé d'utiliser une fonction d'administration"):format(xPlayer.getName(),xPlayer.identifier))
- end
- function banPlayer(xPlayer,xTarget,reason,length,offline)
- local targetidentifiers,offlinename,timestring,data = {},nil,nil,nil
- if offline then
- data = MySQL.Sync.fetchAll("SELECT * FROM bwh_identifiers WHERE steam=@identifier",{["@identifier"]=xTarget})
- if #data<1 then
- return false, "~r~L'identifiant n'est pas dans la base de données des identifiants !"
- end
- offlinename = data[1].name
- for k,v in pairs(data[1]) do
- if k~="name" then table.insert(targetidentifiers,v) end
- end
- else
- targetidentifiers = GetPlayerIdentifiers(xTarget.source)
- end
- if length=="" then length = nil end
- MySQL.Async.execute("INSERT INTO bwh_bans(id,receiver,sender,length,reason) VALUES(NULL,@receiver,@sender,@length,@reason)",{["@receiver"]=json.encode(targetidentifiers),["@sender"]=xPlayer.identifier,["@length"]=length,["@reason"]=reason},function(_)
- local banid = MySQL.Sync.fetchScalar("SELECT MAX(id) FROM bwh_bans")
- logAdmin(("Le joueur ^1%s^7 (%s) a été banni par ^1%s^7, expiration: %s, raison: '%s'"..(offline and " (BAN HORS-LIGNE)" or "")):format(offline and offlinename or xTarget.getName(),offline and data[1].steam or xTarget.identifier,xPlayer.getName(),length~=nil and length or "PERMANENT",reason))
- if length~=nil then
- timestring=length
- local day,month,year,hour,minute = string.match(length,"(%d+)/(%d+)/(%d+) (%d+):(%d+)")
- length = os.time({year=year,month=month,day=day,hour=hour,min=minute})
- end
- table.insert(bancache,{id=banid==nil and "1" or banid,sender=xPlayer.identifier,reason=reason,sender_name=xPlayer.getName(),receiver=targetidentifiers,length=length})
- if offline then xTarget = ESX.GetPlayerFromIdentifier(xTarget) end -- just in case the player is on the server, you never know
- if xTarget then
- TriggerClientEvent("el_bwh:gotBanned",xTarget.source, reason)
- Citizen.SetTimeout(5000, function()
- DropPlayer(xTarget.source,Config.banformat:format(reason,length~=nil and timestring or "PERMANENT",xPlayer.getName(),banid==nil and "1" or banid))
- end)
- else return false, "~r~Erreur inconnu (MySQL?)" end
- return true, ""
- end)
- end
- function warnPlayer(xPlayer,xTarget,message,anon)
- MySQL.Async.execute("INSERT INTO bwh_warnings(id,receiver,sender,message) VALUES(NULL,@receiver,@sender,@message)",{["@receiver"]=xTarget.identifier,["@sender"]=xPlayer.identifier,["@message"]=message})
- TriggerClientEvent("el_bwh:receiveWarn",xTarget.source,anon and "" or xPlayer.getName(),message)
- logAdmin(("Admin ^1%s^7 a averti ^1%s^7 (%s), Message : '%s'"):format(xPlayer.getName(),xTarget.getName(),xTarget.identifier,message))
- end
- AddEventHandler("el_bwh:ban",function(sender,target,reason,length,offline)
- if source=="" then -- if it's from server only
- banPlayer(sender,target,reason,length,offline)
- end
- end)
- AddEventHandler("el_bwh:warn",function(sender,target,message,anon)
- if source=="" then -- if it's from server only
- warnPlayer(sender,target,message,anon)
- end
- end)
- TriggerEvent('es:addCommand', 'aide', function(source, args, user)
- local reason = table.concat(args," ")
- if reason=="" or not reason then TriggerClientEvent("chat:addMessage",source,{color={255,0,0},multiline=false,args={"BWH","Please specify a reason"}}); return end
- if not open_assists[source] and not active_assists[source] then
- local ac = execOnAdmins(function(admin) TriggerClientEvent("el_bwh:requestedAssist",admin,source); TriggerClientEvent("chat:addMessage",admin,{color={0,255,255},multiline=Config.chatassistformat:find("\n")~=nil,args={"BWH : ",Config.chatassistformat:format(GetPlayerName(source),source,reason)}}) end)
- if ac>0 then
- open_assists[source]=reason
- Citizen.SetTimeout(120000,function()
- if open_assists[source] then open_assists[source]=nil end
- if GetPlayerName(source)~=nil then
- TriggerClientEvent("chat:addMessage",source,{color={255,0,0},multiline=false,args={"BWH : ","Votre demande d'assistance a expiré"}})
- end
- end)
- TriggerClientEvent("chat:addMessage",source,{color={0,255,0},multiline=false,args={"BWH : ","Demande d'assistance envoyée (expire dans 120s), écrivez ^1/caide^7 pour annuler votre demande"}})
- else
- TriggerClientEvent("chat:addMessage",source,{color={255,0,0},multiline=false,args={"BWH : ","Il n'y a aucun administrateur sur le serveur"}})
- end
- else
- TriggerClientEvent("chat:addMessage",source,{color={255,0,0},multiline=false,args={"BWH : ","Quelqu'un vous aide déjà ou vous avez déjà une demande d'assistance en attente"}})
- end
- end)
- TriggerEvent('es:addCommand', 'caide', function(source, args, user)
- if open_assists[source] then
- open_assists[source]=nil
- TriggerClientEvent("chat:addMessage",source,{color={0,255,0},multiline=false,args={"BWH : ","Votre demande a bien été annulée"}})
- execOnAdmins(function(admin) TriggerClientEvent("el_bwh:hideAssistPopup",admin) end)
- else
- TriggerClientEvent("chat:addMessage",source,{color={255,0,0},multiline=false,args={"BWH : ","Vous n'avez aucune demande d'aide en attente"}})
- end
- end)
- TriggerEvent('es:addCommand', 'faide', function(source, args, user)
- local xPlayer = ESX.GetPlayerFromId(source)
- if isAdmin(xPlayer) then
- local found = false
- for k,v in pairs(active_assists) do
- if v==source then
- found = true
- active_assists[k]=nil
- TriggerClientEvent("chat:addMessage",source,{color={0,255,0},multiline=false,args={"BWH : ","Aide fermée, téléportation"}})
- TriggerClientEvent("el_bwh:assistDone",source)
- end
- end
- if not found then TriggerClientEvent("chat:addMessage",source,{color={255,0,0},multiline=false,args={"BWH : ","Tu n'aides personne"}}) end
- else
- TriggerClientEvent("chat:addMessage",source,{color={255,0,0},multiline=false,args={"BWH : ","Vous n'avez pas l'autorisation d'utiliser cette commande !"}})
- end
- end)
- TriggerEvent('es:addCommand', 'bwh', function(source, args, user)
- local xPlayer = ESX.GetPlayerFromId(source)
- if isAdmin(xPlayer) then
- if args[1]=="ban" or args[1]=="warn" or args[1]=="warnlist" or args[1]=="banlist" then
- TriggerClientEvent("el_bwh:showWindow",source,args[1])
- elseif args[1]=="refresh" then
- TriggerClientEvent("chat:addMessage",source,{color={0,255,0},multiline=false,args={"BWH : ","Refreshing ban & name cache..."}})
- refreshNameCache()
- refreshBanCache()
- elseif args[1]=="assists" then
- local openassistsmsg,activeassistsmsg = "",""
- for k,v in pairs(open_assists) do
- openassistsmsg=openassistsmsg.."^5ID "..k.." ("..GetPlayerName(k)..")^7 - "..v.."\n"
- end
- for k,v in pairs(active_assists) do
- activeassistsmsg=activeassistsmsg.."^5ID "..k.." ("..GetPlayerName(k)..")^7 - "..v.." ("..GetPlayerName(v)..")\n"
- end
- TriggerClientEvent("chat:addMessage",source,{color={0,255,0},multiline=true,args={"BWH : ","Aides en attente :\n"..(openassistsmsg~="" and openassistsmsg or "^1Aucune aide en attente")}})
- TriggerClientEvent("chat:addMessage",source,{color={0,255,0},multiline=true,args={"BWH : ","Aides actives :\n"..(activeassistsmsg~="" and activeassistsmsg or "^1Aucune aide active")}})
- else
- TriggerClientEvent("chat:addMessage",source,{color={255,0,0},multiline=false,args={"BWH : ","Sous-commande non valide ! (^4ban^7,^4warn^7,^4banlist^7,^4warnlist^7,^4refresh^7)"}})
- end
- else
- TriggerClientEvent("chat:addMessage",source,{color={255,0,0},multiline=false,args={"BWH : ","Vous n'avez pas l'autorisation d'utiliser cette commande !"}})
- end
- end)
- function acceptAssist(xPlayer,target)
- if isAdmin(xPlayer) then
- local source = xPlayer.source
- for k,v in pairs(active_assists) do
- if v==source then
- TriggerClientEvent("chat:addMessage",source,{color={255,0,0},multiline=false,args={"BWH : ","Vous êtes déjà entrain d'aider quelqu'un"}})
- return
- end
- end
- if open_assists[target] and not active_assists[target] then
- open_assists[target]=nil
- active_assists[target]=source
- TriggerClientEvent("el_bwh:acceptedAssist",source,target)
- TriggerClientEvent("el_bwh:hideAssistPopup",source)
- TriggerClientEvent("chat:addMessage",source,{color={0,255,0},multiline=false,args={"BWH : ","Téléportation au joueur..."}})
- elseif not open_assists[target] and active_assists[target] and active_assists[target]~=source then
- TriggerClientEvent("chat:addMessage",source,{color={255,0,0},multiline=false,args={"BWH : ","Quelqu'un aide déjà ce joueur"}})
- else
- TriggerClientEvent("chat:addMessage",source,{color={255,0,0},multiline=false,args={"BWH : ","Le joueur avec cet ID ne demande pas d'aide"}})
- end
- else
- TriggerClientEvent("chat:addMessage",source,{color={255,0,0},multiline=false,args={"BWH : ","Vous n'avez pas l'autorisation d'utiliser cette commande !"}})
- end
- end
- TriggerEvent('es:addCommand', 'yaide', function(source, args, user)
- local xPlayer = ESX.GetPlayerFromId(source)
- local target = tonumber(args[1])
- acceptAssist(xPlayer,target)
- end)
- RegisterServerEvent("el_bwh:acceptAssistKey")
- AddEventHandler("el_bwh:acceptAssistKey",function(target)
- if not target then return end
- local _source = source
- acceptAssist(ESX.GetPlayerFromId(_source),target)
- end)
- if Config.enable_ban_json or Config.enable_warning_json then
- SetHttpHandler(function(req,res)
- if req.path=="/bans.json" and Config.enable_ban_json then
- MySQL.Async.fetchAll("SELECT * FROM bwh_bans",{},function(data)
- res.send(json.encode(data))
- end)
- elseif req.path=="/warnings.json" and Config.enable_warning_json then
- MySQL.Async.fetchAll("SELECT * FROM bwh_warnings",{},function(data)
- res.send(json.encode(data))
- end)
- end
- end)
- end
Advertisement
Add Comment
Please, Sign In to add comment