local self = ESX.Modules['society'] AddEventHandler('esx:migrations:ensure', function(register) register('society') end) AddEventHandler('esx_society:registerSociety', function(name, label, account, datastore, inventory, data) local found = false local society = { name = name, label = label, account = account, datastore = datastore, inventory = inventory, data = data } for i=1, #self.RegisteredSocieties, 1 do if self.RegisteredSocieties[i].name == name then found, self.RegisteredSocieties[i] = true, society break end end if not found then table.insert(self.RegisteredSocieties, society) end end) AddEventHandler('esx_society:getSocieties', function(cb) cb(self.RegisteredSocieties) end) AddEventHandler('esx_society:getSociety', function(name, cb) cb(self.GetSociety(name)) end) RegisterServerEvent('esx_society:withdrawMoney') AddEventHandler('esx_society:withdrawMoney', function(societyName, amount) local xPlayer = ESX.GetPlayerFromId(source) local society = self.GetSociety(societyName) amount = ESX.Math.Round(tonumber(amount)) if xPlayer.job.name == society.name then TriggerEvent('esx_addonaccount:getSharedAccount', society.account, function(account) if amount > 0 and account.money >= amount then account.removeMoney(amount) xPlayer.addMoney(amount) xPlayer.showNotification(_U('society:have_withdrawn', ESX.Math.GroupDigits(amount))) else xPlayer.showNotification(_U('society:invalid_amount')) end end) else print(('esx_society: %s attempted to call withdrawMoney!'):format(xPlayer.identifier)) end end) RegisterServerEvent('esx_society:depositMoney') AddEventHandler('esx_society:depositMoney', function(societyName, amount) local xPlayer = ESX.GetPlayerFromId(source) local society = self.GetSociety(societyName) amount = ESX.Math.Round(tonumber(amount)) if xPlayer.job.name == society.name then if amount > 0 and xPlayer.getMoney() >= amount then TriggerEvent('esx_addonaccount:getSharedAccount', society.account, function(account) xPlayer.removeMoney(amount) xPlayer.showNotification(_U('society:have_deposited', ESX.Math.GroupDigits(amount))) account.addMoney(amount) end) else xPlayer.showNotification(_U('society:invalid_amount')) end else print(('esx_society: %s attempted to call depositMoney!'):format(xPlayer.identifier)) end end) RegisterServerEvent('esx_society:washMoney') AddEventHandler('esx_society:washMoney', function(society, amount) local xPlayer = ESX.GetPlayerFromId(source) local account = xPlayer.getAccount('black_money') amount = ESX.Math.Round(tonumber(amount)) if xPlayer.job.name == society then if amount and amount > 0 and account.money >= amount then xPlayer.removeAccountMoney('black_money', amount) MySQL.Async.execute('INSERT INTO society_moneywash (identifier, society, amount) VALUES (@identifier, @society, @amount)', { ['@identifier'] = xPlayer.identifier, ['@society'] = society, ['@amount'] = amount }, function(rowsChanged) xPlayer.showNotification(_U('society:you_have', ESX.Math.GroupDigits(amount))) end) else xPlayer.showNotification(_U('society:invalid_amount')) end else print(('esx_society: %s attempted to call washMoney!'):format(xPlayer.identifier)) end end) RegisterServerEvent('esx_society:putVehicleInGarage') AddEventHandler('esx_society:putVehicleInGarage', function(societyName, vehicle) local society = self.GetSociety(societyName) TriggerEvent('esx_datastore:getSharedDataStore', society.datastore, function(store) local garage = store.get('garage') or {} table.insert(garage, vehicle) store.set('garage', garage) end) end) RegisterServerEvent('esx_society:removeVehicleFromGarage') AddEventHandler('esx_society:removeVehicleFromGarage', function(societyName, vehicle) local society = self.GetSociety(societyName) TriggerEvent('esx_datastore:getSharedDataStore', society.datastore, function(store) local garage = store.get('garage') or {} for i=1, #garage, 1 do if garage[i].plate == vehicle.plate then table.remove(garage, i) break end end store.set('garage', garage) end) end) ESX.RegisterServerCallback('esx_society:getSocietyMoney', function(source, cb, societyName) local society = self.GetSociety(societyName) if society then TriggerEvent('esx_addonaccount:getSharedAccount', society.account, function(account) cb(account.money) end) else cb(0) end end) ESX.RegisterServerCallback('esx_society:getEmployees', function(source, cb, society) if Config.EnableESXIdentity then MySQL.Async.fetchAll('SELECT firstname, lastname, identifier, job, job_grade FROM users WHERE job = @job ORDER BY job_grade DESC', { ['@job'] = society }, function(results) local employees = {} for i=1, #results, 1 do table.insert(employees, { name = results[i].firstname .. ' ' .. results[i].lastname, identifier = results[i].identifier, job = { name = results[i].job, label = self.Jobs[results[i].job].label, grade = results[i].job_grade, grade_name = self.Jobs[results[i].job].grades[tostring(results[i].job_grade)].name, grade_label = self.Jobs[results[i].job].grades[tostring(results[i].job_grade)].label } }) end cb(employees) end) else MySQL.Async.fetchAll('SELECT name, identifier, job, job_grade FROM users WHERE job = @job ORDER BY job_grade DESC', { ['@job'] = society }, function(result) local employees = {} for i=1, #result, 1 do table.insert(employees, { name = result[i].name, identifier = result[i].identifier, job = { name = result[i].job, label = self.Jobs[result[i].job].label, grade = result[i].job_grade, grade_name = self.Jobs[result[i].job].grades[tostring(result[i].job_grade)].name, grade_label = self.Jobs[result[i].job].grades[tostring(result[i].job_grade)].label } }) end cb(employees) end) end end) ESX.RegisterServerCallback('esx_society:getJob', function(source, cb, society) local job = json.decode(json.encode(self.Jobs[society])) local grades = {} for k,v in pairs(job.grades) do table.insert(grades, v) end table.sort(grades, function(a, b) return a.grade < b.grade end) job.grades = grades cb(job) end) ESX.RegisterServerCallback('esx_society:setJob', function(source, cb, identifier, job, grade, type) local xPlayer = ESX.GetPlayerFromId(source) local isBoss = xPlayer.job.grade_name == 'boss' if isBoss then local xTarget = ESX.GetPlayerFromIdentifier(identifier) if xTarget then xTarget.setJob(job, grade) if type == 'hire' then xTarget.showNotification(_U('society:you_have_been_hired', job)) elseif type == 'promote' then xTarget.showNotification(_U('society:you_have_been_promoted')) elseif type == 'fire' then xTarget.showNotification(_U('society:you_have_been_fired', xTarget.getJob().label)) end cb() else MySQL.Async.execute('UPDATE users SET job = @job, job_grade = @job_grade WHERE identifier = @identifier', { ['@job'] = job, ['@job_grade'] = grade, ['@identifier'] = identifier }, function(rowsChanged) cb() end) end else print(('esx_society: %s attempted to setJob'):format(xPlayer.identifier)) cb() end end) ESX.RegisterServerCallback('esx_society:setJobSalary', function(source, cb, job, grade, salary) local xPlayer = ESX.GetPlayerFromId(source) if xPlayer.job.name == job and xPlayer.job.grade_name == 'boss' then if salary <= self.Config.MaxSalary then MySQL.Async.execute('UPDATE job_grades SET salary = @salary WHERE job_name = @job_name AND grade = @grade', { ['@salary'] = salary, ['@job_name'] = job, ['@grade'] = grade }, function(rowsChanged) self.Jobs[job].grades[tostring(grade)].salary = salary local xPlayers = ESX.GetPlayers() for i=1, #xPlayers, 1 do local xTarget = ESX.GetPlayerFromId(xPlayers[i]) if xTarget.job.name == job and xTarget.job.grade == grade then xTarget.setJob(job, grade) end end cb() end) else print(('esx_society: %s attempted to setJobSalary over config limit!'):format(xPlayer.identifier)) cb() end else print(('esx_society: %s attempted to setJobSalary'):format(xPlayer.identifier)) cb() end end) ESX.RegisterServerCallback('esx_society:getOnlinePlayers', function(source, cb) local xPlayers = ESX.GetPlayers() local players = {} for i=1, #xPlayers, 1 do local xPlayer = ESX.GetPlayerFromId(xPlayers[i]) table.insert(players, { source = xPlayer.source, identifier = xPlayer.identifier, name = xPlayer.name, job = xPlayer.job }) end cb(players) end) ESX.RegisterServerCallback('esx_society:getVehiclesInGarage', function(source, cb, societyName) local society = self.GetSociety(societyName) TriggerEvent('esx_datastore:getSharedDataStore', society.datastore, function(store) local garage = store.get('garage') or {} cb(garage) end) end) ESX.RegisterServerCallback('esx_society:isBoss', function(source, cb, job) cb(self.isPlayerBoss(source, job)) end) MySQL.ready(function() local result = MySQL.Sync.fetchAll('SELECT * FROM jobs', {}) for i=1, #result, 1 do self.Jobs[result[i].name] = result[i] self.Jobs[result[i].name].grades = {} end local result2 = MySQL.Sync.fetchAll('SELECT * FROM job_grades', {}) for i=1, #result2, 1 do self.Jobs[result2[i].job_name].grades[tostring(result2[i].grade)] = result2[i] end end)