summaryrefslogtreecommitdiff
path: root/lua/autorun/cl_nadmin.lua
diff options
context:
space:
mode:
Diffstat (limited to 'lua/autorun/cl_nadmin.lua')
-rw-r--r--lua/autorun/cl_nadmin.lua374
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)