diff options
| author | Alexander Pickering <alex@cogarr.net> | 2020-04-20 14:25:51 -0400 |
|---|---|---|
| committer | Alexander Pickering <alex@cogarr.net> | 2020-04-20 14:25:51 -0400 |
| commit | b5b9efc28bb65fa3a53db8867310ac42d00f2bc6 (patch) | |
| tree | 68123b86dc41c3744571315a9d67047e59b85992 /lua/autorun/cl_nadmin.lua | |
| download | nadmin-b5b9efc28bb65fa3a53db8867310ac42d00f2bc6.tar.gz nadmin-b5b9efc28bb65fa3a53db8867310ac42d00f2bc6.tar.bz2 nadmin-b5b9efc28bb65fa3a53db8867310ac42d00f2bc6.zip | |
Inital commit
Diffstat (limited to 'lua/autorun/cl_nadmin.lua')
| -rw-r--r-- | lua/autorun/cl_nadmin.lua | 374 |
1 files changed, 374 insertions, 0 deletions
diff --git a/lua/autorun/cl_nadmin.lua b/lua/autorun/cl_nadmin.lua new file mode 100644 index 0000000..31f7730 --- /dev/null +++ b/lua/autorun/cl_nadmin.lua @@ -0,0 +1,374 @@ +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 +--The variables that hold things +--local groups = nadmin.groups +--local players = nadmin.players +--local privileges = nadmin.privileges + +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 + print("Looking at object:",v) + 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) + print("got privileges") + nadmin.privileges = net.ReadTable() +end) +net.Receive("nadmin_init_players", function(len) + print("got players") + nadmin.players = net.ReadTable() +end) +net.Receive("nadmin_init_groups", function(len) + print("got groups") + nadmin.groups = net.ReadTable() + PrintTable(nadmin.groups) +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() + print("At time of nadmin_update_player, player is", player) + 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) + +concommand.Add("cl_print_privileges", function(ply,cmd,args) + PrintTable(nadmin.privileges) +end) +concommand.Add("cl_print_groups", function(ply,cmd,args) + print("NAdmin groups:",nadmin.groups) + PrintTable(nadmin.groups) + print("Local groups:",groups) + PrintTable(nadmin.groups) +end) +concommand.Add("cl_print_players", function(ply,cmd,args) + PrintTable(nadmin.players) +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 + print("Group:") + PrintTable(group) + 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) |
