diff --git a/src/API/PermissionsAPI.php b/src/API/PermissionsAPI.php index e74ffe787..d65e08180 100644 --- a/src/API/PermissionsAPI.php +++ b/src/API/PermissionsAPI.php @@ -52,10 +52,26 @@ class PermissionsAPI{ { ServerAPI::request()->api->addHandler("player.connect", function ($player)//Use a better event than player.connect. Player.create maybe? { + /** @var Player $player */ + $player->permissions = new PlayerPermissions(); + + /** + * @param string $event + * @param array $data + */ + $player->emitEvent = function ($event, $data) use ($player) { + $player->permissions->emitEvent($event, $data); + }; + + //Now instead of doing api->handle, doing emitEvent will handle permissions automatically. + /** @var array $newPermission */ - $newPermission = ServerAPI::request()->api->dhandle("permissions.request", array('player' => $player)); - if($newPermission instanceof Permission){ - $player->permission = $newPermission;//This is a class with functions in it. So now plugins can call $player->permissions->isGranted(). Symfony2 Style! + $newPermissions = ServerAPI::request()->api->dhandle("permissions.request", array('player' => $player)); + if($newPermissions){ + //array_push($player->permissions, $newPermissions); + array_walk($newPermissions, function ($value, $key, $player) { + $player->permissions[] = $value; + }, $player); }else{ //TODO: Give out default permission. Fall back to OP system maybe? Checking for a permissions receiver would be nice. } @@ -63,6 +79,60 @@ class PermissionsAPI{ } } +class PlayerPermissions implements ArrayAccess +{ + private $Permissions = array(); + + public function __construct() + { + + } + + public function __destruct() + { + + } + + public function __invoke() + { + + } + + private function testRestrictions() + { + //TODO: Test Restrictions Here + } + + public function emitEvent($event, $data) + { + //TODO: Emit event here + } + + public function offsetSet($offset, $value) + { + if (is_null($offset)) { + $this->Permissions[] = $value; + } else { + $this->Permissions[$offset] = $value; + } + } + + public function offsetExists($offset) + { + return isset($this->Permissions[$offset]); + } + + public function offsetUnset($offset) + { + unset($this->Permissions[$offset]); + } + + public function offsetGet($offset) + { + return isset($this->Permissions[$offset]) ? $this->Permissions[$offset] : null; + } +} + /** * Class Permission * @@ -86,6 +156,9 @@ class PermissionsAPI{ //Thinking of doing $player->permissions[] = new EventRestriction("player.move"); //$player->permissions->apply(new EventRestriction("player.move")); +/** + * Class EventRestriction + */ class EventRestriction { /** @@ -94,15 +167,45 @@ class EventRestriction private $event; /** - * @param array $event + * @param string $event */ public function __construct($event) { $this->event = trim($event); } + /** + * @return string + */ public function __toString() { return (string) $this->event; } +} + +/** + * Class CommandRestriction + */ +class CommandRestriction +{ + /** + * @var string $command + */ + private $command; + + /** + * @param string $command + */ + public function __construct($command) + { + $this->command = strtolower(trim($command)); + } + + /** + * @return string + */ + public function __toString() + { + return (string) $this->command; + } } \ No newline at end of file diff --git a/src/Player.php b/src/Player.php index e66b7fa83..103b98ea3 100644 --- a/src/Player.php +++ b/src/Player.php @@ -62,6 +62,8 @@ class Player{ public $chunksLoaded = array(); /** @var mixed Permissions Object */ public $permissions = false; + /** @var callable */ + public $emitEvent = false; private $chunksOrder = array(); private $lastMeasure = 0; private $bandwidthRaw = 0;