AddCSLuaFile() if SERVER then return end local nadmin = include("sh_nadmin.lua") --Functions local add_group_to_groupsheet local remove_group_from_groupsheet --Override what print() does, just for this file local oldprint = print local print = function(...) local args = {...} table.insert(args,1,"[NADMIN]") oldprint(unpack(args)) end local usergroup_dropdowns = {} local function add_usergroup_to_usergroup_dropdowns(name) for k,v in pairs(usergroup_dropdowns) do if v:IsValid() then v:AddChoice(name) else usergroup_dropdowns[k] = nil end end end local function delete_usergroup_from_usergroup_dropdowns(group) for _,v in pairs(usergroup_dropdowns) do table.RemoveByValue(v.Choices, name) if v.Menu then v.Menu:Remove() v.Menu = nil end if v:GetText() == group.group.Name then v:SetText(group.group.MinAccess) end end end net.Receive("nadmin_init_privileges", function(len) nadmin.privileges = net.ReadTable() end) net.Receive("nadmin_init_players", function(len) nadmin.players = net.ReadTable() end) net.Receive("nadmin_init_groups", function(len) nadmin.groups = net.ReadTable() end) net.Receive("nadmin_update_privilege", function(len) local exists = net.ReadBool() local privilege = net.ReadTable() if exists then nadmin.privileges[privilege.Name] = privilege else nadmin.privileges[privilege.Name] = nil end end) net.Receive("nadmin_create_group", function(len) local name = net.ReadString() local inherits = net.ReadString() local source = net.ReadString() nadmin.groups[name] = { name = name, group = { Name = name, Inherits = inherits }, privileges = {}, nadmin = source == "nadmin", src = source } add_group_to_groupsheet(nadmin.groups[name]) add_usergroup_to_usergroup_dropdowns(name) CAMI.RegisterUsergroup(nadmin.groups[name].group, "nadmin") end) net.Receive("nadmin_update_group", function(len) local name = net.ReadString() local privilege = net.ReadString() local exists = net.ReadBool() if exists then nadmin.groups[name].privileges[privilege] = exists else nadmin.groups[name].privileges[privilege] = nil end end) net.Receive("nadmin_delete_group", function(len) local name = net.ReadString() remove_group_from_groupsheet(nadmin.groups[name]) delete_usergroup_from_usergroup_dropdowns(nadmin.groups[name]) nadmin.groups[name] = nil CAMI.UnregisterUsergroup(name,"nadmin") end) net.Receive("nadmin_update_player", function(len) local player = net.ReadEntity() local group = net.ReadString() local sid = player:SteamID64() nadmin.players[sid] = nadmin.players[sid] or {} nadmin.players[sid].group = group nadmin.players[sid].last_name = player:Name() if nadmin.players[sid].combo then nadmin.players[sid].combo:SetValue(group) end if nadmin.players[sid].line then nadmin.players[sid].line:SetColumnText(2,player:Name()) end CAMI.SignalSteamIDUserGroupChanged(sid,group,"nadmin") end) local function create_usergroup_combo(parent) local ret = vgui.Create("DComboBox",parent) for groupname, _ in pairs(nadmin.groups) do ret:AddChoice(groupname) end table.insert(usergroup_dropdowns, ret) return ret end local nadmin_frame,users_tbl,groups_tbl = nil,nil,nil local users_sheet,groups_sheet = nil,nil --ply :: entity local function add_user_to_usersheet(steamid,ply) if not nadmin_frame then return end local player_ent = player.GetBySteamID64(steamid) local line = users_tbl:AddLine(steamid, ply.last_name, ply.group) local dropdown = create_usergroup_combo(line) if nadmin.players[steamid] then dropdown:SetValue(nadmin.players[steamid].group) else dropdown:SetValue("user") end dropdown.OnSelect = function(self, index, value) net.Start("nadmin_request_set_user_group") net.WriteEntity(player_ent) net.WriteString(value) net.SendToServer() end line:SetColumnText(3,dropdown) ply.combo = dropdown --Update the combo box when someone else updates the group ply.line = line end --ply :: entity local function remove_user_from_usersheet(ply) if not nadmin_frame then return end if not ply.line then return end users_tbl:RemoveLine(ply.line.m_iID) end local privilege_checkboxes = {} local function add_privilege_to_groupsheet(privilege) local ordered_privileges = {} for _,privilege in pairs(nadmin.privileges) do table.insert(ordered_privileges,privilege) end table.sort(ordered_privileges, function(a,b) return a.Name > b.Name end) local privilege_num = 0 for num,ordered_privilege in pairs(ordered_privileges) do if ordered_privilege == privilege then privilege_num = num break end end local column = groups_tbl:AddColumn(privilege.Name) column.DoClick = function(self) local explain_frame = vgui.Create("DFrame") explain_frame:SetTitle(privilege.Name) local description = vgui.Create("DLabel",explain_frame) description:SetWrap(true) if privilege.Description then description:SetText(privilege.Description) else description:SetText("This privilege does not have a description") end explain_frame:SetSize(ScrW() / 6, ScrH() / 4) explain_frame:SetPos(ScrW() / 4 + 100,ScrH() / 4 + 50) explain_frame:MakePopup() description:Dock(FILL) end column:SetWrap(true) for groupname,group in pairs(nadmin.groups) do local checkbox = vgui.Create("DCheckBox", group.line) privilege_checkboxes[groupname] = checkbox if group.nadmin then checkbox:SetChecked(group.privileges[privilege.Name]) checkbox.OnChange = function(self,value) net.Start("nadmin_request_update_group") net.WriteString(groupname) net.WriteString(privilege.Name) net.WriteBool(value) net.SendToServer() end else checkbox:SetDisabled(true) end group.line:SetColumnText(privilege_num + 2,checkbox) end end local function remove_privilege_from_groupsheet(privilege) end add_group_to_groupsheet = function(group) if not groups_tbl then return end local line = groups_tbl:AddLine(group.group.Name) local ordered_privileges = {} for _,privilege in pairs(nadmin.privileges) do table.insert(ordered_privileges,privilege) end table.sort(ordered_privileges, function(a,b) return a.Name > b.Name end) local delete_group_button = vgui.Create("DButton",line) delete_group_button:SetText("-") delete_group_button:SetEnabled(group.nadmin) delete_group_button.DoClick = function(self) net.Start("nadmin_request_delete_group")--(group :: string) net.WriteString(group.group.Name) net.SendToServer() end line:SetColumnText(2,delete_group_button) for n,privilege_name in pairs(ordered_privileges) do local privilege_checkbox = vgui.Create("DCheckBox",line) line:SetColumnText(n + 2,privilege_checkbox) if group.nadmin then privilege_checkbox:SetChecked(group.privileges[privilege_name]) privilege_checkbox.OnChange = function(self,val) net.Start("nadmin_request_update_group") --(group :: string, privilege :: string, set :: bool) net.WriteString(group.group.Name) net.WriteString(privilege_name.Name) net.WriteBool(val) net.SendToServer() end else privilege_checkbox:SetDisabled(true) end end group.line = line group.line_id = #groups_tbl.Lines end function remove_group_from_groupsheet(group) groups_tbl:RemoveLine(group.line_id) end local function create_new_group_dialog() local dialog = vgui.Create("DFrame") dialog:SetTitle("Create Group") local inherits_label = vgui.Create("DLabel",dialog) inherits_label:Dock(TOP) inherits_label:SetText("Inherits from") local inherits = create_usergroup_combo(dialog) inherits:Dock(TOP) local groupname_label = vgui.Create("DLabel",dialog) groupname_label:Dock(TOP) groupname_label:SetText("Group Name") local groupname = vgui.Create("DTextEntry",dialog) groupname:Dock(TOP) local createbtn = vgui.Create("DButton",dialog) createbtn:SetText("Create Group") createbtn.DoClick = function(self) net.Start("nadmin_request_create_group") net.WriteString(groupname:GetText()) net.WriteString(inherits:GetText()) net.SendToServer() dialog:Close() end createbtn:Dock(BOTTOM) dialog:SetSize(250,150) dialog:Center() dialog:MakePopup() end local function create_nadmin_panel() if nadmin_frame ~= nil and nadmin_frame:IsValid() then nadmin_frame:SetVisible(true) return end nadmin_frame = vgui.Create("DFrame") nadmin_frame:SetTitle("nAdmin") nadmin_frame.OnClose = function(self) self:SetVisible(false) return false end nadmin_frame:SetSizable(true) local prop_sheet = vgui.Create("DPropertySheet",nadmin_frame) prop_sheet:Dock(FILL) users_tbl = vgui.Create("DListView",prop_sheet) users_tbl:AddColumn("SteamID") users_tbl:AddColumn("Name") users_tbl:AddColumn("Group") for steamid,player in pairs(nadmin.players) do add_user_to_usersheet(steamid,player) end prop_sheet:AddSheet("Users",users_tbl,nil,true,true,"Sets users to particular groups") users_tbl:Dock(FILL) local groups_scroller = vgui.Create("DHorizontalScroller",prop_sheet) groups_tbl = vgui.Create("DListView",groups_scroller) groups_scroller:Dock(FILL) local gcol = groups_tbl:AddColumn("Group") local dcol = groups_tbl:AddColumn("Delete") gcol:SetEnabled(false) dcol:SetEnabled(false) local tot_columns = 0 local tot_width = 0 --Don't do anything if the user clicks the Group or Delete headers for _,v in pairs(groups_tbl.Columns) do v.DoClick = function() end end local add_line = groups_tbl:AddLine("") local add_btn = vgui.Create("DButton",add_line) add_btn:SetText("+") add_btn.DoClick = function(self) create_new_group_dialog() end add_line:SetColumnText(1,add_btn) for groupname,group in pairs(nadmin.groups) do tot_columns = tot_columns + 1 add_group_to_groupsheet(group) tot_width = tot_width + string.len(groupname)*30 --10 pixels for each character? end for privilegename, privilege in pairs(nadmin.privileges) do add_privilege_to_groupsheet(privilege) end groups_tbl:SetWidth(tot_width) prop_sheet:AddSheet("Groups",groups_scroller,nil,true,true,"Set the privileges for a group") groups_scroller:AddPanel(groups_tbl) nadmin_frame:SetSize(ScrW() / 2, ScrH() / 2) nadmin_frame:SetPos(ScrW() / 4, ScrH() / 4) nadmin_frame:MakePopup() end concommand.Add("cl_nadmin", function(ply,cmd,args) create_nadmin_panel() end) concommand.Add("cl_nadmin_new", function(ply,cmd,args) nadmin_frame = nil create_nadmin_panel() end)