true, * 'invitable' => true, * 'can_invite' => ['artist' => ['artist']], * 'member_verified' => true, * 'notifications' => true, * 'forum' => true, * 'member_only' => [ 'artist' ], * 'member_expires' => false, * 'hide_expired' => false, * 'clip_expired' => false, * 'term_approval' => true, * 'can_approve' => [ 'artist' ] * ] */ $membership = apply_filters('jvb_membership', [ 'can_invite' => [], ]); define('JVB_MEMBERSHIP', $membership); class Membership { protected bool $member_content = true; protected bool $invitable = false; protected bool $member_verified = false; protected array $can_invite = []; protected bool $notifications = true; protected bool $member_expires = false; protected bool $hide_expired = false; protected bool $clip_expired = false; protected bool $term_approval = false; protected array $can_approve = []; protected bool $forum = true; protected array $member_only = []; public function __construct() { } public function set(string $property, null|bool|array $value = null):void { if (is_null($value)) { $value = true; } if (property_exists(self::class, $property)) { $this->$property = $value; } else { error_log('[Membership]::set Could not set property '.$property.', it does not exist.'); } } public function setAll(array $properties):void { foreach ($properties as $property) { if (is_array($property)) { $this->set($property[0], $property[1]); } else { $this->set($property); } } } public function has(string $property):bool { return property_exists($this, $property) && $this->$property === true; } public function hasAny(array $properties):bool { foreach ($properties as $property) { if ($this->has($property)) { return true; } } return false; } public function setInvitable(array $invitable):void { $users = Registrar::getRegistered('user'); $invitable = array_filter($invitable, function($role) use ($users) { if (!in_array($role, $users)) { error_log('[Membership]::set Invitable role '.$role.' does not exist.'); return false; } return true; }, ARRAY_FILTER_USE_KEY); $allowed = []; foreach ($invitable as $inviter => $canInvites) { $canInvites = array_filter($canInvites, function($role) use ($users){ if (!in_array($role, $users)) { error_log('[Membership]::set Invitable role '.$role.' does not exist.'); return false; } return true; }); if (!empty($canInvites)) { $allowed[$inviter] = $canInvites; } } if (!empty($allowed)) { $this->can_invite = $allowed; } } public function getInviters():array { return $this->can_invite; } public function canInvite(string $role):bool { return ($this->invitable) && array_key_exists($role, $this->can_invite); } public function getInvitableFor(string $role):array { return array_key_exists($role, $this->can_invite) ? $this->can_invite[$role] : []; } public function setApprovers(array $roles):void { $allowed = Registrar::getRegistered('users'); $this->can_approve = array_filter($roles, function($role) use ($allowed){ return in_array($role, $allowed); }); } public function getApprovers():array { return $this->can_approve; } public function canApprove(string $role):bool { return ($this->term_approval) && in_array($role, $this->can_approve); } public function setCanSeeForum(array $roles):void { $allowed = Registrar::getRegistered('users'); $this->member_only = array_filter($roles, function($role) use ($allowed){ return in_array($role, $allowed); }); } public function canSeeForum(string $role):bool { return $this->forum && (empty($this->member_only) || in_array($role, $this->member_only)); } }