include("sh_cami.lua") AddCSLuaFile() local nadmin = {} --[[ Groups is a table of ["group_name"] = { nadmin :: bool --Wether the group was created by nAdmin or not --nAdmin will only allow you to delete groups --that were created with it. You cannot delete --groups that were created with another mod. group :: CAMI_USERGROUP -- the usergroup table given by CAMI, -- see sh_cami.lua for details. src :: string --The source of the usergroup, can be "cami", nAdmin, --or the name of the mod that introduced the usergroup. privileges :: table --An array of ["privilege_name"] = true, for --each privilege the group has } ]] nadmin.groups = {} for _,v in pairs(CAMI.GetUsergroups()) do nadmin.groups[v.Name] = { nadmin = false, group = v, src = "cami", privileges = {}, } for _,privilege in pairs(CAMI.GetPrivileges()) do if privilege.MinAccess == v.Name then nadmin.groups[v.Name].privileges[privilege.Name] = true end end end --[[ Players is a table of [player_steamid] = { group :: CAMI_USERGROUP --The usergroup table given by CAMI that --the player is a part of, see sh_cami.lua for --details last_name :: string --The last name that the player joined the server --with, this is used to set player's permissions --even when the player is offline. ]] nadmin.players = {} nadmin.privileges = CAMI.GetPrivileges() function nadmin.AddUserGroup(src,usergroup) nadmin.groups[usergroup.Name] = { nadmin = src == "nadmin", group = usergroup, src = src, privileges = {} } end function nadmin.DeleteUserGroup(name,src) nadmin.groups[name] = nil end function nadmin.save_config() if not SERVER then return end local file_parts = {"return {"} --Save groups table.insert(file_parts,"groups = {") for groupname, group in pairs(nadmin.groups) do if group.nadmin then local privileges_tbl = {} for privilege_name,_ in pairs(group.privileges) do table.insert(privileges_tbl,string.format("[%q] = true",privilege_name)) end table.insert(file_parts,string.format([[ [%q] = { name = %q, inherits = %q, privileges = {%s} },]],groupname, group.group.Name, group.group.Inherits, table.concat(privileges_tbl,","))) end end table.insert(file_parts,"},") --Save players table.insert(file_parts,"players = {") for playerid, player in pairs(nadmin.players) do table.insert(file_parts,string.format([[ [%q] = { last_name = %q, group = %q },]], playerid, player.last_name, player.group)) end table.insert(file_parts,"},") --Finish off table.insert(file_parts,"}") --And save to file file.Write("nadmin.txt",table.concat(file_parts,"\n")) end --Notify client of changes to the groups table hook.Add("CAMI.OnUsergroupRegistered","nadmin_OnUserGroupRegistered",function(usergroup,src) src = src or "" nadmin.AddUserGroup(src,usergroup) if SERVER then net.Start("nadmin_create_group") net.WriteString(usergroup.Name) net.WriteString(usergroup.Inherits or "users") --Some mods call this hook without an "Inherits" net.WriteString(src) net.Broadcast() nadmin.save_config() end end) hook.Add("CAMI.OnUsergroupUnregistered","nadmin_OnUserGroupUnregistered",function(usergroup,src) nadmin.DeleteUserGroup(usergroup.Name, src) if SERVER then net.Start("nadmin_delete_group") net.WriteString(usergroup.Name) net.Broadcast() nadmin.save_config() end end) hook.Add("CAMI.PlayerUsergroupChanged","nadmin_PlayerUsergroupChanged",function(ply,from,to,src) local sid = ply:SteamID64() nadmin.players[sid] = nadmin.players[sid] or {} nadmin.players[sid].group = to if SERVER then net.Start("nadmin_update_player") net.WriteEntity(ply) net.WriteString(to) net.Broadcast() nadmin.save_config() end end) hook.Add("CAMI.OnPrivilegeRegistered", "nadmin_OnPrivilegeRegistered", function(privilege) nadmin.privileges[privilege.Name] = privilege nadmin.save_config() end) hook.Add("CAMI.OnPrivilegeUnregistered", "nadmin_OnPrivilegeUnregistered", function(privilege) nadmin.privileges[privilege.Name] = nil end) hook.Add("CAMI.PlayerHasAccess","nadmin_PlayerHasAccess",function(ply,name,callback,target,extra) if (not ply) or (not ply:IsValid()) then return end local sid = ply:SteamID64() if not nadmin.players[sid] then return end local group = nadmin.players[ply:SteamID64()].group if group and type(group) == "table" and group.nadmin and group.privileges[name] then return true end end) hook.Add("CAMI.SteamIDHasAccess","nadmin_SteamIDHasAccess",function(id,privilege,callback,target,extra) local group = nadmin.players[id].group if group and group.nadmin and group.privileges[privilege] then return true end end) return nadmin