Hi everyone!
Some time ago I wrote a small plugin 'Permissions' just for me and for the tests.
But soon this plugin would be useless (oxide has its own system)...
So I decided to put a plug here, maybe it will help someone.
- perm.give <steamid\name> <permission>
- perm.take <steamid\name> <permission>
- perm.list <steamid>
- perm.list
Code:-- Get API func local API = GetPermissionsAPI() -- it's global function-- Get UserData local userdata = API.GetUserDataFromPlayer(player) -- if userdata not found it will return nil local userdata = API.GetUserDataFromPlayer(player, true) -- if userdata not found it will create new and return new userdata local userdata = API.GetUserData(steamid, do_create_new)-- userdata func userdata:GivePerm(permission) -- give permission (if given -> return true, if already have -> return nil) userdata:TakePerm(permission) -- take permission(if taken -> return true, if have not -> return nil) userdata:HasPerm(permission) -- check permission(if found -> return Position, else nil)-- Get all permissions for i=1, #userdata do print(userdata[i]) endCode:PLUGIN.Name = "Permissions" PLUGIN.Title = "Permissions" PLUGIN.Version = V(1, 0, 0) PLUGIN.Description = "Adds Permissions System." PLUGIN.Author = "Bombardir" PLUGIN.HasConfig = truelocal USERS = {} -- ********** API ********** -- local API = {} local base_userdata = {}function GetPermissionsAPI() return API endfunction base_userdata:GivePerm(perm) if not self:HasPerm(perm) then table.insert(self, perm) datafile.SaveDataTable( "Permissions" ) return true end endfunction base_userdata:TakePerm(perm) local pos = self:HasPerm(perm) if pos then table.remove(self, pos) datafile.SaveDataTable( "Permissions" ) return true end endfunction base_userdata:HasPerm(perm) for i=1, #self do if self[i] == perm then return i end end endfunction API.GetUserDataFromPlayer(player, do_create_new) return API.GetUserData(rust.UserIDFromPlayer( player ), do_create_new) endfunction API.GetUserData(steamid, do_create_new) local data = USERS[steamid] if not data then if do_create_new then data = {} setmetatable(data, {__index = base_userdata}) USERS[steamid] = data else return nil end end return data end-- ********** API ********** --function PLUGIN:Init() USERS = datafile.GetDataTable( "Permissions" ) or {} for k, v in pairs(USERS) do if v[1] then setmetatable(USERS[k], {__index = base_userdata}) else USERS[k] = nil end datafile.SaveDataTable( "Permissions" ) end command.AddConsoleCommand( "perm.give", self.Object, "CC_Perm_Give" ) command.AddConsoleCommand( "perm.take", self.Object, "CC_Perm_Take" ) command.AddConsoleCommand( "perm.list", self.Object, "CC_Perm_List" ) self.Config.ChatName = self.Config.ChatName or "[Permissions]" self.Config.No_Permission_Message = self.Config.No_Permission_Message or "You don't have permission for this command!" self:SaveConfig() endlocal function Check_Perm(arg, permission) local player if arg.connection then player = arg.connection.player end if player then local data = API.GetUserData(rust.UserIDFromPlayer( player )) if (data and data:HasPerm(permission)) or player:GetComponent("BaseNetworkable").net.connection.authLevel >= 2 then return true else player:SendConsoleCommand( "chat.add \"" .. self.Config.ChatName .. "\"" .. self.Config.No_Permission_Message ) end else return true end endfunction PLUGIN:CC_Perm_Give(arg) local reply = "" if Check_Perm(arg, "Perm_Give") then local steam = arg:GetString( 0, false ) local perm = arg:GetString( 1, false ) if steam and perm then local target = global.BasePlayer.Find(steam) local userdata if target then userdata = API.GetUserDataFromPlayer( target, true) steam = target.displayName else userdata = API.GetUserData(steam, true) end if userdata:GivePerm(perm) then reply = "Permission " .. perm .. " given to '" .. steam .. "' !" else reply = "'" .. steam .. "' already have this permission!" end else reply = "Syntax Error! (perm.give <steam> <permission>)" end else reply = "No permission!" end arg:ReplyWith(reply) return true endfunction PLUGIN:CC_Perm_Take(arg) local reply = "" if Check_Perm(arg, "Perm_Take") then local steam = arg:GetString( 0, false ) local perm = arg:GetString( 1, false ) if steam and perm then local target = global.BasePlayer.Find(steam) local userdata if target then userdata = API.GetUserDataFromPlayer( target ) steam = target.displayName else userdata = API.GetUserData(steam) end if userdata then if userdata:TakePerm(perm) then reply = "Permission " .. perm .. " was taken from '" .. steam .. "' !" else reply = "'" .. steam .. "' haven't this permission! (" .. perm .. ")" end else reply = "'" .. steam .. "' haven't permissions!" end else reply = "Syntax Error! (perm.take <steam> <permission>)" end else reply = "No permission!" end arg:ReplyWith(reply) return true endfunction PLUGIN:CC_Perm_List(arg) local reply = "" if Check_Perm(arg, "Perm_List") then local steam = arg:GetString( 0, "all" ) if steam == "all" then reply = reply .. "------------- PERMISSIONS LIST -------------\n" for steam, data in pairs(USERS) do reply = reply .. steam .. ": " .. table.concat(data, ", ") .. "\n" end reply = reply .. "--------------------------------------------" else local data = USERS[steam] if data then reply = reply .. steam .. ": " .. table.concat(data, ", ") else reply = "No user with steam: '" .. steam .. "' !" end end else reply = "No permission!" end arg:ReplyWith(reply) return true end
Sample Permissions plugin code
Discussion in 'Rust Development' started by Bombardir, Nov 9, 2014.